Hallo,
die Lösung mit den Interfaces ist sehr interessant. Das Edit, Memo usw. habe ich mal als Parent des Interfaces
betrachtet und in die Interfacedeklaration gezogen. Ebenso eine neue Eigenschaft (Size) über das Interface
angegeben. Wenn die verschiedenen Klassen eine gemeinsane property wie Text oder so haben kann man die
Eigenschaft ebenfalls ins Interface schieben. Dann der Zugriff auf diese Eigenschaft direkt über das Interface erfolgen.
Delphi-Quellcode:
var
MyEdit : IMyInterface; // Als IMyInterface deklariert !!!
...
MyEdit:=TMyEdit.Create(Owner);
...
MyEdit.Text:='Juhu';
Delphi-Quellcode:
unit Unit2;
interface
uses SysUtils, classes, StdCtrls;
Type
IMyInterface=interface(IInterface)
['
{D3A9F1B4-E566-4568-A3DC-9FDA533452E0}']
function GetSize : Integer;
procedure SetSize(Value : Integer);
function GetParent : TObject;
procedure SetParent(Value : TObject);
function GetText :
String;
procedure SetText(Value :
String);
property Parent : TObject
read GetParent
write SetParent;
property Size : Integer
read GetSize
write SetSize;
property Text :
String read GetText
write SetText;
end;
//Helperklasse für das Interface. Diese weiss, was zu tun ist, wenn die Methoden gerufen werden
TMyIntfHelper=Class(TObject)
private
FParent : TObject;
FSize : Integer;
public
function GetSize : Integer;
procedure SetSize(Value : Integer);
function GetParent : TObject;
procedure SetParent(Value : TObject);
function GetText :
String;
procedure SetText(Value :
String);
property Parent : TObject
read GetParent
write SetParent;
property Size : Integer
read GetSize
write SetSize;
property Text :
String read GetText
write SetText;
end;
TMyEdit =
class(TEdit,IMyInterface)
private
FHelper: TMyIntfHelper;
public
constructor Create(AOwner : TComponent);
override;
destructor Destroy;
override;
property MyHelper: TMyIntfHelper
Read FHelper
implements IMyInterface;
end;
implementation
{ TMyEdit }
constructor TMyEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FHelper:=TMyIntfHelper.Create;
FHelper.Parent:=Self;
end;
destructor TMyEdit.Destroy;
begin
FHelper.Free;
inherited Destroy;
end;
{ TMyIntfHelper }
function TMyIntfHelper.GetParent: TObject;
begin
Result:=FParent;
end;
function TMyIntfHelper.GetSize: Integer;
begin
Result:=FSize;
end;
function TMyIntfHelper.GetText:
String;
begin
If FParent
is TEdit
then // müsste entsprechend auf TMemo oder TStrings etc erweitert werden. evt kann man auch über RTTI feststellen ob die Eigenschaft vorhanden ist
Result:=(FParent
as TEdit).Text
else
Result:='
';
end;
procedure TMyIntfHelper.SetParent(Value: TObject);
begin
FParent:=Value;
end;
procedure TMyIntfHelper.SetSize(Value: Integer);
begin
FSize:=Value;
end;
procedure TMyIntfHelper.SetText(Value:
String);
begin
If FParent
is TEdit
then
(FParent
as TEdit).Text:=Value;
end;
end.
@ Sidorion: Coole Lösung !!!
@shmia: Dein Vorschlag mit MVC Pattern funktioniert doch nur wenn man Herr der Objekthiearchie ist. Was ist wenn Du Klassen verwenden musst deren Sourcecode Du nicht hast?