V některých programech lze v mřížce či jeho ekvivalentech dvojitým kliknutím na rozdělovací čáře sloupců nastavit maximální šířku sloupce pro viditelný text.
Není to zas tak složité, jak to vypadá.
Vlastní kód lze vložit do metody DblClick() objektu Header přímo v programové definici třídy sloupce/hlavičky.
Navíc je udělán tak, aby jej bylo možno ihned použít.
I když od VFP 8.0 je toto chování podporováno nativně, třída Column má vlastnost AllowAutoColumnFit, která toto chování povoluje, jsou pro výpočet šířky textu ignorovány vlastnosti DynamicFontBold, DynamicFontItalic, DynamicFontName a DynamicFontSize jež přímo ovlivňují šířku textu.
Proto je nutné všem objektům vkládáným do sloupce pro zobrazení dat vytvořit novou vlastnost PropAsColumn.
Pokud je hodnota oné vlastnosti .F., pak je zajištěno výchozí chování jinak se respektují vlastnosti Dynamic*
Nejdříve se provede test, zda je ukazatel myši na oddělovací čarou a zda tabulka není prázdná.
IF !This.Parent.Parent.SplitLineHitTest(This)
RETURN
ENDIF
* Pokud tam není ani záznam
IF EOF(This.Parent.Parent.RecordSource)
RETURN && Pak se vrať
ENDIF
Sloupec musí mít povoleno měnit šířku.
loCol=This.Parent && aktivní sloupec
lcSource=loCol.ControlSource && zdroj dat
IF EMPTY(lcSource) OR EMPTY(loCol.CurrentControl);
OR !loCol.Resizable
RETURN
ENDIF
Spočítá se viditelný počet řádků v mřížce.
WITH This.Parent.Parent
SELE (.RecordSource) && Skoč na tabulku
liRow=.GetVisibleRow()
liRelRow=.RelativeRow && Relativní řádek
ENDWITH
Uschování informací o fontu objektu _SCREEN a nastaví se zpětně dle aktivního objektu
loControl=EVAL("loCol."+loCol.CurrentControl)
lcType=TYPE("EVAL(lcSource)")
laFont(1)=_SCREEN.FontName
laFont(2)=_SCREEN.FontSize
laFont(3)=_SCREEN.FontBold
laFont(4)=_SCREEN.FontItalic
laFont(5)=_SCREEN.FontStrikethru
laFont(6)=_SCREEN.FontUnderline
IF !PEMSTATUS(loControl,"PropAsColumn",5) OR ;
PEMSTATUS(loControl,"PropAsColumn",5) AND ;
!loControl.PropAsColumn
_SCREEN.FontName=loControl.FontName
_SCREEN.FontSize=loControl.FontSize
_SCREEN.FontBold=loControl.FontBold
_SCREEN.FontItalic=loControl.FontItalic
_SCREEN.FontStrikethru=loControl.FontStrikethru
_SCREEN.FontUnderline=loControl.FontUnderline
ENDIF
Zapamatuje si aktuální větu a skočí na začátek viditelného obsahu mřížky.
liRecno=RECNO() && Zjisti aktuální větu
SKIP -1*(liRelRow-1) && skoč na začátek viditelného obsahu
liMax=0
Poté se začne procházet jen n viditelných vět.
SCAN NEXT liRow
Pokud se mají respektovat vlastnosti
Dynamic*, pak se pro každou větu musí vyhodnotit příslušné vlastnosti.
IF PEMSTATUS(loControl,"PropAsColumn",5) AND loControl.PropAsColumn
* Nastavení informací o fontu na objektu _Screen dle objektu
_SCREEN.FontName=IIF(EMPTY(loCol.DynamicFontName),;
loCol.FontName,EVAL(loCol.DynamicFontName))
_SCREEN.FontSize=IIF(EMPTY(loCol.DynamicFontSize),;
loCol.FontSize,EVAL(loCol.DynamicFontSize))
_SCREEN.FontBold=IIF(EMPTY(loCol.DynamicFontBold),;
loCol.FontBold,EVAL(loCol.DynamicFontBold))
_SCREEN.FontItalic=IIF(EMPTY(loCol.DynamicFontItalic),;
loCol.FontItalic,EVAL(loCol.DynamicFontItalic))
_SCREEN.FontStrikethru=IIF(EMPTY(loCol.DynamicFontStrikethru),;
loCol.FontStrikethru,EVAL(loCol.DynamicFontStrikethru))
_SCREEN.FontUnderline=IIF(EMPTY(loCol.DynamicFontUnderline),;
loCol.FontUnderline,EVAL(loCol.DynamicFontUnderline))
ENDIF
Vyhodnotí se obsah sloupce a dle typu se přivede na řetězec.
luVal=EVAL(lcSource)
Pomocí funkce
TEXTWIDTH() se spočítá šířka textu + 4 pixely.
liMax=MAX(_SCREEN.TextWidth(IIF(ISNULL(luVal),".NULL.",RTRIM(luVal)))+4,liMax)
ENDSCAN
Obnova původních vlastností objektu _SCREEN.
_SCREEN.FontName=laFont(1)
_SCREEN.FontSize=laFont(2)
_SCREEN.FontBold=laFont(3)
_SCREEN.FontItalic=laFont(4)
_SCREEN.FontStrikethru=laFont(5)
_SCREEN.FontUnderline=laFont(6)
Po skončení smyčky se nastaví nová šířka sloupce (pokud není nulová) a skočí na původní větu.
IF liMax>0 && pokud tam něco je
loCol.Width=liMax && pak nastav novou šířku
ENDIF
GO liRecno && skoč na původní větu