Properties mit Objects in published Abschnitten

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Properties mit Objects in published Abschnitten

Beitrag von soerensen3 »

Hallo!

Für meine Graphik-Engine nutze ich zurzeit Objects (nicht Klassen) für meine Vektoren. Das hat den Vorteil dass man die wie normale Variablen bzw. Records verwenden kann und nicht explizit freigeben muss aber mit den Vorteilen von Klassen.
Da die Begriffe Objekte und Klassen oft synonym verwendet werden, ich meine das hier:

Code: Alles auswählen

type TVec4 = object ....
Das funktioniert soweit ganz gut, allerdings gibt es Probleme wenn ich die als properties verwenden will.
Immerhin kann man unter fpc diese schonmal als public properties deklarieren, was unter Delphi 7 nie ging.
Allerdings sagt er mir bei published immer: Error: This kind of property can't be published
Weiß jemand warum das nicht geht? Mit Klassen geht das ja schließlich auch. Google ist in dieser Hinsicht leider keine große Hilfe, genauso wenig wie das Handbuch von Pascal.

Gruß Johannes

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Properties mit Objects in published Abschnitten

Beitrag von Mathias »

Kannst du mal ein bischen mehr Code posten, dann sieht man eher was du meinst.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Properties mit Objects in published Abschnitten

Beitrag von soerensen3 »

Ok ich schreibe einfach mal den Beispiel Code für einen Vektor:

Code: Alles auswählen

 
type TVec4 = object
  x,y,z,w: Single;
end;
In einer Klasse soll der Vektor als Property genutzt werden:

Code: Alles auswählen

 
type TTestClass = class( TPersistent )
  private
    FVec: TVec4;
  public
    property Vec: TVec4 read FVec write FVec; //geht
  published
    property Vec2: TVec4 read FVec write FVec; //geht nicht
end;

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Properties mit Objects in published Abschnitten

Beitrag von m.fuchs »

Bei Stackoverflow findet sich auf eine ähnliche Frage im Zusammenhang mit Delphi folgendes:
DELPHI IN A NUTSHELL (O'REILLY) hat geschrieben:Published declaration tells the compiler to store information in the virtual method table. Only certain kinds of information can be stored.
The type of a published property cannot be a pointer, record, or array. If it is a set type, it must be small enough to be stored in an integer.
Das wird wohl bei Freepascal ähnlich sein.

Die Frage ist ja auch: Warum willst du das machen? Vielleicht findet sich ja noch eine andere Lösung.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Soner
Beiträge: 733
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Properties mit Objects in published Abschnitten

Beitrag von Soner »

Warum willst du den hier Eigenschaften als published definieren, public reicht doch.
Im Grunde published ist das gleiche wie public mit dem Unterschied dass man als published deklarierte Eigenschaften mit Objektinspektor bearbeiten kann.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Properties mit Objects in published Abschnitten

Beitrag von m.fuchs »

Und das man auf sie per RTTI zugreifen kann. Was manchmal ganz nützlich ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Soner
Beiträge: 733
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Properties mit Objects in published Abschnitten

Beitrag von Soner »

m.fuchs hat geschrieben:Und das man auf sie per RTTI zugreifen kann. Was manchmal ganz nützlich ist.
Ja aber man verwendet doch die alten Objekte um aufgeblähte Code zu vermeiden.

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Properties mit Objects in published Abschnitten

Beitrag von soerensen3 »

Und das man auf sie per RTTI zugreifen kann. Was manchmal ganz nützlich ist.
Ja richtig, es geht um die RTTI.
...it must be small enough to be stored in an integer.
Ist ein Objekt (als Feld in einer Klasse) nicht auch nur ein Zeiger?

Eine Alternative wäre eine Vektorklasse für die Benutzung als properties zu definieren, was ich aber für umständlich halte.
Es geht mir in dem Fall weniger dadrum eine andere Lösung zu finden. Ich wollte in erster Linie verstehen warum FPC das nicht erlaubt und plane außerdem eventuell in Zukunft einen Zugriff auf meine Objekte über eine Skriptsprache, wobei sich die RTTI als Schnittstelle anbietet. Das schöne an FPC ist ja auch dass es open source ist, also eventuell sogar dahingehend erweitert werden könnte. Ob ich mir das aber antun möchte mich durch den Code zu quälen, für etwas das dann unter Umständen gar nicht übernommen wird ist die andere Frage.

Danke schonmal für die Antworten..

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Properties mit Objects in published Abschnitten

Beitrag von Mathias »

Als class geht es, aber wie oben geschrieben, ist es umständlicher.

Was ich komisch finde, das es nicht mal als einfacher Record geht.

Code: Alles auswählen

type
  TVec4 = class
    x, y, z, w: single;
  end;
 
  { TTestClass }
 
  TTestClass = class(TPersistent)
  private
    FVec: TVec4;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property Vec: TVec4 read FVec write FVec;
  end;
 
implementation
 
{$R *.lfm}
 
{ TTestClass }
 
constructor TTestClass.Create;
begin
  inherited Create;
  Vec := TVec4.Create;
end;
 
destructor TTestClass.Destroy;
begin
  Vec.Free;
  inherited Destroy;
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Properties mit Objects in published Abschnitten

Beitrag von Socke »

Mathias hat geschrieben:Als class geht es, aber wie oben geschrieben, ist es umständlicher.

Was ich komisch finde, das es nicht mal als einfacher Record geht.
Die Dokumentation dazu finde ich nicht ganz verständlich: http://www.freepascal.org/docs-html/ref ... 1-810006.1

Mit den neuen RTTI-Features in der aktuellen FPC-Entwicklungsversion sollte es prinzipiell möglich sein, eine Unterstützung für Records und Arrays im published-Abschnitt zu implementieren. Vielleicht wäre das einen Feature Request wert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Properties mit Objects in published Abschnitten

Beitrag von soerensen3 »

Socke hat geschrieben:Vielleicht wäre das einen Feature Request wert.
Fänd ich auch gut. Leider kenn ich mich aber damit nicht richtig aus. Das letzte mal wo ich die RTTI verwendet habe war unter Delphi 7 und auch da über eine unit von jemand anderem, seitdem hat sich ja offenbar auch vieles geändert.

Wie stellt man denn einen Feature Request für FPC? Ist das ein Bug Report oder schreibt man das in das offizielle Forum? Habe keine Rubrik mit dem Thema Feature Request gefunden.
Socke hat geschrieben:Die Dokumentation dazu finde ich nicht ganz verständlich
Properties werden da mit nur einem Satz erwähnt. Komisch finde ich die Aussage das published das gleiche ist bis auf die Typ Informationen. Offensichtlich stimmt das ja nicht. Array Properties funktionieren offenbar anders als angeben wenn sie dynamisch sind (nicht getestet aber steht in dem stackoverflow thread). Properties mit Records und Objekten funktionieren nicht obwohl nicht dort angegeben. Auch unter dem Kapitel Properties kann ich dazu nichts finden, welche Typen überhaupt gültig sind.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Properties mit Objects in published Abschnitten

Beitrag von Socke »

soerensen3 hat geschrieben:Wie stellt man denn einen Feature Request für FPC? Ist das ein Bug Report oder schreibt man das in das offizielle Forum? Habe keine Rubrik mit dem Thema Feature Request gefunden.
Einfach einen Bug aufmachen; du kannst in den Betreff "Feature Request" hineinschreiben um den Eintrag als solchen zu kennzeichnen.
soerensen3 hat geschrieben:
Socke hat geschrieben:Die Dokumentation dazu finde ich nicht ganz verständlich
Properties werden da mit nur einem Satz erwähnt. Komisch finde ich die Aussage das published das gleiche ist bis auf die Typ Informationen. Offensichtlich stimmt das ja nicht. Array Properties funktionieren offenbar anders als angeben wenn sie dynamisch sind (nicht getestet aber steht in dem stackoverflow thread). Properties mit Records und Objekten funktionieren nicht obwohl nicht dort angegeben. Auch unter dem Kapitel Properties kann ich dazu nichts finden, welche Typen überhaupt gültig sind.
Aber genau das ist der Unterschied: auf die published-Eigenschaften kann man per RTTI zugreifen, auf die public-Eigenschaften nicht. Es geht also um die RTTI der Klasse und nicht des Datentyps der Eigenschaft. Die RTTI des Datentyps sind jedoch eine Grundvoraussetzung; wie geschrieben, war diese bisher noch nicht gegeben (und ist es in den stabilen Versionen auch noch nicht).

Im Stackoverflow-Thread ist von dynamischen und statischen Arrays die Rede, nicht von Array-Properties. Hier drei Beispiele:

Code: Alles auswählen

 
type 
Tdynarr = array of integer;
tstatarr = array[0..1] of integer;
tmyclass = class
public
  property x: Tdynarr;  // dynamischer Array
  property y: tstatarr; // statischer Array
  property z[Index: Integer]: Integer read GetFunc write SetFunc; // array property
end;
Von allen dreien können wohl nur die dynamischen Arrays als published definiert werden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Properties mit Objects in published Abschnitten

Beitrag von Socke »

m.fuchs hat geschrieben:Bei Stackoverflow findet sich auf eine ähnliche Frage im Zusammenhang mit Delphi folgendes:
DELPHI IN A NUTSHELL (O'REILLY) hat geschrieben:Published declaration tells the compiler to store information in the virtual method table. Only certain kinds of information can be stored.
The type of a published property cannot be a pointer, record, or array. If it is a set type, it must be small enough to be stored in an integer.
Das wird wohl bei Freepascal ähnlich sein.
Ein Blick in die Unit typinfo ergibt folgendes:
  • Alles im Bereich von 1..Sizeof(Pointer) lässt sich als ordinale Eigenschaft verwenden. Auch Objekte-Eigenschafften (class) greifen darauf zurück.
  • Strings haben ihre eigene Imlementierung.
  • An sich gibt es beim Lesen der RTTI keine Beschränkung auf eine bestimmte Größe des Datentyps. Beispiele sind Double (8 Byte) und Extended (10 Byte); beide sind auf einem 32-Bit-System größer als ein Pointer.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Properties mit Objects in published Abschnitten

Beitrag von soerensen3 »

Hallo,

hatte jetzt die letzten Tage keine Zeit mich um den Bugreport zu kümmern.

Ich würde jetzt folgendes schreiben:
Titel: inconsistency with compiler and reference about object and record properties in published sections

The reference of free pascal states that published sections are the same as public sections except for the Type Information which is generated. The only exception are array properties, which cannot be used in published sections (http://www.freepascal.org/docs-html/ref ... 1-810006.1). This is not entirely true, because records and objects (not Classes, see example below) cannot be used either.

The chapter about properties only mentions that it is irrelevant if you use public or published sections (http://www.freepascal.org/docs-html/ref ... 940006.5.1) which is probably referring to syntax when declaring them but which is not very clear from the formulation. It is however inconsistent to the statement in the previously mentioned chapter and to what the compiler allows you to do.

If you take a look at the example code below you see that regarding to the information above this code should compile but it doesn't.

Code: Alles auswählen

program Project1;
 
uses
  Classes;
type
  TSampleObject = object
    x,y,z: Single;
  end;
 
  TSampleRecord = record
    x,y,z: Single;
  end;
 
  { TSampleClass }
 
  TSampleClass = class( TPersistent )
    private
      FVec1: TSampleObject;
      FVec2: TSampleObject;
      FVec3: TSampleRecord;
      FVec4: TSampleRecord;
 
    public
      property Vec1: TSampleObject read FVec1 write FVec1; //This is possible
      property Vec3: TSampleRecord read FVec3 write FVec3; //This is possible
 
    published
      property Vec2: TSampleObject read FVec2 write FVec2; //This is not possible
      property Vec4: TSampleRecord read FVec4 write FVec4; //This is not possible
  end;
 
begin
end.


With the new RTTI-Features (http://wiki.freepascal.org/User_Changes ... TI_changes) it should at least be possible for records and I see no reason why it should not work with objects.

Wollte nochmal eure Meinung hören bevor ich das abschicke. Insbesondere wegen dem letzten Abschnitt, von dem ich keine Ahnung habe ob das so stimmt ;)
Kann dich auch gerne zitieren da, Socke, aber wusste nicht ob dir das recht ist.

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Properties mit Objects in published Abschnitten

Beitrag von Mathias »

Was mir noch aufgefallen ist, im Objectinspector findet man als Untergruppen nur classen. Z.B beim Form1, TFont.

Vielleicht ist die bewusst so gemacht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten