Einzelnen Beitrag anzeigen

Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Methodenaufruf über Adresse

  Alt 29. Sep 2009, 18:45
Hallo ihr zwei,

danke für Eure Antworten und Vorschläge.
Wie Dirk es im Post 2 gesagt hat, habe ich es mit der Übergabe
von den kompletten Instanzen versucht - und mittlerweile klappt es
auch.

Delphi-Quellcode:
unit UMVCPattern;

interface
uses
  Contnrs,classes;

type
  TDataUser = class;

  TDataContainer = class(TThread)
    protected
      FDataUsers : TObjectList;
    public
      constructor Create;
      destructor Destroy; override;
      procedure attachDataUser(dataUser: TDataUser);
      procedure detachDataUser(dataUser: TDataUser);
      procedure updateDataUsers;
  end;

  TDataUser = class(TObject)
    protected
      FDataContainer : TDataContainer;
    public
      procedure attachTo(dataContainer: TDataContainer);
      procedure detachFrom(dataContainer: TDataContainer);
      procedure update; virtual; abstract;
  end;

implementation

  constructor TDataContainer.Create;
  begin
    inherited create(false);
    FDataUsers := TObjectList.create(false);
  end;

  destructor TDataContainer.Destroy;
  begin
    FDataUsers.Free;
    inherited destroy;
  end;

  procedure TDataContainer.attachDataUser(dataUser: TDataUser);
  begin
    if FDataUsers.IndexOf(dataUser) = -1 then
      FDataUsers.Add(dataUser);
  end;

  procedure TDataContainer.detachDataUser(dataUser: TDataUser);
  begin
    FDataUsers.Remove(dataUser);
  end;

  procedure TDataContainer.updateDataUsers;
  var
    i: Byte;
  begin
    for i:=0 to FDataUsers.Count -1 do
      begin
        (FDataUsers.Items[i] as TDataUser).update;
      end;
  end;


  procedure TDataUser.attachTo(dataContainer: TDataContainer);
  begin
    FDataContainer := dataContainer;
    FDataContainer.attachDataUser(self);
  end;

  procedure TDataUser.detachFrom(dataContainer: TDataContainer);
  begin
    FDataContainer := dataContainer;
    FDataContainer.detachDataUser(self);
    FDataContainer := nil;
  end;

end.
Da ich in der Ableitung von TDataContainer auch noch TTHread
brauchte musste ich TDataContainer von TThread ableiten.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat