Mřížka, ach ta mřížka - Další príma metody
V minulém díle jsme vytvořili vlastní třídu mřížky.
Tentokrát vytvoříme i několik dalších užitečných metod, neboť ne vše je optimální.
Poznámka:
Vzpomněl jsem si ještě na jeden podraz ve VFP 6.0 (ve VFP 5.0 to funguje bez problemů) při dynamickém generování mřížky.
Předtím, než se budou přiřazovat zdroje dat sloupcům, musí být aktivní oblast, ze které mřížka tahá data.
Pokud tomu tak není, VFP vyhlásí chybu při přiřazení funkce/metody/procedury jako zdroj dat sloupci, popřípadě jsou všechny sloupce Read Only (samotná mřížka nikoliv).
Úprava události AfterRowColChange()
Pohyb po mřížce má jednu velkou "nevýhodu", neboť je vyvolána událost AfterRowColChange(), ale bez možnosti zjištění (nativního) zda došlo pouze ke změně řádku a ne sloupce.
Vytvoříme si vlastní událost AfterRecordChange() a pomocnou vlastnost Recno s hodnotou 0 (jen pro VFP 3.0-6.0).
VFP 3.0 - VFP 6.0
Úprava události
grid::AfterRowColChange() - zdrojový kód:
LPARAMETERS nColIndex
DODEFAULT(nColIndex)
LOCAL liRecno
liRecno = RECNO(This.RecordSource) && Číslo aktuální věty ve zdroji dat
IF This.Recno # liRecno && Pokud se to liší od uložené hodnoty
This.AfterRecordChange() && Pak zavolej metodu
This.Recno = liRecno && A zapiš si novou větu
ENDIF
Jako parametr je přijímána proměnná typu Integer (Index sloupce) a volá se původní kód.
Pak se načte číslo aktuální věty.
Pokud se číslo aktuální věty liší od poslední zapsané hodnoty, vyvolá se událost AfterRecordChange() a číslo aktuální věty se uloží do vlastnosti Recno.
Úprava události
grid::Refresh() - zdrojový kód:
DODEFAULT() && Volání původní metody
LOCAL lcSource
lcSource=This.RecordSource
IF !EMPTY(lcSource) AND USED(lcSource)
This.Recno = RECNO(lcSource) && Schovej si číslo věty
ENDIF
Provede se původní kód.
Pokud je zdroj dat definován a existuje , pak se do vlastnosti Recno zapíše číslo aktuální věty.
VFP 7.0 a vyšší
Úprava události
grid::AfterRowColChange() - zdrojový kód:
LPARAMETERS nColIndex
DODEFAULT(nColIndex)
IF INLIST(This.RolColChange,1,3) && Došlo ke změně řádku
This.AfterRecordChange() && Pak zavolej metodu
ENDIF
Ve VFP 7.0 přibyla nová vlastnost
RowColChange, která nabývá čtyř hodnot:
0 - Beze změny
1 - Změna řádku
2 - Změna sloupce
2 - Změna řádku a sloupce
Obsah této metody se od verze pro VFP 3.0-6.0 liší tím, že se testuje tato vlastnost na hodnoty
1 a
3 a není potřeba vlastnosti
Recno a předefinované metody
Refresh()..
Metoda GetVisibleRow()
Tato metoda vrátí počet viditelných řádku v mřížce.
Metoda
grid::GetVisibleRow() - zdrojový kód:
RETURN INT((This.Height-This.HeaderHeight-;
IIF(INLIST(This.ScrollBars,1,3),16,0))/This.RowHeight)
Metoda SplitLineHitTest()
Tato metoda vrátí, zda je ukazatel myši nad čárou sloužící k oddělení sloupců.
Metoda
grid::SplitLineHitTest() - zdrojový kód:
LPARAM loHeader
* Zjistí, zda se myš (v okamžiku kliknutí na header)
* nachází nad čarou oddělující sloupce
LOCAL liMRow, liMRowMax
liMRow=MCOL(Thisform.Name,3) && Pozice myši
* Pozice sloupce + šířka sloupce převedeno na formulář
liMRowMax=OBJTOCLIENT(loHeader,2)+loHeader.Parent.Width+1
* Pokuď seš mimo
RETURN BETWEEN(liMRow,liMRowMax-5,liMRowMax+5)
Jako parametr je přijímána proměnná typu Objekt (Hlavička sloupce). Zjistí se X souřadnice myši na formulářem. Pomocí funkce OBJTOCLIENT() se převede pravá pozice hlavičky na pozici vůči formuláři. Pomocí RETURNu se vrací zda je pozice myši v rámci daného intervalu daného pravou pozicí hlavičky.