HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Események törlése és visszaállítása egy lépésben


Példaprogram letöltése

9747 bájt

Bizonyos esetekben szükség van arra egy programban, hogy egy-egy komponens eseményeihez rendelt eseménykezelő eljárásokat átmenetileg töröljünk, vagyis megakadályozzuk az események létrejöttét, majd egy idő után újra engedélyezzük azokat.
Mellékelt példában készítünk egy olyan eljárást, mely képes arra, hogy törölje az összes eseményét egy komponensnek, majd egy másik eljárást, mely visszaállítja az eredeti állapotot és így az események újra működőképesek lesznek.

Kezdjük a törléssel. Ennek megvalósításához készítünk egy olyan ciklust, mely végigmegy az adott objektum összes eseményén és törli azokat, miközben eltárolja a visszaállításhoz szükséges információt.
procedure TForm1.DeleteEvents(obj: TObject);
…
Szükségünk lesz az adott objektum osztály információjára, melyet a ClassInfo függvény szolgáltat PTypeInfo típusban.
  ti:=obj.ClassInfo;
Egy esemény tárolásánál két adat kerül rögzítésre, melyet egy TMethod struktúra tárol. Az esemény törléséhez egy üres struktúrát kell majd értékül adnunk, így ezt most előállítjuk.
  m.Code:=nil;  m.Data:=nil;
Lekérdezzük, hogy hány eseménye van az adott osztálynak a ciklus készítéséhez.
  count:=GetPropList(ti, [tkMethod], nil);
Le kell foglalnunk egy memória területet, melyre az esemény információk kerülnek.
  GetMem(pl, count*SizeOf(pointer));
  try
Ezeket az információkat a GetPropList szolgáltatja. A ciklusnak majd ezen a memória területen kell végigmennie.
    GetPropList(ti, [tkMethod], pl);
    FList.Clear;
    for i:=0 to count-1 do begin
A ciklusmagban először tároljuk az adott eseményhez tartozó információt egy TStringList-be. Itt a tárolandó sztring az esemény neve lesz, míg hozzárendelünk egy objektumot is, melyben a TMethod struktúra aktuális értéke kerül eltárolásra. Itt megtehetnénk azt is, hogy figyeljük azt, hogy az eseményhez van-e hozzárendelve eseménykezelő, mert ha nincs, akkor felesleges tárolni, de programunk így egyszerűbb lesz és a végeredményt az nem befolyásolja, hogy eltárolunk üres TMethod struktúrákat is.
      FList.AddObject(pl^[i].Name, TMethodClass.Create(GetMethodProp(obj, pl^[i])));
Következő lépésként töröljük az eseményhez esetlegesen hozzárendelt eseménykezelő eljárást, vagyis az adott eseményhez a már létrehozott üres TMethod struktúrát adjuk értékül.
      SetMethodProp(obj, pl^[I], m);
    end;
  finally
    FreeMem(pl);
  end;
end;

A TStringList-ben történő TMethod struktúra tárolásához létre kellett hoznunk egy osztályt, mivel tárolni csak TObject vagy ennek leszármazott objektumát lehet. A létrehozott TMethodClass nevű osztály nem tesz semmi egyebet, mint egy TMethod struktúrát tárol.

Nézzük, most miként állíthatjuk vissza a törölt eseményeket. A módszer szinte teljesen megegyezik az előbbivel, azzal a különbséggel, hogy most az egyes eseményekhez nem üres TMethod-ot adunk értékül, hanem a TStringList-ben tárolt TMethod-ok értékeit.
procedure TForm1.RestoreEvents(obj: TObject);
…
    for i:=0 to count-1 do begin
Először megkeressük a TStringList listában az adott nevű esemény sorszámát.
      ind:=FList.IndexOf(pl^[i].Name);
      if ind<>-1 then begin
A sorszám alapján már ki tudjuk olvasni, hogy melyik objektumban lévő TMethod struktúrát kell értékül adnunk az adott eseménynek.
        SetMethodProp(obj, pl^[i], TMethodClass(FList.Objects[ind]).Method);
      end;
…



Cikksorozat

#IDKategóriaCikk címeSorozat
3916WindowsA javascript nyelv bemutatása1. rész
3946WindowsJavascript változók és operátorok2. rész
3975WindowsKódvezérlés JScript-ben3. rész
4004WindowsFüggvények és objektumok4. rész
4036WindowsFejlett funkciók a JavaScript nyelvben5. rész
4066WindowsFejlett funkciók a JavaScript nyelvben - folytatás6. rész
4116WindowsReguláris kifejezések7. rész
4145WindowsReguláris kifejezések - folytatás8. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 648. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |