AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record als property?

Ein Thema von Mattze · begonnen am 14. Jul 2011 · letzter Beitrag vom 19. Jul 2011
Antwort Antwort
Seite 1 von 2  1 2      
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Record als property?

  Alt 14. Jul 2011, 17:44
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.649 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Record als property?

  Alt 14. Jul 2011, 17:52
Public heißt von außen erreichbar, published heißt im Objektinspektor sichtbar.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Record als property?

  Alt 14. Jul 2011, 18:17
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.

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.


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.
$2B or not $2B

Geändert von himitsu (14. Jul 2011 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.649 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Record als property?

  Alt 14. Jul 2011, 18:42
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.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (14. Jul 2011 um 19:30 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

AW: Record als property?

  Alt 14. Jul 2011, 19:22
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.649 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Record als property?

  Alt 14. Jul 2011, 19:31
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.

Und: Den Record muss man tatsächlich "createn"?
Öh, das war ein Copy&Paste-Fehler , ich meinte natürlich class, habs korrigiert.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Record als property?

  Alt 14. Jul 2011, 19:38
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.
$2B or not $2B
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Record als property?

  Alt 15. Jul 2011, 01:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Record als property?

  Alt 15. Jul 2011, 10:36
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.
$2B or not $2B

Geändert von himitsu (15. Jul 2011 um 10:38 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#10

AW: Record als property?

  Alt 16. Jul 2011, 17:48
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 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