AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Prozeduren(-pointer) von Instanzen einer Class unterscheiden

Prozeduren(-pointer) von Instanzen einer Class unterscheiden

Ein Thema von HeinerGrimm · begonnen am 15. Nov 2004 · letzter Beitrag vom 15. Nov 2004
 
HeinerGrimm

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

Prozeduren(-pointer) von Instanzen einer Class unterscheiden

  Alt 15. Nov 2004, 18: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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz