AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE [Aktuellere Delphis] Records = Klassen?
Thema durchsuchen
Ansicht
Themen-Optionen

[Aktuellere Delphis] Records = Klassen?

Ein Thema von Aphton · begonnen am 31. Aug 2011 · letzter Beitrag vom 31. Aug 2011
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

[Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 16:44
Ich erkundige mich seit kurzem über Delphi XE 2 Starter Edition, weil ich bedenke, dieses mir zuzulegen.
[Edit] Schade, mich habense verloren: http://www.delphipraxis.net/1120577-post27.html [/Edit]

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:
var
  pPnt: PPoint;
begin
  New(pPnt);
  {...}
hiermit...
Delphi-Quellcode:
var
  Pnt: PPoint;
begin
  Pnt := TPoint.Create;
  {...}
umgangen werden?

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 ^_^
Miniaturansicht angehängter Grafiken
delphi-xe2-preview-2-min-3.24.jpg  
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (31. Aug 2011 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 16:52
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 Point = TPoint.Create(3,4); (sowas habe ich bisher immer mit statischen Methoden gemacht)? Keine Ahnung... würde mich auch interessieren.

Auf jeden Fall ist der wichtigste Unterschied zwischen Klassen und Records, dass Records keine Vererbung unterstützen.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 16:53
Zitat:
Auf jeden Fall ist der wichtigste Unterschied zwischen Klassen und Records, dass Records keine Vererbung unterstützen.
Ist das wirklich der Fall bei den neuesten Versionen?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 16:53
Zitat:
Auf jeden Fall ist der wichtigste Unterschied zwischen Klassen und Records, dass Records keine Vererbung unterstützen.
Ist das wirklich der Fall bei den neuesten Versionen?
Nach meiner Information ja.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 17:05
Hallo,

Der Constructor bei Records ist eher eine Init-Methode, in der man Felder initialisieren kann.

Delphi-Quellcode:
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;
Beide Methoden funktionieren ohne Probleme.

Pt := TPointEx.Create(10,20);
ist quasi eine Alternative zu

Pt := Point(10,20);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 17:15
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 18:31
Das mit dem Create-an-Pointer geht leider nicht.

Delphi-Quellcode:
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;
1: [DCC Fehler] Unit3.pas(30): E2394 Parameterlose Konstruktoren sind für Record-Typen nicht zulässig
Warum eigentlich nicht?
Einen plusieblen Grund konnte man mir noch nicht nennen.

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 )

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

5: geht, so kann man sich den Record über einen Constructor vorbefüllen lassen


Im Prinzip ist "entsprichter" Constructor nur
Delphi-Quellcode:
type
  TTest = record
    class function Create(X: integer): TTest;
  end;
Was IMHO hier verständlicher wäre, als soeine "Constructor".
Die Klassenfunction kann man übrigens auch parameterlos nutzten und sie wird genauso verwendet die dieser Pseudoconstructor.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 20:31
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 20:57
Punkt 4 geht, wenn du operator implicit oder explicit einbaust.
Aber nur solange nur ein Parameter verwendet wird.

Und TTest([0, 2, 666]) sieht ein bissl blöd aus, bei einem Explicit mit Open-Array-Parameter.

PS:
Delphi-Quellcode:
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;
Sieht doch hübsch aus?
$2B or not $2B

Geändert von himitsu (31. Aug 2011 um 21:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: [Aktuellere Delphis] Records = Klassen?

  Alt 31. Aug 2011, 21:02
Punkt 4 geht, wenn du operator implicit oder explicit einbaust.
Aber nur solange nur ein Parameter verwendet wird.

Und TTest([0, 2, 666]) sieht ein bissl blöd aus, bei einem Explicit mit Open-Array-Parameter.
Logisch, dein Beispiel hatte ja auch nur einen Wert, oder?

Kann's dir ooch uff'n Kopp stell'n um die 6 Zeichen und den Punkt von .Create zu sparen... bringt ooch nüscht.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:33 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