AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Interface um Componenten-Properties zu verallgemeinern?
Thema durchsuchen
Ansicht
Themen-Optionen

Interface um Componenten-Properties zu verallgemeinern?

Ein Thema von Leuselator · begonnen am 7. Jan 2004 · letzter Beitrag vom 8. Jan 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#1

Interface um Componenten-Properties zu verallgemeinern?

  Alt 7. Jan 2004, 23:36
Nach dem Anlesen der Links aus diesem Thread kommt mir nun die Idee, Interfaces zu benutzen, um die Properties meiner eigenen Komponenten leichter handhabbar zu machen. Also dachte ich:
Delphi-Quellcode:
type
  ILsAssociate = Interface
    ['{9D77B5ED-5C4D-4725-BFC6-3089D57F218C}']
    function GetAsso: TLsParent;
    procedure SetAsso(const Value: TLsParent);
    property Associate: TWincontrol read GetAsso write SetAsso;
  end;

  TLsDummy = class(TCustomControl,ILsAssociate)
  private
    FAssociate : TWincontrol;
  protected
    procedure SetAsso(const Value: TWincontrol ); // implem. für Interface
    function GetAsso : TWincontrol; // dto.
    ...
  end;

  TLsDummyUser = Class(TPanel)
  private
    FEdit : TEdit;
    FDummy : TLsDummy;
  protected
  public
    constructor Create(AOwner : TComponent); override;
  published
  end;

implementation

TLsDummyUser.Create(AOwner : TControl);
begin
  inherited;
  FEdit := TEdit.Create(self);
  FDummy := TLsDummy.Create(self);
  FDummy.Associate := FEdit; // <--- und genau das macht er nicht
  ...
end;
hmm - irgendwie schnuckt das also nicht so - wer kann mich erleuchten?
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 7. Jan 2004, 23:44
Versuche mal folgende Änderung:

Code:
[...]
  TLsDummyUser = Class(TPanel)
  private
    FEdit : TEdit;
    FDummy : [color=#ff0000]ILsAssociate[/color];
  protected
  public
    constructor Create(AOwner : TComponent); override;
  published
  end;
[...]
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 7. Jan 2004, 23:52
Leider bringt mich das in teufels Küche ( funktioniert trotzdem nicht) weil
1. er das Property Associate immer noch nicht kennen mag
2. Ich mit dem Objekt TLsDummy 'ne Menge so Objekt-Sachen veranstalte (z.B. WndProc von TEdit capturen etc.) und (jetzt kommt Halbwissen ein einmal zum Interface gewordenes Object ja nicht wieder zum Object gemacht werden darf?
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#4

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 7. Jan 2004, 23:55
Zitat von Leuselator:
1. er das Property Associate immer noch nicht kennen mag
Das verwundert mich jetzt - aber es ist zu spät, Delphi ist schon aus

Zitat von Leuselator:
ein einmal zum Interface gewordenes Object ja nicht wieder zum Object gemacht werden darf?
Nicht ganz korrekt. Es kann aber zu Komplikationen kommen, wenn Du die letzte Referenz auf das Interface verlierst (Stichwort: automatische Refernzähler)

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#5

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 7. Jan 2004, 23:59
Noch einen Fehler gefunden

Code:
  ILsAssociate = Interface
    ['{9D77B5ED-5C4D-4725-BFC6-3089D57F218C}']
    function GetAsso: TWinControl;
    procedure SetAsso(const Value: TWinControl);
    property Associate: [color=#ff0000]TWincontrol[/color] read GetAsso write SetAsso;
  end;
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

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

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 8. Jan 2004, 08:52
Moin Leuselator,
versuche es mal mit:

1. ILsAssociate (FDummy).Associate := FEdit;

2. (FDummy as ILsAssociate ).Associate:=FEdit;
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#7

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 8. Jan 2004, 09:11
@Jens: Das geht natürlich - nur ist dann der ganze denkbare Vorteil dahin - hoffte ja eben die vom Interface geerbten Properties wie ganz normal in der Komponente deklarierte verwenden können (z.B. auch im OI) und nur die jeweiligen Set- und Get-Methoden in der jew. Komponente deklarieren zu müssen.

Jemand mit Ideen/Erläuterungen dazu?

Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

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

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 8. Jan 2004, 09:34
Hallo Leuselator,
ich bin mir nicht sicher was Du genau erreichen möchtest.
Aber der folgende Code wird von meinem D5 geschluckt.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  extctrls, stdctrls;

type
  ILsAssociate = Interface
    ['{9D77B5ED-5C4D-4725-BFC6-3089D57F218C}']
    function GetAsso: TWincontrol;
    procedure SetAsso(const Value: TWincontrol);
    property Associate: TWincontrol read GetAsso write SetAsso;
  end;

  TLsDummy = class(TCustomControl,ILsAssociate)
  private
    FAssociate : TWincontrol;
  protected
    procedure SetAsso(const Value: TWincontrol ); // implem. für Interface
    function GetAsso : TWincontrol; // dto.
  end;

  TLsDummyUser = Class(TPanel)
  private
    FEdit : TEdit;
    FDummy : ILsAssociate;
  protected
  public
    constructor Create(AOwner : TComponent); override;
  published
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FDummySUer : TLsDummyUser;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TLsDummy }

function TLsDummy.GetAsso: TWincontrol;
begin
  Result:=FAssociate;
end;

procedure TLsDummy.SetAsso(const Value: TWincontrol);
begin
  FAssociate:=Value;
end;

{ TLsDummyUser }

constructor TLsDummyUser.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEdit:=TEdit.Create(Self);
  FDummy:= TLsDummy.Create(Self);
  FDummy.Associate:=FEdit;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDummySUer:=TLsDummyUser.Create(self);
  FDummySUer.Parent:=Self;
end;

end.
Hier ist FDummy als ILsAssociate deklariert.

Delphi-Quellcode:
TLsDummyUser = Class(TPanel)
  private
    FEdit : TEdit;
    FDummy : ILsAssociate;
  protected
  public
    constructor Create(AOwner : TComponent); override;
  published
  end;
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#9

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 8. Jan 2004, 09:53
Ich muß erstmal 'ne Mütze Schlaf nehmen, vorab aber noch das:

Ich meine, das im DummyUser nicht als ILsAssociate deklarieren zu können, da ich innerhalb des DummyUser an eine ganze Reihe von Prozeduren und Eigenschaften des Dummy heranmuß, die mit dem Interface nichts zu tun haben und dort auch nicht reinkönnen. (?!)

Was ich eigentlich vorhabe: Ich habe ein ziemlich umfangreiches Package mit eigenen Komponenten.
Dort habe ich mir nun eine herausgegriffen und ein Property vom Typ TWinControl durch ein Interface ersetzen wollen. In der gleichen Unit sind ein ganzer Sack von zusammengesetzten Komponenten enthalten, die von genau dieser Komponente kräftigen Gebrauch machen. Und in deren Create's setze ich dann diese nunmehr umgewandelte Eigenschaft. Wenn ich also nun die Sache so angehe, wie im 1. Post gezeigt, so läßt sich das Package nicht mehr compilieren, da der Compiler die nun vom Interface geerbte Eigenschaft in den Konstruktoren der anderen Klassen, die von der umgewandelten Komponente gebrauch machen wollen, nicht mehr kennt.

Der Vorteil wäre, dass ich bei sich ähnlichen Komponenten, mit ähnlichen Eigenschaften aber verschiedenen Vorfahren, in Komposit-Komponenten, die ihrerseits all diese ähnlichen Komponenten verwenden Bearbeitungsroutinen wie:
Delphi-Quellcode:
procedure VerpassMal(DemDingHier : ILsAssociate; DieEigenschaft : TWincontrol);
begin
  DemDingHier.Associate := DieEigenschaft;
end;
verwenden könnte (ohne ewiges abgefrage nach Klassentyp etc.);
Und das wär dann wirklich eine enorme Arbeitsersparnis für mich.
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#10

Re: Interface um Componenten-Properties zu verallgemeinern?

  Alt 8. Jan 2004, 10:42
Hallo Leuselator,

Interface-Properties können nicht im OI angezeigt werden. Darüber hinaus würdest uU Probleme mit der impliziten Referenzzählung bekommen, wenn Du Aggregationen oder Kompositionen herstellen möchtest.
Ein Beispiel: Es ist zwar folgendes möglich
Delphi-Quellcode:
type
  TMyClass = class
  private
    FAggregate: TMyAggregatedClass;
    function GetAggregate: IMyAggregate;
  public
    property Aggregate: IMyAggregate
      read GetAggregate;
  end;

function TMyClass.GetAggregate: IMyAggregate;
begin
  Result:= FAggregate as IMyAggregate; //as is optional
end;
Achtung: Sollte TMyAggregatedClass von TInterfacedObject oder einer ähnlichen Klasse mit automatischen Destructoraufruf bei RefCount==0 geerbt worden sein, ist dieser Zugriff durch einen Zusätzlichen Aufruf von _AddRef bzw. _Release im Constructor/Destructor von TMyClass zu "sichern", weil ein Klient mit Code dieser Art
Delphi-Quellcode:
myAggregate:= myObject.Aggregate;
myAggregate:= nil; //implicit call of myAggregate._Release
uU das Objekt TMyClass.FAggregate freigibt und so eine ungültige Invariante von TMyClass provoziert...

Eine Setter, wie Du ihn zu wünschen scheinst, also
Delphi-Quellcode:
type
  TMyClass = class
  //..
    procedure SetAggregate(const AnAggregate: IMyAggregate);
ist schon vom Ansatz her sinnlos, wenn Du auf spezielle Methoden von konkreten Klassen (hier: TMyAggregatedClass), die IMyAggregate implementieren, zugreifen möchtest (das zumindest habe ich aus Deinem Posting gelesen).


Falls Dein eigentliches Problem die ständigen Casts bei Klassen sind, könntest Du es mit dem Bei Google suchenvisitor pattern oder dem Bei Google suchenadaptor pattern (GoF) auch ohne Interfaces hinbekommen.

Vielleicht habe ich Dein Problem aber auch nicht ganz verstanden, könntest Du ggf ein gezieltes Bsp skizzieren?
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz