Einzelnen Beitrag anzeigen

HeinerGrimm

Registriert seit: 13. Sep 2004
5 Beiträge
 
#1

Prozeduren(-pointer) von Instanzen einer Class unterscheiden

  Alt 15. Nov 2004, 19:34
Hallo alle zusammen,

es geht um ein MainForm (TMainForm), mit dem beliebig viele SubForms (TSubForm) erzeugt werden können. Jedes erzeugte Subform übergibt dem unten definierten TTestObj (in einer DLL) die Prozedur Test(per AddProc). Diese wird in einer Liste (ProcList) gespeichert. Per CallProcs (nur zum Testen, später soll auf Ereignisse reagiert werden) werden alle gespeicherten Prozeduren aufgerufen. Beim Schließen eines SubForm soll per DelProc die betr. Prozedur wieder aus der Liste entfernt werden, damit es keine Zugriffsverletzung beim nächsten CallProcs gibt.

Funzt auch ganz schön, nur: In DelProc klappt offenbar die Unterscheidung zwischen den Prozeduren aus Instanzen der gleichen Klasse (hier TSubForm) nicht, so dass alle zu den existierenden TSubForm-Instanzen zeigenden Prozeduren aus der Liste gelöscht werden. Danach reagieren die verbliebenen TSubForm-Instanzen nicht mehr auf CallProcs.

Die Prozeduren anderer Instanzen (hier TMainForm) bleiben erhalten.

Die naheliegende Lösung, AddProc zu einer Funktion zu machen, die dem betr. Form eine eindeutige ID zurückgibt, die dann bei DelProc statt der prozedur übergeben wird, soll möglichst nicht verwendet werden (frage mich bitte keiner, warum, ich weiß es auch nicht).

Gibt es eine Lösung, bei der wie gehabt nur Prozeduren übergeben werden, in DelProc jedoch nur die "richtige" gelöscht wird?

Im Voraus schon mal vielen Dank für eure Tipps!

Grüße Heiner



Die DLL-Unit auszugsweise:

Delphi-Quellcode:
Type

  TProcRec = Record
    Proc: TTestProc;
  end;

  PProcRec = ^TProcRec;

  TTestObj = Class

  Private
    ProcList: TList;
    A: Integer;
  Public
    Procedure AddProc(Proc: TTestProc);
    Procedure DelProc(Proc: TTestProc);
    Procedure CallProcs;
    Constructor Create;
    Destructor Destroy; Override;
  End; // TTestObj

Var
  TestObj: TTestObj;


procedure TTestObj.AddProc(Proc: TTestProc);
Var
  ProcR: PProcRec;
begin
  New(ProcR);
  ProcR^.Proc := Proc;

  ProcList.Add(ProcR);
end;


procedure TTestObj.DelProc(Proc: TTestProc);
Var
  I: Integer;
  Pr, DelPr: TTestProc;
  PrP, DelPrP: PTestProc;
  Ptr, DelPtr: Pointer;
begin
  I := ProcList.Count - 1;

  While (I >= 0) do begin
    Pr := TProcRec(ProcList.Items[I]^).Proc;
    PrP := @Pr;
    Ptr := @PrP;
    DelPr := Proc;
    DelPrP := @DelPr;
    DelPtr := @DelPrP;
    If (Ptr = DelPtr) then begin
      ProcList.Delete(I); // Item wird entfernt.
    end;
    Dec(I);
  end;
end;


procedure TTestObj.CallProcs;
Var
  I: Integer;
  ProcR: TProcRec;
  Proc: TTestProc;
begin
  A := A + 1000000;

  For I := 0 to ProcList.Count - 1 do begin
    ProcR := TProcRec(ProcList.Items[I]^);
    Proc := ProcR.Proc;
    Proc(A + I, ProcList.Count);
  end;
end;
[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat