![]() |
[Aktuellere Delphis] Records = Klassen?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich erkundige mich seit kurzem über Delphi XE 2 Starter Edition, weil ich bedenke, dieses mir zuzulegen.
[Edit] Schade, mich habense verloren: ![]() Auf einem Youtube-Video habe ich eben folgendes gesehen - ein Record hatte einen Constructor. Mir stellt sich nun die Frage, was der ganze Sinn dahinter ist. Muss/(besser)Kann man nun Speicher für Records direkt per Constructor reservieren oder was? Sollen damit Konstrukte wie diese hier...
Delphi-Quellcode:
hiermit...
var
pPnt: PPoint; begin New(pPnt); {...}
Delphi-Quellcode:
umgangen werden?
var
Pnt: PPoint; begin Pnt := TPoint.Create; {...} Weiters frage ich mich, wie sehr Records nun Klassen ähneln. Wo sind die Unterschiede. Wäre nett, wenn mich einer diesbezüglich aufklären könnte ^_^ |
AW: [Aktuellere Delphis] Records = Klassen?
Wie das mit den Konstruktoren ist, weiß ich auch nicht so genau. Könnte mir vorstellen, dass sie bei der Initalisierung automatisch aufgerufen werden, aber wenn ich mich recht erinnere, hatte sich himitsu mal beschwert, dass das nicht möglich ist – also wohl eher nicht. Wahrscheinlich ist es einfach nur, damit man schreiben kann
Delphi-Quellcode:
(sowas habe ich bisher immer mit statischen Methoden gemacht)? Keine Ahnung... würde mich auch interessieren.
Point = TPoint.Create(3,4);
Auf jeden Fall ist der wichtigste Unterschied zwischen Klassen und Records, dass Records keine Vererbung unterstützen. |
AW: [Aktuellere Delphis] Records = Klassen?
Zitat:
|
AW: [Aktuellere Delphis] Records = Klassen?
Zitat:
|
AW: [Aktuellere Delphis] Records = Klassen?
Hallo,
Der Constructor bei Records ist eher eine Init-Methode, in der man Felder initialisieren kann.
Delphi-Quellcode:
Beide Methoden funktionieren ohne Probleme.
type
TPointEx = record X,Y: Integer; constructor Create(AX,AY: Integer); end; constructor TPointEx.Create(AX,AY: Integer); begin X := AX; Y:= AY; end; procedure TForm1.FormCreate(Sender: TObject); var Pt: TPointEx; begin Pt.X := 123; Pt.Y := 987; Caption := Format('X: %d, Y: %d',[Pt.X,Pt.Y]); Pt := TPointEx.Create(10,20); Caption := Caption + ' ' + Format('X: %d, Y: %d',[Pt.X,Pt.Y]); end;
Delphi-Quellcode:
Pt := TPointEx.Create(10,20);
ist quasi eine Alternative zu
Delphi-Quellcode:
Pt := Point(10,20);
|
AW: [Aktuellere Delphis] Records = Klassen?
Ein Konstructor in einem Record ist nichts anderes als eine (statische) Init-Funktion, nicht mehr und nicht weniger.
Außerdem ist ein Record nach wie vor ein Wertetyp und kein Referenztyp. |
AW: [Aktuellere Delphis] Records = Klassen?
Das mit dem Create-an-Pointer geht leider nicht.
Delphi-Quellcode:
1: [DCC Fehler] Unit3.pas(30): E2394 Parameterlose Konstruktoren sind für Record-Typen nicht zulässig
type
TTest = record constructor Create; // *1 constructor Create(X: integer = 0); // *2 end; PTest = ^TTest; procedure TForm2.FormCreate(Sender: TObject); var P: PTest; T: TTest; begin P := TTest.Create(0); // *3 T := TTest(0); // *4 T := TTest.Create(0); // *5 end; Warum eigentlich nicht? Einen plusieblen Grund konnte man mir noch nicht nennen. :evil: 2: [DCC Fehler] Unit3.pas(30): E2471 Möglicherweise parameterlose Konstruktoren sind in Record-Typen nicht zulässig (ich dachte ja, man kann den austriksen :oops: ) 3: [DCC Fehler] Unit1.pas(42): E2010 Inkompatible Typen: 'PTest' und 'TTest' 4: [DCC Fehler] Unit1.pas(35): E2089 Ungültige Typumwandlung Schade, denn eigentlich sah es sehr schön aus :cry: 5: geht, so kann man sich den Record über einen Constructor vorbefüllen lassen Im Prinzip ist "entsprichter" Constructor nur
Delphi-Quellcode:
Was IMHO hier verständlicher wäre, als soeine "Constructor".
type
TTest = record class function Create(X: integer): TTest; end; Die Klassenfunction kann man übrigens auch parameterlos nutzten und sie wird genauso verwendet die dieser Pseudoconstructor. |
AW: [Aktuellere Delphis] Records = Klassen?
Ich frage mich eh, warum sie überhaupt die constructor Syntax gewählt haben, da da nix "constructed" wird, im Sinne von Speicher allokieren.
Den parameterlosen "Konstructor" kann man wie du schon geschrieben hast, durch eine static methode simulieren. Punkt 4 geht, wenn du operator implicit oder explicit einbaust. |
AW: [Aktuellere Delphis] Records = Klassen?
Zitat:
Und
Delphi-Quellcode:
sieht ein bissl blöd aus, bei einem Explicit mit Open-Array-Parameter.
TTest([0, 2, 666])
PS:
Delphi-Quellcode:
Sieht doch hübsch aus?
type
PTest = ^TTest; TTest = record x, y: Integer; class function Create: PTest; class function Create(x, y: Integer): PTest; procedure Free; end; class function TTest.Create: PTest; begin Result := Create(0, 0); end; class function TTest.Create(x, y: Integer): PTest; begin New(Result); Result.x := x; Result.y := y; end; procedure TTest.Free; begin if @Self <> nil then Dispose(@Self); end; |
AW: [Aktuellere Delphis] Records = Klassen?
Zitat:
Kann's dir ooch uff'n Kopp stell'n um die 6 Zeichen und den Punkt von .Create zu sparen... bringt ooch nüscht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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-2025 by Thomas Breitkreuz