Einzelnen Beitrag anzeigen

Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#41

Re: Basisklasse und davon abgeleitet drei Standardklassen

  Alt 9. Okt 2007, 19:04
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?
I come from outer space to save the human race
  Mit Zitat antworten Zitat