![]() |
Untermenü in den Eigenschaften einer Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich bin gerade meine erste Komponente am erstellen und bin soeben über ein Problem gestolpert. Ich wollte gerne in den Eigenschaften ein Untermenü haben.So wie im Anhang auf dem Bild. Leider habe ich keinen Anhaltspunkt wie ich das hinbekomme. Also meine Frage: Wie bekomme ich in den Eigenschaften meiner Komponente ein Untermenü erstellt? Danke |
AW: Untermenü in den Eigenschaften einer Komponente
Das auf dem Bild dürfte vermutlich eine "Unterklasse" sein, die von der Komponente benutzt wird. Also etwas in der Art
Delphi-Quellcode:
Statt einer Klasse wäre aber auch ein Record denkbar.
type
TUnterklasse = class(TPersistent) private FSomeField: SomeType; FSomeOtherField: SomeType; ... published ... property SomeField: SomeType read FSomeField write FSomeField; property SomeOtherField: SomeType read FSomeOtherField write FSomeOtherField; end; TDeinKomponente = class(TComponent) private FUnterklasse: TUnterklasse; ... published ... property Unterklasse: TUnterklasse read FUnterklasse; end; |
AW: Untermenü in den Eigenschaften einer Komponente
Vielen Dank für die schnelle Antwort.
habe es jetzt einmal getestet. Es sieht prinzipiell sehr gut aus nur wenn ich auf das "+" vor der Eigenschaft "Unterklasse" drücke öffnen sich meine Eigenschaften der "Unterklasse" nicht. Woran könnte das liegen? |
AW: Untermenü in den Eigenschaften einer Komponente
Wie sieht die Unterklasse denn aus?
|
AW: Untermenü in den Eigenschaften einer Komponente
Delphi-Quellcode:
type
TAnschluss = (asTCP_IP, asLPT1, asLPT2, asLPT3, asCOM1, asCOM2, asCOM3); TCOMUnterklasse = class(TPersistent) public FBaudRate: CPort.TBaudRate; FDataBits: CPort.TDataBits; FStopBits: CPort.TStopBits; FParity: CPort.TComParity; published property BaudRate:CPort.TBaudRate read FBaudRate write FBaudRate; property DataBits: CPort.TDataBits read FDataBits write FDataBits; property StopBits: CPort.TStopBits read FStopBits write FStopBits; property Parity: CPort.TCOMParity read FParity write FParity; end; type Tptw_AveryEtikettendruck = class(TComponent) IndyClient: TIdTCPClient; COM: TComPort; private { Private-Deklarationen } FUnterklasse: TCOMUnterklasse; ... published property COMEinstellungen: TCOMUnterklasse read FUnterklasse write FUnterklasse; So sieht der Aufbau momentan aus. |
AW: Untermenü in den Eigenschaften einer Komponente
Auf den ersten Blick fällt mir da jetzt nichts Ungewöhnliches auf. Hab ich das richtig verstanden, das "+" ist zu sehen, lässt sich aber nicht aufklappen?
|
AW: Untermenü in den Eigenschaften einer Komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Ja "+" ist sichtbar aber leider keine Unterpunkte.
Im Anhang als Bild. Dort habe ich auf "+" gedrückt und nichts hat sich verendert bis auf das aus "+" "-" wurde. Fals es interessant für den fall sein könnte: Ich habe ebenso ein Menü mit Such funktion (wie Datei öffnen) in der Komponente. In Delphi 7 wird das angezeigt und funktioniert in Rad Studio XE nicht. Eine lösung habe ich aber auch leider noch nicht für das Problem. |
AW: Untermenü in den Eigenschaften einer Komponente
Vorraussezungen für den Erfolg sind:
* die Unterklasse muss von TPersistent abgeleitet sein und die Mehode Assign überschreiben werden. Vergisst man Assign zu überschreiben, dann erscheint die Fehlermeldung "Klasse XXX kann XXX nicht zugewiesen werden" (oder so ähnlich) * das published Property muss read-write sein
Delphi-Quellcode:
* die Unterklasse muss registriert werden, damit der Objektinspektor dessen Objekte dynamisch erzeugen kann
private
procedure SetUnterklasse(Value:TCOMUnterklasse); published property COMEinstellungen: TCOMUnterklasse read FUnterklasse write SetUnterklasse; procedure COM.SetUnterklasse(Value:TCOMUnterklasse); begin FUnterklasse.Assign(Value); end;
Delphi-Quellcode:
procedure Register;
begin Classes.RegisterComponents(...); RegisterClass(TCOMUnterklasse); // *** end; |
AW: Untermenü in den Eigenschaften einer Komponente
So etwas hatte ich bislang noch nie :gruebel: Was passiert, wenn Du den Properties einmal Getter und Setter verpasst, ändert sich dann etwas?
|
AW: Untermenü in den Eigenschaften einer Komponente
Danke nochmals für die Antworten.
bin gerade am versuchen, doch leider verstehe ich den letzten Code ausschnitt von sx2008 nicht. Egal was ich in die Klammern schreibe, es wird angemosert von Delphi. |
AW: Untermenü in den Eigenschaften einer Komponente
Ich denke, sx2008 liegt in dem Fall mal nicht ganz richtig...
In einem eigenen Edit habe ich das mal so gelöst (muss etwas basteln, da ich das mit include-Dateien realisiert hatte):
Delphi-Quellcode:
Ich hatte also die Unterkomponente von TComponent abgeleitet ohne diese irgendwie zu registrieren.
TodEdit = class(TEdit)
private FDataSet: TodDataSet; FOnAfterGetData: TNotifyEvent; FOnBeforeGetData: TNotifyEvent; function get_od: Tod; procedure set_od(const Value: Tod); function get_PropName: String; procedure set_PropName(const Value: String); function get_PropText: String; procedure set_PropText(const Value: String); protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property DataSet: TodDataSet read FDataSet; property OnAfterGetData: TNotifyEvent read FOnAfterGetData write FOnAfterGetData; property OnBeforeGetData: TNotifyEvent read FOnBeforeGetData write FOnBeforeGetData; end; procedure Register; implementation uses Graphics, Controls, Themes, Windows, SysUtils; procedure Register; begin RegisterComponents('odControls', [TodEdit]); end; { TodEdit } constructor TodEdit.Create(AOwner: TComponent); begin inherited; FDataSet := TodDataSet.Create(Self); // Instanz erstellen DataSet.SetSubComponent(True); // In der DFM speichern end; /////////////////////////////////// TodDataSet = class(TComponent) private ... protected ... public ... published property PropName: String read get_PropName write set_PropName; end; Hilft das vielleicht weiter? SetSubComponent führt dann dazu, dass die Einstellungen in der DFM gespeichert werden. Hast Du vielleicht vergessen, eine Instanz Deiner Unterkomponente zu erzeugen? Vielleicht kommt auch der Objektinspektor nicht mit Deinen Typen (CPort.TBaudRate usw) zurecht? Führe sonst mal testweise eine einfache Texteigenschaft o.ä. ein... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz