V QUASU 39 („Přidání metod k _SCREEN“) jsem psal o tom, jak je možné zajistit volání metody Resize všech formulářů při výskytu událsoti Resize hlavního okna VFP. Ale tento způsob již ve VFP 8 nefunguje *). Neklesejme však na mysli! Ve VFP 8 máme k dispozici nový příkaz BINDEVENT, pomocí kterého můžeme zařídit, aby se při výskytu určité metody automaticky volala i nějaká metoda jiného objektu, takže pro zajištění automatického Resize formuláře při změně velikosti hlavního okna VFP stačí.

PUBLIC oForm
oForm = CREATEOBJECT("FooForm")
oForm.Visible = .T.

BINDEVENT(_SCREEN, "Resize", oForm, "ScrResize")

DEFINE Class FooForm as Form
   AutoCenter = .T.
   nKoefT = 0
   nKoefL = 0
   nKoefW = 0
   nKoefH = 0

   PROCEDURE Init
      This.nKoefT = This.Top/_Screen.Height
      This.nKoefH = This.Height/_Screen.Height
      This.nKoefL = This.Left/_Screen.Width
      This.nKoefW = This.Width/_Screen.Width
   ENDPROC

   PROCEDURE ScrResize
      This.Top = This.nKoefT*_Screen.Height
      This.Height = This.nKoefH*_Screen.Height
      This.Left = This.nKoefL*_Screen.Width
      This.Width = This.nKoefW*_Screen.Width

*      This.Move(This.nKoefL*_Screen.Width,This.nKoefT*_Screen.Height,;
                 This.nKoefW*_Screen.Width,This.nKoefH*_Screen.Height)
   ENDPROC

ENDDEFINE

Ale tím rozhodně nejsou možnosti tohoto příkazu vyčerpány. Jak často jsme třeba dříve v gridu v textboxech všech sloupců volali metodu celého gridu. Ve verzi 8 už to samozřejmně de zařídit pomocí podtříd vytvořených z třídy Column. Ale tento postup stejně nelze použít, pokud nastavíte ColumnCount=-1.
A tady můžeme zase využít příkaz BINDEVENT. Podívejte se na dále uvedený program. Příkaz BINDEVENT použijeme v Initu na to, abychom zajistili automatické volání nových metod na úrovni gridu (ColumnKeyPress a ColumRightClick) při výskytu událostí KeyPress a RightClick pro jednotlivé textboxy v gridu.

LOCAL I
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 Grid1.Init
      LOCAL loColumn
      FOR EACH loColumn IN This.Columns
          BINDEVENT(loColumn.Text1, "KeyPress", This, "ColumnKeyPress")
          BINDEVENT(loColumn.Text1, "RightClick", This, "ColumnRightClick")
      ENDFOR
   ENDPROC

   PROCEDURE Grid1.ColumnRightClick
      LOCAL laEvents[1]
      AEVENTS(laEvents,0)
      WAIT WINDOW ;
           laEvents[1].Parent.Header1.Caption+": "+;
           laEvents[1].Name+".RightClick() --> "+;
           This.Name+".RightClick()" NOWAIT
   ENDPROC

   PROCEDURE Grid1.ColumnKeyPress
      LPARAMETERS nKeyCode, nShiftAltCtrl
      LOCAL laEvents[1]
      AEVENTS(laEvents,0)
      WAIT WINDOW ;
           laEvents[1].Parent.Header1.Caption+": "+;
           laEvents[1].Name+".KeyPress() --> "+;
           This.Name+".KeyPress() "+;
           TRAN(nKeyCode)+"/"+TRAN(nShiftAltCtrl) NOWAIT
   ENDPROC
ENDDEFINE

Program by šel samozřejmně podstatně vylepšit (předpokládáme pouze textboxy se jménem Text1, mohli bychom připojit i kliknutí na hlavičku sloupce,…), ale myslím si, že jsem prostor vymezený pro můj článek vyčerpal.

A to je vše. Mějte se krásně
Milan Kosina, kosina@vol.cz

* Pozn. přepis.: Přesněji po aplikování SP 1.