Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozeduren(-pointer) von Instanzen einer Class unterscheiden (https://www.delphipraxis.net/33973-prozeduren-pointer-von-instanzen-einer-class-unterscheiden.html)

HeinerGrimm 15. Nov 2004 18:34


Prozeduren(-pointer) von Instanzen einer Class unterscheiden
 
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]

HeinerGrimm 15. Nov 2004 18:38

Re: Prozeduren(-pointer) von Instanzen einer Class untersche
 
Pardon, in einer der Prozeduren befand sich noch Müll aus einem gescheiterten Versuch. Hier die Prozedur, wie sie gedacht war:

Delphi-Quellcode:
procedure TTestObj.DelProc(Proc: TTestProc);
Var
  I: Integer;
  Pr: TTestProc;
begin
  I := ProcList.Count - 1;

  While (I >= 0) do begin
    Pr := TProcRec(ProcList.Items[I]^).Proc;
    If (Pr = Proc) then begin
      ProcList.Delete(I); // Item wird entfernt.
    end;
    Dec(I);
  end;
end;
[edit=Christian Seehase]Delphi-Tags gesetzt. BBCode aktivieren könnte hierfür nicht schaden. Mfg, Christian Seehase[/edit]

Neutral General 15. Nov 2004 19:03

Re: Prozeduren(-pointer) von Instanzen einer Class untersche
 
Willkommen in der Delphi-Praxis :party:

Bitte Delphi-tags benutzen :dp:
Dadurch ist der Code besser lesbar


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz