Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Event von Sub-Objekt als Property anzeigen (https://www.delphipraxis.net/200274-event-von-sub-objekt-als-property-anzeigen.html)

BlueStarHH 5. Apr 2019 13:41

Delphi-Version: 5

Event von Sub-Objekt als Property anzeigen
 
Hallo,

ich habe eine von TComponent abgeleitete TMyComponent erstellt. Diese besitzt ein TMyObject als Property. Wie kann ich nun das Event "OnMyEvent" des TMyObject im Objekt-Inspektor auf der Seite "Ereignisse" anzeigen lassen. Mein Versuch:

Delphi-Quellcode:
TMyObject = class(TObject)
private
  FOnMyEvent: TNotifyEvent;
published
  property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent;
end;

TMyComponent = class(TComponent)
private
  FMyObject: TMyObject;
published
  property MyObject: TMyObject read FMyObject write FMyObject;
end;
Resultat: OnMyEvent wird im Objekt-Inspektor nicht angezeigt.

Delphi.Narium 5. Apr 2019 15:44

AW: Event von Sub-Objekt als Property anzeigen
 
Delphi-Quellcode:
public
statt
Delphi-Quellcode:
published

TBx 5. Apr 2019 19:57

AW: Event von Sub-Objekt als Property anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Schwebte dir da sowas vor:
Anhang 50969

Dann musst du dir ein Package bauen, in dem du deine Komponente registrierst. Außerdem muss auch dein TMyObject von TComponent abgeleitet werden und ebenfalls im Package registriert werden.
Ich habe ein Minimalbeispiel angehängt.
Installierst du das Package, so findest du danach in der Palette unter MyDemoComponent TMyComponent und TMyObject.

Wenn du das eingebettete Objekt gleich mit der Komponente erzeugen willst, lautet dein Stichwort SetSubComponent.

BlueStarHH 8. Apr 2019 10:36

AW: Event von Sub-Objekt als Property anzeigen
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1429582)
Delphi-Quellcode:
public
statt
Delphi-Quellcode:
published

Bist Du Dir sicher? Ich glaube Du verwechselst da was:

Zitat:

published-Elemente haben dieselbe Sichtbarkeit wie public-Elemente. Im Unterschied zu diesen werden jedoch für published-Elemente Laufzeit-Typinformationen generiert. Sie ermöglichen einer Anwendung, die Felder und Eigenschaften eines Objekts dynamisch abzufragen und seine Methoden zu lokalisieren. Diese RTTI-Informationen werden verwendet, um beim Speichern und Laden von Formulardateien auf die Werte von Eigenschaften zuzugreifen, Eigenschaften im Objektinspektor anzuzeigen und spezielle Methoden (so genannte Ereignisbehandlungsroutinen) bestimmten Eigenschaften (den Ereignissen) zuzuordnen.
Quelle Delphi Online-Hilfe: http://docwiki.embarcadero.com/RADSt...bjekte_(Delphi)

BlueStarHH 8. Apr 2019 10:37

AW: Event von Sub-Objekt als Property anzeigen
 
Zitat:

Zitat von TBx (Beitrag 1429594)
Außerdem muss auch dein TMyObject von TComponent abgeleitet werden und ebenfalls im Package registriert werden.

Danke! Aber was mache ich, wenn ich mein TMyObject nicht von TComponent ableiten kann, weil TMyObject eine fertige Klasse von Dritten ist. Z.B. eine TObjectList<T>

peterbelow 8. Apr 2019 10:43

AW: Event von Sub-Objekt als Property anzeigen
 
Zitat:

Zitat von BlueStarHH (Beitrag 1429810)
Zitat:

Zitat von TBx (Beitrag 1429594)
Außerdem muss auch dein TMyObject von TComponent abgeleitet werden und ebenfalls im Package registriert werden.

Danke! Aber was mache ich, wenn ich mein TMyObject nicht von TComponent ableiten kann, weil TMyObject eine fertige Klasse von Dritten ist. Z.B. eine TObjectList<T>

Solche Objekte lassen sich leider nicht als published properties einer TComponent verwenden, die IDE erfordert, dass solche Objekte mindestens von TPersistent abgeleitet sind. Du mußt also in deinem Fall eine Wrapper-Klasse erzeugen, die von TPersistent abgeleitet ist und intern halt eine Instanz deiner eigentlichen Klasse verwendet und deren properties und events quasi nach aussen (published) sichtbar macht.

TBx 8. Apr 2019 10:48

AW: Event von Sub-Objekt als Property anzeigen
 
Zitat:

Zitat von BlueStarHH (Beitrag 1429810)
was mache ich, wenn ich mein TMyObject nicht von TComponent ableiten kann, weil TMyObject eine fertige Klasse von Dritten ist.

Ich fürchte, dann wirst du eine Wrapperklasse erstellen müssen, die die gewünschten Eigernschaften entsprechend durchreicht.
Oder aber du implementierst einen eigenen PropertyEditor. Ist halt die Frage, ob der Aufwand sich lohnt.

BlueStarHH 8. Apr 2019 10:49

AW: Event von Sub-Objekt als Property anzeigen
 
Zitat:

Zitat von peterbelow (Beitrag 1429811)
Zitat:

Zitat von BlueStarHH (Beitrag 1429810)
Zitat:

Zitat von TBx (Beitrag 1429594)
Außerdem muss auch dein TMyObject von TComponent abgeleitet werden und ebenfalls im Package registriert werden.

Danke! Aber was mache ich, wenn ich mein TMyObject nicht von TComponent ableiten kann, weil TMyObject eine fertige Klasse von Dritten ist. Z.B. eine TObjectList<T>

Solche Objekte lassen sich leider nicht als published properties einer TComponent verwenden, die IDE erfordert, dass solche Objekte mindestens von TPersistent abgeleitet sind. Du mußt also in deinem Fall eine Wrapper-Klasse erzeugen, die von TPersistent abgeleitet ist und intern halt eine Instanz deiner eigentlichen Klasse verwendet und deren properties und events quasi nach aussen (published) sichtbar macht.

Wie kann ich dann das Event nach außen hin sichtbar machen? Wie verweise ich also bei einem Event in der Wrapper-Klasse auf das Event von der gewrappten Instanz?

DeddyH 8. Apr 2019 11:32

AW: Event von Sub-Objekt als Property anzeigen
 
Wenn es nur darum geht, dem "inneren" Objekt einen Ereignishandler zuzuweisen, kann man den doch einfach durchreichen, oder habe ich das Problem nicht verstanden?
Delphi-Quellcode:
TMyObject = class(TObject)
private
  FOnMyEvent: TNotifyEvent;
published
  property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent;
end;

TMyComponent = class(TComponent)
private
  FMyObject: TMyObject;
  function GetMyEvent: TNotifyEvent;
  procedure SetMyEvent(const Value: TNotifyEvent);
published
  property OnMyEvent: TNotifyEvent read GetMyEvent write SetMyEvent;
end;

...

function TMyComponent.GetMyEvent: TNotifyEvent;
begin
  Result := FMyObject.OnMyEvent;
end;

procedure TMyComponent.SetMyEvent(const Value: TNotifyEvent);
begin
  FMyObject.OnMyEvent := Value;
end;
Aus dem Kopf, daher ungetestet.


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