Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

CallBack lässt Object vergessen

  Alt 12. Nov 2006, 11:24
Hallo!

Ich habe ein Object, das von mehreren Objecten geändert werden kann. Es speichert zentral Informationen ab. Wenn die Informationen von einem Object geändert wurden, sollen diese Änderungen auch an die anderen Objekte weitergegeben werden. Dazu wird von den Objekten eine Callback-Funktion aufgerufen, und die Objekte (z.b. Object A) laden sich die Informationen von dem Daten-Object (Object B) neu.

Was muss ich anders machen?

Vielen Dank für baldige Antworten!


Bei allen Objecten A wurde das FObjectB (über eine Property) nach dem Erstellen zugewiesen.

Folgender Code bei Object A:
Delphi-Quellcode:
FObjectB: TObjectB;
FChangeCausedbyObjectB: Procedure of Object;
FChangeCausedbyObjectB:= ChangeCausedbyObjectB; // wird bei .Create zugewiesen
property ObjectB: TObjectB read FObjectB write SetObjectB;

procedure ObjectA.SetFObjectB(_ObjectB: TObjectB);
begin
  // Das ObjectB wird zugewiesen
  FObjectB:= _ObjectB;
  // Ich kann nun gültige Informationen aus Object B auslesen. Soweit alles OK.
  // Die Funktion ObjectA.ChangeCausedbyObjectB auslösen lassen, wenn sich bei ObjectB etwas ändert.
  FObjectB.CallBackList.Add(@FChangeCausedbyObjectB);
end;

procedure ObjectA.ChangeCausedbyObjectB;
begin
  // Hier tritt nun das Problem auf, wenn diese Prozedur von ObjectB aufgerufen wird
  if assigned(FObjectB) then begin // FObjectB ist zugewiesen
    if FObjectB.InheritsFrom(TFObjectB) then begin // trifft nicht zu oder löst sogar Exception aus <-- PROBLEM
      FdtpAusblendDatum.DateTime := floor(FObjectB.User_EndDate);
    end;
  end;
end;
Folgender Code bei Object B:
Delphi-Quellcode:
CallBackList: TList; // wurde bei .Create miterschaffen

procedure ObjectB.Irgendwas;
var
  i: integer;
  CBProc: Procedure of Object;
begin
  for i := 0 to CallBackList.Count - 1 do begin // alle ObjekteA benachrichtigen
    if assigned(CallBackList.Items[i]) then begin
      try
        @CBProc := CallBackList.Items[i]; // Pointer auslesen
        CBProc; // d.h. alle Prozeduren aufrufen
      except
        on e: exception do begin
        end;
      end;
    end;
  end;
end;
  Mit Zitat antworten Zitat