VFP umožňuje při návrhu formuláře nebo třídy nastavit vlastnosti hodnotou, ale i výrazem. Toto lze využít pro dynamické určení pozice a velikosti objektů vůči objektu ve kterém se nacházejí (Parent object - dále jen PO).
* Zjištění PO vybraného objektu LOCAL loParent LOCAL ARRAY laObj(1) && dimenzování pomocné matice IF ASELOBJ(laObj,1)=0 RETURN ENDIF * Nyní musím zjistit nejvýše postavený objekt * (není to tak docela pravda, neboť v režimu návrhu je vždy na vrcholu objektové hierarchie objekt třídy FormSet) * Pokud je předaný objekt formulář IF UPPER(laObj(1).BaseClass)=="FORM" ELSE loParent=laObj(1) * Nyní pojedu po objektové hierarchi tak dlouho, až narazím na formulář DO WHILE ! UPPER(loParent.BaseClass)=="FORM" loParent=loParent.Parent ENDDO * Pokud má formulář jeden objekt a popis formuláře souhlasí s názvem třídy jediného objektu * pak vrať jediný objekt (jde o třídu) jinak vrať přímo formulář laObj(1)=IIF(loParent.ControlCount=1 AND loParent.Caption==loParent.Controls(1).Class,; loParent.Controls(1),loParent) ENDIF * Nyní když znám "nejvýše postavený" objekt, otestuju zda patří mezi konteinerové objekty IF !INLIST(UPPER(laObj(1).BaseClass),"FORM","CONTAINER","PAGE","PAGEFRAME","OPTIONGROUP","COMMANDGROUP") RETURN ENDIF * Nyní můžu projet celou objektovou hierarchií a provést změny =ResizeContainerObject(laObj(1)) RETURN PROCEDURE ResizeContainerObject(loCont) * @loCont - Odkaz na konteiner * Nyní budu probíhat vnořené objekty a měnit jejich polohu a velikost v závislosti na vlastnostech Left,Top,Width,Height LOCAL luLeft,luTop,luWidth,luHeight,lii,liCount,loObj,; llLeft,llTop,llWidth,llHeight,lcBaseClass * Velikost konteineru lcBaseClass=UPPER(loCont.BaseClass) * form-controls-controlcount: container-controls-controlcount: page-controls-controlcount: * pageframe-pages-pagecount: optiongoup-buttons-buttoncount: commandgoup-buttons-buttoncount: liCount=IIF(lcBaseClass=="FORM" OR lcBaseClass=="CONTAINER" OR lcBaseClass=="PAGE",loCont.ControlCount,; IIF(lcBaseClass=="OPTIONGROUP" OR lcBaseClass=="COMMANDGROUP",loCont.ButtonCount,loCont.PageCount)) FOR lii=1 TO liCount * Zkratka na objekt loObj=IIF(lcBaseClass=="FORM" OR lcBaseClass=="CONTAINER" OR lcBaseClass=="PAGE",loCont.Controls(lii),; IIF(lcBaseClass=="OPTIONGROUP" OR lcBaseClass=="COMMANDGROUP",loCont.Buttons(lii),loCont.Pages(lii))) IF !UPPER(loObj.BaseClass)=="PAGE" * Získej textové prezentace pozic a velikosti objektů luLeft=loObj.ReadExpression("Left") luTop=loObj.ReadExpression("Top") luWidth=loObj.ReadExpression("Width") luHeight=loObj.ReadExpression("Height") * Nyní zjisti, které vlastnosti jsou dynamické llLeft=!EMPTY(luLeft) llTop=!EMPTY(luTop) llWidth=!EMPTY(luWidth) llHeight=!EMPTY(luHeight) * Proveď zpět zápis hodnot loObj.WriteExpression("Left",IIF(llLeft,luLeft,LTRIM(STR(loObj.Left)))) loObj.WriteExpression("Top",IIF(llTop,luTop,LTRIM(STR(loObj.Top)))) loObj.WriteExpression("Width",IIF(llWidth,luWidth,LTRIM(STR(loObj.Width)))) loObj.WriteExpression("Height",IIF(llHeight,luHeight,LTRIM(STR(loObj.Height)))) ENDIF * Pokud je objekt konteinerová třída IF INLIST(UPPER(loObj.BaseClass),"FORM","CONTAINER","PAGE","PAGEFRAME","OPTIONGROUP","COMMANDGROUP") =ResizeContainerObject(@loObj) && Pak to zavolej ENDIF NEXT RETURN
SET PROCEDURE TO ires.prg && Připojení PRG souboru iRres=CREATEOBJECT("_tmrIRes","iRres") && Vytvoření objektu, třída sama zajistí vytvoření PUBLIC proměnné * A to je vše. * Defaultně je to nastaveno automatické vyvolání za 1 vteřinu. * Pro manuální vyvolání se nejdříve musí nastavit rychlé klávesy.
IRes.SetMode(0) && Manuální mód IRes.SetMode(1) && Automatický mód IRes.Interval=5000 && Nastavení intervalu pro automatický mód
IRes.SetKey_Global("ALT+G") && Nastavení kombinace kláves pro celý formulář/třídu IRes.SetKey_Current("ALT+C") && Nastavení kombinace kláves pro vybraný konteinerový objekt IRes.ClearKey_Global() && Zrušení kombinace kláves pro celý formulář/třídu IRes.ClearKey_Current() && Zrušení kombinace kláves pro vybraný konteinerový objekt
IRes.GlobalResize() && Vyvolání změn pro celý formulář/třídu IRes.CurrentResize() && Vyvolání změn pro vybraný konteinerový objekt