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.