Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Untermenü in den Eigenschaften einer Komponente (https://www.delphipraxis.net/174119-untermenue-den-eigenschaften-einer-komponente.html)

Beck93 5. Apr 2013 09:13

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

DeddyH 5. Apr 2013 09:41

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:
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;
Statt einer Klasse wäre aber auch ein Record denkbar.

Beck93 5. Apr 2013 12:47

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?

DeddyH 5. Apr 2013 12:57

AW: Untermenü in den Eigenschaften einer Komponente
 
Wie sieht die Unterklasse denn aus?

Beck93 5. Apr 2013 13:10

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.

DeddyH 5. Apr 2013 13:15

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?

Beck93 5. Apr 2013 13:24

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.

sx2008 5. Apr 2013 13:28

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:
  private
    procedure SetUnterklasse(Value:TCOMUnterklasse);
  published
    property COMEinstellungen: TCOMUnterklasse read FUnterklasse write SetUnterklasse;


procedure COM.SetUnterklasse(Value:TCOMUnterklasse);
begin
  FUnterklasse.Assign(Value);
end;
* die Unterklasse muss registriert werden, damit der Objektinspektor dessen Objekte dynamisch erzeugen kann
Delphi-Quellcode:
procedure Register;
begin
  Classes.RegisterComponents(...);
  RegisterClass(TCOMUnterklasse); // ***
end;

DeddyH 5. Apr 2013 13:30

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?

Beck93 5. Apr 2013 13:55

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.

stahli 5. Apr 2013 15:29

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:
  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;
Ich hatte also die Unterkomponente von TComponent abgeleitet ohne diese irgendwie zu registrieren.
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