Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponente erstellen: Untereinträge (https://www.delphipraxis.net/68306-komponente-erstellen-untereintraege.html)

Martin K 27. Apr 2006 17:08


Komponente erstellen: Untereinträge
 
Hi,

hab mal ne Frage zur Erstellung von Komponenten:

Wie kann ich es machen, dass ich eine Eigenschaft (property) mit Untereigenschaften im Objektinspektor habe,
also etwa so wie bei einer TForm die Eigenschaft BorderIcons, die versch. Boolean-property's [biSystemMenu,biMinimize,biMaximize,biHelp] als Untereigenschaft hat :?:

Die Muhkuh 27. Apr 2006 17:36

Re: Komponente erstellen: Untereinträge
 
Hi,

ganz grob:

Delphi-Quellcode:
TBlubb = class(TObject) // Oder TComponent, bin mir nicht ganz sicher, einfach testen ;)
published
  property Bla: Integer read FBla write FBla;
  property Blu: String read FBlu write FBlu;
end;


TKompo = class(TComponent)
published
  property Blubb: TBlubb read FBlubb write FBlubb;
end;
[edit]Ist jetzt nicht ganz das, was du willst, aber es macht deutlich, wie es funktioniert[/edit]

Der_Unwissende 27. Apr 2006 17:37

Re: Komponente erstellen: Untereinträge
 
HI,
Boolean Properties sind das nicht ganz. Es handelt sich vielmehr um ein Bitfeld. In Delphi benötigst du dazu dass Schlüsselwort set. Schau einfach mal in die OH (da solltest du dann fündig werden) und/oder frag dann ggf. nochmal nach.

Gruß Der Unwissende

Martin K 27. Apr 2006 18:12

Re: Komponente erstellen: Untereinträge
 
Hab jetzt nach Spiders Methode diesen Code geschrieben:
Delphi-Quellcode:
type
  THoverEffects = class(TComponent)
  private
    Col,Cur,U: Boolean;
  public
    property Color: Boolean read Col write Col;
    property Cursor: Boolean read Cur write Cur;
    property Underline: Boolean read U write U;
  end;

type
  TLinkLabel = class(TLabel)
  private
    Effects: THoverEffects;
  public
    property HoverEffect: THoverEffects read Effects write Effects;
  end;
Werd ich gleich mal testen, aber zumindest meckert der Compiler nicht...

@Der_Unwissende:
Wie funktioniert das denn mit dem Bitfeld ? Hast Du evtl. ein Code-Beispiel ?

Ursprünglich wollte ich es mit einem Record lösen, also so:
Delphi-Quellcode:
type
  TLinkLabel = class(TLabel)
  private
    THoverEffects = Record
      Color, Cursor, Underline: Boolean;
    Effects: THoverEffects;
  public
    property HoverEffect: THoverEffects read Effects write Effects;
  end;
Aber das hat meinem Compiler irgendwie nicht gefallen...

shmia 27. Apr 2006 18:18

Re: Komponente erstellen: Untereinträge
 
Es handelt sich dabei um Mengen (Set of).
Delphi-Quellcode:
type
  THoverEffect = (heColor, heCursor, heUnderline);
  THoverEffects = set of THoverEffect;

  TLinkLabel = class(TLabel)
  private
    FEffects: THoverEffects;
  public
    property HoverEffect: THoverEffects read FEffects write FEffects;
  end;

Martin K 27. Apr 2006 18:22

Re: Komponente erstellen: Untereinträge
 
Und das geht ?
Weiß denn Delphi dann auch, dass das alles Boolean-property's sind ?
(könnte ja auch Integer sein, wie z.B. bei einer TForm unter 'Constraints')

Khabarakh 27. Apr 2006 18:23

Re: Komponente erstellen: Untereinträge
 
Zitat:

Zitat von Martin K
Aber das hat meinem Compiler irgendwie nicht gefallen...

Nested Types gibt es nur in Delphi.Net, unter Win32 musst du den Record auf der gleichen Ebene wie TLinkLabel deklarieren (würde ich aber unter .Net auch machen).
Recordproperties werden allerdings sowieso nicht im OI angezeigt, nimm Spiders Weg. Dazu noch eine Anmerkung:
Delphi-Quellcode:
TBlubb = class(TObject) // Oder TComponent, bin mir nicht ganz sicher, einfach testen ;)
Weder noch, TPersistent.

Martin K 27. Apr 2006 18:28

Re: Komponente erstellen: Untereinträge
 
Okay, also ich habe jetzt praktisch zwei Möglichkeiten:

1.
Delphi-Quellcode:
type
  THoverEffect = (heColor, heCursor, heUnderline);
  THoverEffects = set of THoverEffect;

  TLinkLabel = class(TLabel)
  private
    he: THoverEffects;
  published
    property HoverEffect: THoverEffects read he write he;
  end;
2.
Delphi-Quellcode:
type
  THoverEffects = class(TPersistent)
  private
    Col,Cur,U: Boolean;
  published
    property heColor: Boolean read Col write Col;
    property heCursor: Boolean read Cur write Cur;
    property heUnderline: Boolean read U write U;
  end;

type
  TLinkLabel = class(TLabel)
  private
    he: THoverEffects;
  published
    property HoverEffect: THoverEffects read he write he;
  end;
Welche :?:

Hawkeye219 27. Apr 2006 18:35

Re: Komponente erstellen: Untereinträge
 
Hallo Martin,

die Lösung von shmia ist fast richtig. Man muß nur aus dem "public" ein "published" machen:

Delphi-Quellcode:
type
THoverEffect = (heColor, heCursor, heUnderline);
THoverEffects = set of THoverEffect;

TLinkLabel = class(TLabel)
private
  FEffects: THoverEffects;
published // <<--- korrigiert!
  property HoverEffect: THoverEffects read FEffects write FEffects;
end;
Gruß Hawkeye

Martin K 27. Apr 2006 18:46

Re: Komponente erstellen: Untereinträge
 
Ja, es funktioniert!!!

Hatte nur einen Fehler gemacht: 'public' muss durch 'published' ersetzt werden!
(@Hawkeye219: Der rote Kasten....
Werd es auch in mienen beiden Codes oben gleich ändern)

Habe die 1. Möglichkeit genommen.
Nur noch eine Frage:
Kann man dort Standardwerte festlegen ?

Ich miene nicht, einfach bei Create diese Werte zuordnen, sondern richtige Standardwerte; also bei Delphi7 ist es ja so, dass Standardwerte im OI normal geschrieben sind (z.B. wenn bei einer Form BorderIcons auf [biSystemMenu,biMinimize,biMaximize] steht).
Sobald man aber einen Wert im OI ändert, sind ist dieser Fett geschrieben.

Jetzt ist es so, dass für alle drei Werte 'False' der Standardwert ist (also HoverEffect = []), kann ich z.B. [heColor,heCursor] als Standard definieren ?

Hawkeye219 27. Apr 2006 18:52

Re: Komponente erstellen: Untereinträge
 
klar, das geht:

Delphi-Quellcode:
property HoverEffect: THoverEffects
  read FEffects write FEffects default [heColor, heCursor];
Allerdings mußt du diese Werte auch im Constructor setzen! Der bei "property" angegebene Wert dient nur zur Steuerung der Ausgabe in eine .dfm-Datei. Wenn der aktuelle Wert der Eigenschaft dem Standardwert entspricht, wird die Eigenschaft nicht in die .dfm-Datei geschrieben.

Gruß Hawkeye

Martin K 27. Apr 2006 19:01

Re: Komponente erstellen: Untereinträge
 
Gut, danke!

Sascha L 28. Apr 2006 11:25

Re: Komponente erstellen: Untereinträge
 
Und wie macht man das nun, wenn man nicht nur boolische Werte hat? D.h. wenn man z.B. TColor, TFont, etc. als Untereinträge haben möchte?

Hawkeye219 28. Apr 2006 13:36

Re: Komponente erstellen: Untereinträge
 
Hallo Sascha,

TColor ist eigentlich nur ein Integerwert und erfordert keine Sonderbehandlung. Ein TFont-Feld wird im Konstruktor erzeugt und im Destruktor wieder freigegeben. Um Änderungen am Fontobjekt feststellen zu können, kann man eine private Behandlungsroutine für das OnChange-Ereignis einklinken. Bei echten Komponenten als Unterobjekt ist zu beachten, daß nach dem Erzeugen deren Methode Delphi-Referenz durchsuchenSetSubComponent aufgerufen wird, damit sie ihre Eigenschaften in die .dfm-Datei schreiben (siehe hier). Den Umgang mit TColor bzw. TFont schaust du dir am besten im VCL-Quelltext zu TControl an (Constructor/Destructor).

Gruß Hawkeye

Martin K 28. Apr 2006 16:18

Re: Komponente erstellen: Untereinträge
 
Zitat:

Zitat von Sascha L
Und wie macht man das nun, wenn man nicht nur boolische Werte hat? D.h. wenn man z.B. TColor, TFont, etc. als Untereinträge haben möchte?

Das müsste doch nach dem Schema von Beitrag #8, 2. Code funktionieren, oder?
Anstatt Boolean dann einfach TColor bzw. TFont als Datentyp angeben....

Oder liege ich da falsch?


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