Autor Beitrag
Atreyu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Fr 07.12.07 19:48 
Ist eigentlich eine Grundlage, deshalb etwas peinlich zu fragen, aber worin besteht eigentlich der unterschied zwischen record und type?
Mit beiden kann man doch eine Struktur aus mehreren Datentypen deklarieren, wann also sollte man record und wann type nehmen!
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 07.12.07 20:00 
Typen werden definiert und auch ein Record ist letzendlich ein Typ:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TMyRecord = record
         a: integer;
  end;

// anderes Beispiel:

type
 TMyArray = Array of Integer;

Bei beidem musst du Instanzen erzeugen, also:
ausblenden Delphi-Quelltext
1:
2:
3:
var
 MyRecord: TMyRecord;
 MyArray: TMyArray;

Erst jetzt kannst du von deinen Typen gebrauch machen.
Um die Freigabe musst du dich meines Wissens nach nicht kümmern, das erledigt die VCL für dich. :P

Grüße
Marc
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Fr 07.12.07 21:03 
Ja, aber sind das jetzt nur 2 verschiedene Typen für dasselbe Ziel?

Das Beispiel sieht danach aus, als würdest du einen record innerhalb eines Types anlegen... ist es dazu da?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 07.12.07 21:10 
Nope.
Das Schlüsselwort type sagt Delphi nur, dass ein neuer Typ definiet wird.
Syntax hier:
type NeuerTypenName = Typ

Bei mehr-zeiliger Definition wird mit end; abgeschlossen.
Du kennst es auch auch von Klassen, die standardmäßig bei einem neuen Programm von Delphi angelegt werden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TForm1 = class(TForm)
    ...

var
  Form1: TForm1;

War es das, was du nicht verstanden hattest? :gruebel:

cu
Marc
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Fr 07.12.07 21:14 
Soviel ist klar, aber was genau ist der Einsatzzweck eines records?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 07.12.07 21:29 
Du kannst mit Records Variablen zu einem "Überbegriff" zusammenfassen. Bei Daten-Verwaltung relativ hilfreich.
Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TUser = record
    Name: String[15];
    Alter: Byte;
    Postings: Integer;
  end;

var
 User: Array[1..10of TUser;

Dieses Daten-Array könntest du nun z.B. füllen oder was auch immer.
Allerdings sind Records nicht geeignet, um sie übers Netzwerk zu verschicken. Ich mein user profile iconNarses hatte in der Library einen Artikel darüber geschrieben. Ich such den später mal. ;)
Wichtig ist auch, dass du die Strings begrentzt. Mehr dazu in der DOH.

cu
Marc
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Fr 07.12.07 23:12 
Achso. Und class wird verwendet, wenn man von einem vorhandenen Objekt eine Instanz ableiten will...
Mit record werden eher selbst Objekte zusammengebastelt.
Zorro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: Sa 08.12.07 01:02 
user profile iconAtreyu hat folgendes geschrieben:
Achso. Und class wird verwendet, wenn man von einem vorhandenen Objekt eine Instanz ableiten will...
Mit record werden eher selbst Objekte zusammengebastelt.


1. Satz: ja
2. Satz: nein.

Mit record werden genau KEINE Objekte zusammengebastelt, sondern Variablen (wie schon treffend ausgeführt "zu einem Überbegriff") zusammengefasst, d.h. du kannst in einen Record KEINE Methoden (sprich: Prozeduren und Funktionen) reinpacken (und die Feinheit der prozeduralen Typen lassen wir jetzt mal außen vor...)

Greetz
Zorro
Atreyu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Sa 08.12.07 12:04 
Okay.
Aber immerhin kann ich ja einen Record dann auch als Datenfeld deklarieren, das reicht mir mal.

zB:
ausblenden Delphi-Quelltext
1:
2:
TMyRecord[2].Alter := 23;
TMyRecord[2].Name := 'Hans';

oder so.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Zorro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: So 09.12.07 15:26 
user profile iconAtreyu hat folgendes geschrieben:
Okay.
Aber immerhin kann ich ja einen Record dann auch als Datenfeld deklarieren, das reicht mir mal.

zB:
TMyRecord[2].Alter := 23;
TMyRecord[2].Name := 'Hans';

oder so.


Nicht "AUCH", sondern "NUR".
Für den Praxis-Alltag stell dir einen Record einfach als Sammelvariable (sprich Datenfelder) vor und ein Objekt als "Erweiterung" des Records um Prozeduren und Funktionen (ist zwar technisch inkorrekt, aber vielleicht etwas anschaulicher).

Greetz
Zorro
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 09.12.07 21:13 
Um auf Datenfelder einer Klasse zugreifen zu können, musst du sie zuerst instanzieren. Die Klasse muss man "von Hand" allozieren/instanzieren und sie landet dann auf dem Heap ("relativ" langsam). Ein Record muss nicht manuell alloziert werden und die Daten (abgesehen von Strings, dyn. Arrays, etc.) landen auf dem Stack (braucht praktisch keine Zeit). Ein dynamisch allozierter Record entspricht ungefähr einer Klasse, wobei eine Klasse natürlich weitaus mehr kann, was die Vererbung und weitere Konzepte der objektorientierten Programmierung angeht (es gibt aber auch Dinge, die ein Record kennt und die Klasse nicht, z.B. das case innerhalb eines Records).
Es kennen beide Konstrukte - Record und Class - private und public Felder, Methoden, Properties und Konstruktoren (bei Records nur Konstruktoren (Edit:) mit Parameter).

Zur Praxis:
Üblicherweise verwendet man Records, um mehrere Variablen zusammenzufassen. Und man erlaubt direkten Zugriff auf diese Variablen.
Bei einer Klasse hingegen kapselt man die Datenfelder ab und definiert Methoden und Properties, um mit dem Objekt zu arbeiten.


Zuletzt bearbeitet von delfiphan am Do 13.12.07 18:52, insgesamt 1-mal bearbeitet
Zorro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: Mo 10.12.07 02:03 
user profile icondelfiphan hat folgendes geschrieben:

Es kennen beide Konstrukte - Record und Class - private und public Felder, Methoden, Properties und Konstruktoren (bei Records nur Konstruktoren ohne Parameter).


Klingt interessant. Kannst du ein funktionierendes Beispiel posten oder per PN senden?

Thx
Zorro
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 13.12.07 18:40 
user profile icondelfiphan hat folgendes geschrieben:
Es kennen beide Konstrukte - Record und Class - private und public Felder, Methoden, Properties und Konstruktoren (bei Records nur Konstruktoren ohne Parameter).


Sorry aber soweit ich weiß haben records keine Konstruktoren und Destruktoren, weil es einfach nur eine Sammlung von Variablen ist.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type TExample = record
  a, b, c: String;
  d, e, f: Integer;
end;

Procedure ExampleProcedure;
var Variable: TExample;
begin
  Variable.a := 'Das';
  Variable.b := 'Funktioniert';
  Variable.c := 'Nur mit einem Record.';
  Variable.d := 666;
end;


Wenn du das gleiche mit einer Class probierst schepperts ne Fehlermeldung.

Kannst aber auch gern überprüfen: Klasse vs [url=de.wikibooks.org/wik...Records]Record[/url]

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 13.12.07 18:57 
user profile iconelundril hat folgendes geschrieben:
Sorry aber soweit ich weiß haben records keine Konstruktoren und Destruktoren, weil es einfach nur eine Sammlung von Variablen ist.
Das ging bis Delphi 7 natürlich nicht. Ist ja aber auch schon paar Versionen her. Destruktoren gibt's bei records nicht, wurde auch nicht behauptet ;)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  TMyRecord = record
  strict private
    FNumber: Integer;
  public
    property Number: Integer read FNumber write FNumber;
    procedure MyProcedure;
  end;

{ TMyRecord }

procedure TMyRecord.MyProcedure;
begin
  ShowMessage('My number is '+IntToStr(FNumber));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyRecord: TMyRecord;
begin
  MyRecord.Number := 5;
  MyRecord.MyProcedure;
end;
Da MyRecord auf dem Stack liegt braucht es keine Allozierung von Speicher auf dem Heap. Beim Zuweisen muss dafür der ganze Inhalt kopiert werden.

Konstruktoren mit Parameter sind auch erlaubt. Es gibt dann aber wohl keinen Unterschied zwischen folgenden zwei Linien:
ausblenden Delphi-Quelltext
1:
2:
SomeRecord.Init(3);                // mit procedure Init(Number: Integer);
SomeRecord := TMyRecord.Create(3); // mit constructor Create(Number: Integer);
Die zweite Zuweisung ist dabei keine richtige Zuweisung. Wenn der Konstruktor den Inhalt eines Feldes nicht überschreibt, bleibt sein Wert erhalten. "Alle Felder auf 0" stellen kann man im Konstruktor z.B. so:
ausblenden Delphi-Quelltext
1:
2:
Finalize(self);
FillChar(self, SizeOf(self), 0);
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 14.12.07 02:43 
:shock: immer dieser neumodische @!$%@°@&%$&$§! :?

Sorry, mein Fehler.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.