![]() |
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 |
AW: Record als property?
Public heißt von außen erreichbar, published heißt im Objektinspektor sichtbar.
|
AW: Record als property?
jupp
Aus Sicht des Programmierers:
Code:
Das Strict wurde erst recht spät implementiert.
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 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:
kannste vergessen.
property Pos: TPoint read ... write ...;
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:
übersetzt. (temp = delphiinterne temporäre Variable)
temp := MyObject.Pos;
temp.X := 123; 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. |
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:
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.
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; |
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 |
AW: Record als property?
Zitat:
Aber den Typ kannst du natürlich auch einfach wie bisher deklarieren. Zitat:
|
AW: Record als property?
Zitat:
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. |
AW: Record als property?
Zitat:
|
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. |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 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