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