Změna způsobu změny pořadí objektů při návrhu formuláře či třídy

VFP umožňuje dvojí způsob změny pořadí objektů během návrhu formuláře či třídy:

Ale, je možné zajistit vyvolání jednoho či druhého způsobu, aniž by člověk musel "jít" do nastavení, provést změnu a potvrdit dialog ?
Následující text ukáže jak na to.
(Bohužel, toto je funkční pouze pro VFP verze 6.0 a vyšší, nižší verze nemají potřebný příkaz pro obnovení nastavení VFP dle Registry)

Celkový postup je:

Zapsání nové hodnoty do Registry

Pro zápis do Registry se používají API funkce RegOpenKeyEx(), RegSetValueEx() a RegCloseKey().
DECLARE INTEGER RegSetValueEx IN ADVAPI32.DLL;
        INTEGER,STRING,INTEGER,INTEGER,STRING,INTEGER

DECLARE INTEGER RegOpenKeyEx in ADVAPI32.DLL INTEGER, STRING,INTEGER,INTEGER,INTEGER @nKeyHandle 
DECLARE INTEGER RegCloseKey in ADVAPI32.DLL INTEGER

* Native Error Codes 
#DEFINE ERROR_SUCCESS  0
* REGAPI Error Codes
#DEFINE REGAPI_Other         -1
#DEFINE REGAPI_SUCCESS       ERROR_SUCCESS
#DEFINE SECURITY_ACCESS_MASK 983103   && SAM value KEY_ALL_ACCESS
#DEFINE REG_SZ                          1 &&  Unicode nul terminated string
#DEFINE HKEY_CURRENT_USER           0x80000001

***************************************************************************************
* Zapíše hodnotu do klíče
***************************************************************************************
PROCEDURE API_RegSetValueEx(liHKEY,lcValue,liType,lcData)
* liHKEY  - Handle klíče
* lcValue - Název hodnoty
* liType  - Typ hodnoty
* lcData  - Data hodnoty

LOCAL liErr,liReserved,liData
liReserved=0
liData=LEN(lcData)

liErr=RegSetValueEx(liHKEY,lcValue,liReserved,liType,lcData,liData)
RETURN IIF(liErr=ERROR_SUCCESS,REGAPI_SUCCESS,REGAPI_Other)

***************************************************************************************
* Otevře daný klíč
***************************************************************************************
PROCEDURE API_RegOpenKeyEx(liHRoot,lcKey,liHKEY)
* liHRoot - ID rootu klíče např: HKEY_CURRENT_USER
* lcKey   - Název klíče (celé cesty) např: "Software\XXXXX"
*@liHKEY  - Sem se vrátí handle klíče
LOCAL liErr
liErr=RegOpenKeyEx(liHRoot,lcKey,0,SECURITY_ACCESS_MASK,@liHKEY)
RETURN IIF(liErr=ERROR_SUCCESS,REGAPI_SUCCESS,REGAPI_Other)


***************************************************************************************
* Uzavře klíč
***************************************************************************************
PROCEDURE API_RegCloseKey(liHKEY)
* liHKEY - Handle klíče
LOCAL liErr
liErr=RegCloseKey(liHKEY)
RETURN IIF(liErr=ERROR_SUCCESS,REGAPI_SUCCESS,REGAPI_Other)

******************************************************************************
* Vlastní nastavení 
******************************************************************************
PROCEDURE TABO_SET(lcSet)
* lcSet - "0": Interactive, "1": By List
LOCAL liHKEY,lcData,lcKey
* V případě VFP 7.0 je místo \6.0\ \7.0\
lcKey="Software\Microsoft\VisualFoxPro\6.0\Options"
liHKEY=0
lcData="  "
* Otevři klíč v Registry
=API_RegOpenKeyEx(HKEY_CURRENT_USER,lcKey,@liHKEY)
* Nastav data hodnoty TabOrdering
=API_RegSetValueEx(liHKEY,"TabOrdering",REG_SZ,lcSet+CHR(0))
* Uzavři klíč
=API_RegCloseKey(liHKEY)

Občerstvení nastavení VFP dle Registry

=SYS(3056,1) && Načti nastavení z Registry

Vyvolání volby "Tab Order"

Volba "Tab Order" nemá systémový název, dá se však zjistit její ID, ale toto ID se dá použít jen málokde. Proto se pro vyvolání volby nedá použít funkce SYS(1500,cSystemItemName, cMenuName), ale musí se vyvolat pomocí klávesových zkratek.
* Pokud je bar zaškrtnut, pak jej odznač
IF MRKBAR("_msm_View",-14063)
   KEYB "{ALT+V},{O}" && Staniž se
ENDIF
KEYB "{ALT+V},{O}" && Staniž se

Kompletní zdrojový kód lze stáhnout zde v poněkud učesanější formě.