Mřížka, ach ta mřížka - vlastnosti MemberClass,MemberClassLibrary
VFP 8.0 má nové vlastnosti MemberClass,MemberClassLibrary, které slouží k identifikaci třídy a umístění v VCX/PRG souboru, když nějaký konteinerový objekt vytváří automaticky své členy.
Týká se to tříd: PageFrame, CommandGroup, OptionGroup Control a Grid Control.
Další podobné vlastnosti (DEClass,DEClassLibrary a HeaderClass,HeaderClassLibrary) slouží k určení třídy DataEnvironmentu formuláře a třídy hlavičky (header) sloupce.
Následující příklad ukazuje použití těchto vlastností u mřížky.
Pozor:
Nelze mít vyplněnou pouze vlastnost MemberClass ale je nutné vyplnit i vlastnost MemberClassLibrary.
Umístění a název souboru se třídou musí být korektní vůči nastavení SET PATH TO
******************************************
* Program: grid_5.prg
******************************************
LOCAL I,lcPath
lcPath=SYS(16,0)
lcPath=LEFT(lcPath,RAT("\",lcPath))
SET PATH TO (lcPath)
SET DEFA TO (lcPath)
CREATE CURSOR Tst (polozka1 I, polozka2 I, polozka I, polozka4 I)
FOR I=1 TO 100
INSERT INTO Tst VALUES (I, I**2, I**3, I**4)
NEXT
GO TOP
PUBLIC oForm
oForm = CREATEOBJECT("FooForm")
oForm.Visible = .T.
DEFINE CLASS FooForm AS FORM
AutoCenter = .T.
Left = 25
Top = 25
Height = _Screen.Height-50
Width = _Screen.Width-50
ADD OBJECT grid1 AS _GRID WITH ;
Left = 10, Top = 10,;
Height = Thisform.Height-20, Width = Thisform.Width-20,;
Name = "Grid1"
PROCEDURE Init
This.Grid1.AddColumn(5)
This.Grid1.Columns(This.Grid1.ColumnCount).ControlSource="polozka1+polozka2"
ENDPROC
ENDDEFINE
DEFINE CLASS _grid AS GRID
MemberClass="_Column"
MemberClassLibrary="grid_5.prg"
PROCEDURE ColumnClick(loColumn,loCurrentControl)
* loColumn - Objektový odkaz na sloupec na kterém došlo k události
* loCurrentControl - Objektový odkaz na aktivní objekt na kterém došlo k události
WAIT WINDOW ;
loColumn.Name+": "+;
loCurrentControl.Name+".Click() --> "+;
This.Name+".ColumnClick()" NOWAIT
ENDPROC
PROCEDURE HeaderClick(loHeader)
* loHeader - Objektový odkaz na sloupec na kterém došlo k události
WAIT WINDOW ;
loHeader.Caption+": "+;
SYS(1272,loHeader)+".Click() --> "+;
This.Name+".HeaderClick()" NOWAIT
ENDPROC
ENDDEFINE
DEFINE CLASS _Column AS COLUMN
HeaderClass="_Header"
HeaderClassLibrary="grid_5.prg"
ADD OBJECT TEXT1 AS TEXTBOX
PROCEDURE Init()
This.SetAll("Visible",.T.)
ENDPROC
PROCEDURE Click()
This.Parent.ColumnClick(This,EVAL("This."+This.CurrentControl))
ENDPROC
PROCEDURE text1.Click()
This.Parent.Click()
ENDPROC
ENDDEFINE
DEFINE CLASS _Header AS HEADER
PROCEDURE Click()
This.Parent.Parent.HeaderClick(This)
ENDPROC
ENDDEFINE
A v čem je ta výhoda?
Při nutnosti použití vlastní třídy sloupce se musela dosud použít metoda AddObject() a specifikovat třídu sloupce.
Metoda AddColumn() se nedala použít neboť se potom vytvořil sloupec dle třídy Column.
Nyní při inicializaci mřížky stačí nastavit vlastnost ColumnCount na mřížce a pak jen nastavit jednotlivé sloupce (zdroj dat, popis, šířku, atd.).
V ukázce je použito přesměrování metody Click() ze sloupce, hlavičky a tetxboxu až na mřížku.
Nejde o plné nahrazení funkce BINDEVENT(), to jsem byl jen líný tuto vymoženost VFP 8.0 použít.