Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

TObjectList als Komponente

  Alt 4. Dez 2007, 08:00
Hi Leute,

ich habe eine spezialisierte Klasse von TObjectList erstellt. Jetzt möchte ich diese als Komponente haben. Bis dato war meine Vorgehensweise immer diese:
Delphi-Quellcode:
type
  TBaseTransactionList = class(TObjectList)
  private
  protected
    function GetItem(Index: Integer): TTransactionObj;
    procedure SetItem(Index: Integer; AObject: TTransactionObj);
  public
    function Add(AObject: TTransactionObj): Integer; virtual;
    function Extract(Item: TTransactionObj): TTransactionObj;
    function Remove(AObject: TTransactionObj): Integer;
    function IndexOf(AObject: TTransactionObj): Integer;
    procedure Insert(Index: Integer; AObject: TTransactionObj);
    function First: TTransactionObj;
    function Last: TTransactionObj;
    property Items[Index: Integer]: TTransactionObj read GetItem write SetItem; default;
  end;

  TTransactionList = class(TBaseTransactionList)
  private
    FBreakTransaction : Boolean; // Flag für Abbruch der Abarbeitung
    FExecuteTransIndex : Integer; // Index der aktuell in der Abarbeitung befindlichen Transaktion
    FExecuteTransObj: TTransactionObj; // Transaction-Object, dass gerade abgearbeitet wird (Execute läuft)
  protected
    function AddNewTransaction(ADevice : TRemoteDevice; APhone : TBasePhoneObj; Action : TActionObj) : Integer;
    procedure TransmitNextTransaction; virtual;
  public
    Constructor Create; reintroduce; virtual;

    function GetTransactionObj(ADevice : TRemoteDevice; APhone : TBasePhoneObj) : TTransactionObj; overload;
    function GetTransactionObj(ADevice : TRemoteDevice; APhoneNumber : String) : TTransactionObj; overload;
    procedure AddAction(ADevice : TRemoteDevice; APhone : TBasePhoneObj; Action : TActionObj);

    procedure BreakTransaction; virtual;
    procedure ExecuteTransaction(APhoneNumber : string); overload; virtual;
    procedure ExecuteTransaction(ATransaction : TTransactionObj); overload; virtual;
    procedure ExecuteTransactions; virtual;
  end;

  TCompTransactionList = class(TComponent)
  private
    FTransactionList : TTransactionList; // Transaktionsliste
  protected
  public
    Constructor Create(AOwner : TComponent); override;
    Destructor Destroy; override;
  published
  end;
Im Constructor der Komponente wird nun meine TransactionList kreiert und im destruktor wieder zerstört. Alle Zugriffe laufen dann über die Componente. Entweder ich mache FTransactionList öffentlich, oder implementiere Alle Methoden von FTransactionList noch einmal in der Componente im Public Teil.
Nun, ich dächte, das könnte man dann aber auch mit Interfaces haben.

Etwa so:
Delphi-Quellcode:
  TCompTransactionList = class(TComponent, ITransactionList)
  private
  protected
  public
    ...........
Nun hab ich mir einiges zu Interfaces durchgelesen. Das war soweit auch verständlich. Leider mach ich mir hier ein paar Sorgen das für meinen konkreten Fall korrekt hinzubekommen. Folgende Probleme und Fragen stellen sich mir:

1. Kann man so einfach eine abgeleitete ObjectList zum Interface machen?
Mein Bsp.:
Delphi-Quellcode:
type
  ITransactionList = interface(IInterface) // abgeleitet von IInterface
  ['{677854F0-525B-4372-9C7A-F87A00A8A117}'] // der GUID des Interface
    function GetTransactionObj(ADevice : TRemoteDevice; APhone : TBasePhoneObj) : TTransactionObj; overload;
    function GetTransactionObj(ADevice : TRemoteDevice; APhoneNumber : String) : TTransactionObj; overload;
    procedure AddAction(ADevice : TRemoteDevice; APhone : TBasePhoneObj; Action : TActionObj);

    procedure BreakTransaction; virtual;
    procedure ExecuteTransaction(APhoneNumber : string); overload; virtual;
    procedure ExecuteTransaction(ATransaction : TTransactionObj); overload; virtual;
    procedure ExecuteTransactions; virtual;
end;
Ich kann mir nicht so richtig vorstellen, dass das reichen soll. Die Basisklasse TObjectList hat da ja noch ne Menge mehr an Methoden und Eigenschaften.

Dann die nächste Frage:

TComponent ist wohl nicht von IInterfacedObject abgeleitet (glaub ich). Damit müßte das nicht so ohne weiteres klappen:
Delphi-Quellcode:
  TCompTransactionList = class(TComponent, ITransactionList)
  private
  protected
  public
    function GetTransactionObj(ADevice : TRemoteDevice; APhone : TBasePhoneObj) : TTransactionObj; overload;
    function GetTransactionObj(ADevice : TRemoteDevice; APhoneNumber : String) : TTransactionObj; overload;
    procedure AddAction(ADevice : TRemoteDevice; APhone : TBasePhoneObj; Action : TActionObj);

    procedure BreakTransaction; virtual;
    procedure ExecuteTransaction(APhoneNumber : string); overload; virtual;
    procedure ExecuteTransaction(ATransaction : TTransactionObj); overload; virtual;
    procedure ExecuteTransactions; virtual;
Tja, wenn mir da einer helfen kann????????


Gruß oki
42
  Mit Zitat antworten Zitat