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/)
-   -   Record als property? (https://www.delphipraxis.net/161662-record-als-property.html)

Mattze 14. Jul 2011 17:44

Record als property?
 
Hi,

ich möchte in einer Komponente einen Record als property public machen.
Also:

Type TR = record
x1,x2: Shortstring
end;

und in der Komponente

public
property R: TR read getfr write Setfr;

Das gelingt mir nicht. Sie wird nicht in der Eigenschaftsliste des Objektinspektors sichtbar. Was mache ich falsch?
Und wie kann man die mit defaultwerten füllen?

Gruß
Mattze

jaenicke 14. Jul 2011 17:52

AW: Record als property?
 
Public heißt von außen erreichbar, published heißt im Objektinspektor sichtbar.

himitsu 14. Jul 2011 18:17

AW: Record als property?
 
jupp

Aus Sicht des Programmierers:
Code:
strict private    nur innerhalb der selben Klassendeklaration verfügbar
private           ..., aber innerhalb der Unit unbeschränkt
strict protected  nur innerhalb der eigenen und in abgeleiteten klassen verfügbar
protected         ..., aber innerhalb der Unit unbeschränkt
public            überall sichtbar wo auch die Klasse sichtbar ist
published         ... und im OI sichtbar
Das Strict wurde erst recht spät implementiert.

Aber im OI wird nur etwas angezeigt, was einfache Standardtypen sind, oder wofür entsprechende Property-Erweiterungen installiert sind.
Für einen irgendeinen Record ist standarmäßig garnichts installiert.

Delphi-Quellcode:
property Pos: TPoint read ... write ...;
kannste vergessen.


In neueren Delphis meckert der Compiler sowas auch gleich an.
Früher gab es zur Leufzeit kleine Probleme, bei einer Zuweisung ... es wirde einfach nichts zugewiesen.


Delphi-Quellcode:
MyObject.Pos.X := 123;
.
wird nach
Delphi-Quellcode:
temp := MyObject.Pos;
temp.X := 123;
übersetzt. (temp = delphiinterne temporäre Variable)

Und wie man sich denken kann, wird somit nichts an Pos übergeben, da nur der Getter aufgerufen wird.
Kannste gerne mal ganz leicht ausprobieren, indem du einen Setter implementierst und schaust, ob man mit dem Debugger darin landet.

jaenicke 14. Jul 2011 18:42

AW: Record als property?
 
Deshalb sollte man für solche Sachen natürlich einfach Klassen verwenden. Die kann man auch innerhalb der Klasse deklarieren und hat damit alles beisammen:
Delphi-Quellcode:
type
  TMyComponent = class(TComponent)
  private type
    TTest = class
      x1, x2: string;
    end;
  private
    FTest: TTest;
  public
    constructor Create(AOwner: TCompoent); override;
    destructor Destroy; override;
  published
    property Test: TTest read FTest;
  end;

constructor...
begin
  inherited Create(AOwner);
  FTest := TTest.Create;
end;

destructor...
begin
  FreeAndNil(FTest);
end;
Und ShortString sollte man nach Möglichkeit auch nicht mehr verwenden, das gibt es nur aus Gründen der Abwärtskompatibilität mit Delphi 1 von vor 16 Jahren.

Mattze 14. Jul 2011 19:22

AW: Record als property?
 
Hi,

danke für Eure Antworten.
Ich meine natürlich published!

Ich habe vergessen, zu sagen, womit ich arbeite: D7pro

Da scheint es das private Type noch nicht zu geben, oder muss man da noch was einstellen.

Und: Den Record muss man tatsächlich "createn"?
Dann bastle ich mir lieber gleich eine Klasse statt des Records. Mal probieren...

Gruß
Mattze

jaenicke 14. Jul 2011 19:31

AW: Record als property?
 
Zitat:

Zitat von Mattze (Beitrag 1111772)
Da scheint es das private Type noch nicht zu geben, oder muss man da noch was einstellen.

Nein, da gab es sehr viel noch nicht, das gehört dazu.
Aber den Typ kannst du natürlich auch einfach wie bisher deklarieren.

Zitat:

Zitat von Mattze (Beitrag 1111772)
Und: Den Record muss man tatsächlich "createn"?

Öh, das war ein Copy&Paste-Fehler :stupid:, ich meinte natürlich class, habs korrigiert.

himitsu 14. Jul 2011 19:38

AW: Record als property?
 
Zitat:

Zitat von Mattze (Beitrag 1111772)
Und: Den Record muss man tatsächlich "createn"?

Nein, muß man nicht.

Bei der Klasse kann man diese im Konstruktor der Elternkomponente erstellen (im Destruktor wieder löschen, es sei denn Dieses erbt von TComponent und man setzt den Owner entsprechend).
Wenn man dann noch die Unterkomponente auch als Unterkomponente deklariert, kann man die untergeordneten Property der Subkomponente auch im OI bearbeiten (siehe Constraints und Font anderer VCL-Komponenten)
Wie weiß ich jetzt nicht auswendig, aber schau mal, ob es sowas wie SetSubComponent-Methode gibt, oder so ähnlich.

USchuster 15. Jul 2011 01:12

AW: Record als property?
 
Zitat:

Zitat von himitsu (Beitrag 1111765)
Aus Sicht des Programmierers:
Code:
strict private    nur innerhalb der selben Klassendeklaration verfügbar
private           ..., aber innerhalb der Unit unbeschränkt
strict protected  nur innerhalb der eigenen und in abgeleiteten klassen verfügbar
protected         ..., aber innerhalb der Unit unbeschränkt
public            überall sichtbar wo auch die Klasse sichtbar ist
published         ... und im OI sichtbar
Das Strict wurde erst recht spät implementiert.

Das ist relativ, denn strict existiert bereits seit dem Delphi Win32 Compiler der für C#Builder verwendet wurde und der ist acht Jahre alt.

himitsu 15. Jul 2011 10:36

AW: Record als property?
 
Im Delphicompiler gibt es das aber erst seit D2006, oder war's 2009?

Im Prinzip ist das eigentlich nur für den Programmierer einer Klasse, welcher sich selber "zwingen" will, auch innerhalb seiner Unit alles zu trennen ... ansonsten merkt ja eh keiner einen Unterschied, zwischen Strict und Nicht-Strict.

Mattze 16. Jul 2011 17:48

AW: Record als property?
 
Hi,

so, nun bin ich gerade einen Schritt weiter.
Jetzt zeigt er die Klasse (mit zwei Strings) schon im OI an.
Davor ordentlich ein Pluszeichen. Aber...
"Keine Expandierung möglich", wenn man auf das Pluszeichen clickt.

Was könnte da falsch sein?

Gruß
Mattze

jaenicke 16. Jul 2011 19:08

AW: Record als property?
 
Hast du es denn gemacht wie in meinem Quelltext? Das heißt hast du auch das Objekt im Feld mit der Unterklasse im Konstruktor erstellt?

Mattze 16. Jul 2011 19:44

AW: Record als property?
 
Hi,

jau, habe ich alles gemacht.
Ich habe noch gegoogelt und was von jag2000 gefunden (http://www.spotlight.de/life/message/1817737.html).
Nun kann ich auf das Plus clicken, es wird zm Minus. Keine Fehlermeldung mehr, aber angezeigt wird im OI auch nix.
Nun ja, ich habe es nicht ganz genau übernommen. Werd's mal morgen noch genauer probieren...

Gruß
Mattze

jaenicke 16. Jul 2011 20:18

AW: Record als property?
 
Dann musst du in der Unterklasse noch die Felder als published deklarieren. Das hatte ich vergessen.

Mattze 17. Jul 2011 10:54

AW: Record als property?
 
Hi,

habe ich mir schon gedacht (und befürchtet). Aber "minimalistisch", wie ich nun mal bin, wollte ich soviel wie möglich an zusätzlichen Dingen vermeiden.

Inzwischen funktionierte es auch. Nun aber nicht mehr.
Ich habe sauber gemacht (Siehe oben!) und alles rausgeschmissen, was ich nicht mehr brauchte. Ergebnis: "Keine Expandierung möglich"
Also habe ich wohl etwas zu viel entfernt. Mal sehen, wann ich das wieder hinbiegen kann. Zum Glück habe ich keinen Termindruck...

Gruß und vielen Dank
Mattze

Mattze 18. Jul 2011 14:22

AW: Record als property?
 
Hi,

ich hatte es ja gleich geahnt und sobald ich das wieder zurück geändert hatte, ging es wieder.
Die neue Klasse muss tatsächlich von TPersistent abgeleitet sein.

Nun habe ich aber inzwischen das Problem, dass die Änderungen in dieser Klasse nicht in die Komponente übernommen wird, die "übergeordnet" ist.
'ne neue private WindowsMessage wird auch nicht aufgerufen. Mal sehen, was ich da noch so brauche...

Jedenfalls erst mal vielen Dank!

Gruß
Mattze

jaenicke 19. Jul 2011 16:23

AW: Record als property?
 
Dafür macht man normalerweise ein Event und weist diesem Event beim Erzeugen der Unterklasse einen Handler in der übergeordneten Klasse zu. ;-)

Mattze 19. Jul 2011 17:34

AW: Record als property?
 
Hi,

auf die Idee mit dem Handler bin ich nicht gekommen. Oder hat das bei mir nicht geklappt...
Kann auch sein.

Allerdings müsste das doch eigentlich ähnlich wie eine private Windowsmessage sein. Warum die nicht geht???
Das funktioniert doch eigentlich immer!

Ich habe das aber jetzt alles wieder auf den Anfang umgestellt. Ohne die Klasse.
Mich störte einfach, dass ich es nicht hinkriegte, dass der auf einzelne Änderungen einer Variable in der untergeordneten Klasse in der übergeordneten reagierte. Das ging nur bei einer Änderung der Klasse.

Irgendwie war mir das alles nichts. Zuviel des Guten! Und das ganze für zwei Variable? Nee, nicht nötig.
Aber interessant war es doch mal, zu sehen, wie das so im Prinzip funktioniert.

Gruß
Mattze

jaenicke 19. Jul 2011 17:57

AW: Record als property?
 
Zitat:

Zitat von Mattze (Beitrag 1112600)
Allerdings müsste das doch eigentlich ähnlich wie eine private Windowsmessage sein. Warum die nicht geht???
Das funktioniert doch eigentlich immer!

Aber nur, wenn deine Komponente auch eine Messageloop hat, die die Message empfangen kann. Da du ja wohl von TComponent abgeleitet hast, gibt es schlicht keine. ;-)
wohin hast du die Message denn geschickt?

Abgesehen davon ist das aber unnötig viel Aufwand, ein Ereignishandler geht viel schneller und einfacher. ;-)

Stevie 19. Jul 2011 18:41

AW: Record als property?
 
Je nach Delphi Version kann man über selbst geschriebene PropertyEditor Klassen und deren Registrierung auch non published Properties, nested Objects und vieles mehr im OI anzeigen, die Installation des Designtime packages mit den zuvor genannten Klassen drin vorausgesetzt.

jaenicke 19. Jul 2011 18:58

AW: Record als property?
 
Ein Beispiel ist die Auswahl der Verbindungsparameter bei Datasnap. Die stehen eigentlich in einer Liste drin. Man kann aber zuerst den Typ auswählen und den Knoten danach ausklappen. Dann stehen die Parameter als Untereinträge im Objektinspektor.

Leider bin ich noch nicht dazu gekommen mir anzuschauen wie man das machen kann. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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 by Thomas Breitkreuz