Autor |
Beitrag |
Atreyu
      
Beiträge: 137
Delphi 7 Enterprise
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 07.12.07 20:00
Typen werden definiert und auch ein Record ist letzendlich ein Typ:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TMyRecord = record a: integer; end;
type TMyArray = Array of Integer; |
Bei beidem musst du Instanzen erzeugen, also:
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.
Grüße
Marc
|
|
Atreyu 
      
Beiträge: 137
Delphi 7 Enterprise
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type TForm1 = class(TForm) ...
var Form1: TForm1; |
War es das, was du nicht verstanden hattest?
cu
Marc
|
|
Atreyu 
      
Beiträge: 137
Delphi 7 Enterprise
|
Verfasst: Fr 07.12.07 21:14
Soviel ist klar, aber was genau ist der Einsatzzweck eines records?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Fr 07.12.07 21:29
Du kannst mit Records Variablen zu einem "Überbegriff" zusammenfassen. Bei Daten-Verwaltung relativ hilfreich.
Beispiel:
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..10] of 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 Narses 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 
      
Beiträge: 137
Delphi 7 Enterprise
|
Verfasst: 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
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: Sa 08.12.07 01:02
Atreyu 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 
      
Beiträge: 137
Delphi 7 Enterprise
|
Verfasst: Sa 08.12.07 12:04
Okay.
Aber immerhin kann ich ja einen Record dann auch als Datenfeld deklarieren, das reicht mir mal.
zB:
Delphi-Quelltext 1: 2:
| TMyRecord[2].Alter := 23; TMyRecord[2].Name := 'Hans'; |
oder so.
Moderiert von Christian S.: Delphi-Tags hinzugefügt
|
|
Zorro
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: So 09.12.07 15:26
Atreyu 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: Mo 10.12.07 02:03
delfiphan 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 13.12.07 18:40
delfiphan 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.
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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 13.12.07 18:57
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 14.12.07 02:43
 immer dieser neumodische @!$%@°@&%$&$§!
Sorry, mein Fehler.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|