Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Komponenten Properties Events (https://www.delphipraxis.net/198223-komponenten-properties-events.html)

Thomas Feichtner 15. Okt 2018 14:20

Komponenten Properties Events
 
Hallo,

bin gerade dabei meine eigene Komponente zu entwickeln (Ableitung von z.B. TEdit). Dabei möchte ich meine Eigenschaften und Ereignisse kapseln (so wie bei DevExpress). Dazu habe ich mir eine Klasse TTestEditProperties gemacht mit einer Eigenschaft bzw. Ereigniss.
Wenn ich nun diese Klasse in mein Edit einbinde, sehe ich Objektinspektor das Ereignisse nicht, die Eigenschaft jedoch schon.
Woran könnte das liegen.
Bei den DevExpress-Komponenten konnte ich auch keinen entscheidenden Hinweis finden.




Delphi-Quellcode:
unit TestEditUnit;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls;

type

  TTestEditProperties = class(TPersistent)
  private
    FTestEingenschaft: string;
    FOnTestEreigniss: TNotifyEvent;
  public
  published
    property TestEingenschaft: string read FTestEingenschaft write FTestEingenschaft;
    property OnTestEreigniss: TNotifyEvent read FOnTestEreigniss write FOnTestEreigniss;
  end;

  TTestEdit = class(TEdit)
  private
    FSwfEditProperties: TTestEditProperties;
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property TestEditProperties: TTestEditProperties read FSwfEditProperties write FSwfEditProperties;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TTestEdit]);
end;

{ TTestEdit }

constructor TTestEdit.Create(AOwner: TComponent);
begin
  inherited;
  FSwfEditProperties := TTestEditProperties.Create;
end;

destructor TTestEdit.Destroy;
begin
  FreeAndNil(FSwfEditProperties);
  inherited;
end;

end.

Uwe Raabe 15. Okt 2018 14:22

AW: Komponenten Properties Events
 
Zitat:

Zitat von Thomas Feichtner (Beitrag 1415782)
Wenn ich nun diese Klasse in mein Edit einbinde, sehe ich Objektinspektor das Ereignisse nicht,

Auch nicht auf der Ereignisse-Seite?

Thomas Feichtner 15. Okt 2018 14:31

AW: Komponenten Properties Events
 
Nein,
leider nicht.

(Wollte ein Bild anhängen, jedoch sagte er jedes mal, dass er diese Grafikformat (bmp, png, jpg) nicht unterstützt.)

Uwe Raabe 15. Okt 2018 14:36

AW: Komponenten Properties Events
 
Zitat:

Zitat von Thomas Feichtner (Beitrag 1415784)
(Wollte ein Bild anhängen, jedoch sagte er jedes mal, dass er diese Grafikformat (bmp, png, jpg) nicht unterstützt.)

Da gibt es Größenbeschränkungen.

Kannst du mal ein simples Projekt für das Designtime-Package anhängen, bei dem das Problem auftritt?

Thomas Feichtner 15. Okt 2018 14:44

AW: Komponenten Properties Events
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe (Beitrag 1415786)
Zitat:

Zitat von Thomas Feichtner (Beitrag 1415784)
(Wollte ein Bild anhängen, jedoch sagte er jedes mal, dass er diese Grafikformat (bmp, png, jpg) nicht unterstützt.)

Da gibt es Größenbeschränkungen.

Da wäre ich darunter geblieben. Ist ja egal.

Zitat:

Zitat von Uwe Raabe (Beitrag 1415786)
Kannst du mal ein simples Projekt für das Designtime-Package anhängen, bei dem das Problem auftritt?

Hier bitte

Uwe Raabe 15. Okt 2018 15:39

AW: Komponenten Properties Events
 
Offenbar funktionieren bei nested Properties die Events nicht von Haus aus. DevExpress registriert dafür extra ein eigenes Property PropertiesEvents und einen dazu passenden Property Editor TcxEditPropertiesEventEditor, der das implementiert. Sowas müsstest du dann auch machen.

Ehrlich gesagt, ich würde das auf die althergebrachte Methode erledigen und die separate Eigenschaftsklasse weglassen. Es ist halt immer etwas aufwändiger, wenn man gegen das originale Design-Konzept programmiert. Persönlich gefällt mir diese Kapselung auch nicht wirklich, aber das ist sicher Geschmackssache. Vielleicht gibt es in deinem Fall ja auch gute Gründe für dieses Design.

Fritzew 15. Okt 2018 16:03

AW: Komponenten Properties Events
 
Sollte es nich reichen die TTestEditProperties auch zu registrieren?
Delphi-Quellcode:
z.B: RegisterNoIcon([TTestEditProperties]);

Bin leider nicht an einem Delphi Rechner kann es nicht testen

Uwe Raabe 15. Okt 2018 17:08

AW: Komponenten Properties Events
 
Zitat:

Zitat von Fritzew (Beitrag 1415793)
Sollte es nich reichen die TTestEditProperties auch zu registrieren?

Nein, TTestEditProperties ist nicht von TComponent abgeleitet.

Thomas Feichtner 16. Okt 2018 07:51

AW: Komponenten Properties Events
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1415790)
Offenbar funktionieren bei nested Properties die Events nicht von Haus aus. DevExpress registriert dafür extra ein eigenes Property PropertiesEvents und einen dazu passenden Property Editor TcxEditPropertiesEventEditor, der das implementiert. Sowas müsstest du dann auch machen.

Danke für den Tipp.
So habe ich es nun auch gemacht. Und wie es aussieht funktioniert es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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