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]