![]() |
Erklärung von record (Delphihilfe unverständlich :))
Hi,
kann mir wer erklären, wie man die Funktion record benutzt? Die Delphihilfe wirft wie immer nur noch mehr Rätsel auf. Ich habe bisher verstanden, das man es unter type deklariert und mehrere Variablen verschiedenen Typs reinspeichern kann. Nun versucht die Delphihilfe etwas mit "case" zu erkären, wo ich allerdings nicht durchsteige. Bitte um Hilfe^^ (und um Fehlerberichtigung falls ich schon falsch liege) Danke im Vorraus MfG ErdNussLocke |
Re: Erklärung von record (Delphihilfe unverständlich :))
Ein Record ist einfach ein zusammengesetzter Datentyp.
z.B.
Delphi-Quellcode:
TAdresse = Record
Name: string; Vorname: string; GebDat: TDate; ... end; ... adr: TAdresse; ... adr.Name := 'Erdnusslocke'; adr.Vorname := '...'; ... |
Re: Erklärung von record (Delphihilfe unverständlich :))
ok das is schonmal gut. danke dafür
und was hat es mit diesem case auf sich? |
Re: Erklärung von record (Delphihilfe unverständlich :))
Was steht da genau mit dem case drinn?
|
Re: Erklärung von record (Delphihilfe unverständlich :))
z.b. das hier
Delphi-Quellcode:
TPolygon = record
X, Y: Real; case Kind: Figure of TRectangle: (Height, Width: Real); TTriangle: (Side1, Side2, Angle: Real); TCircle: (Radius: Real); |
Re: Erklärung von record (Delphihilfe unverständlich :))
Das ist schon ein recht fortschrittliches Sprachfeature.
Das erlaubt dir, deine records dynamisch zu deklarieren, das heißt die genauen Bestandteile des records hängen von dem Aufzählungswert Kind ab. |
Re: Erklärung von record (Delphihilfe unverständlich :))
dabei handelt es sich nicht um einen normalen Record, sondern um einen Union. Je nach Wert einer Variable (hier Kind) sind andere Teile der Datenstruktur sichtbar.
|
Re: Erklärung von record (Delphihilfe unverständlich :))
aso ok. warum schreiben die das nicht so in die Hilfe ;)
Vielen Dank an alle! |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Empfehlung von mir : Finger weg von dem Kram. Zumindest solange, wie Du denkst ein Record sei eine Funktion. :zwinker:
Zitat:
[Edit] mir fällt gerade noch ein : der Variant braucht pro Einheit immer soviel Platz, wie das größte Element. Krasses Beispiel : der Variant besteht nur aus einem integer oder alternativ einem TImage von 5 MB. Der integer würde dann 5 MB belegen !! :cyclops: |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Die Frage steht aber bei Delphi-language und da ist das ein Variant. Guckt mal lieber noch nach meinem Edit oben, ob das unter Delphi wirklich noch so ist. :???:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Das mit dem Speicherverbrauch ist m.w. bei c genauso.
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
w.z.b.w. *g* |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
@Muetze1 : Du behauptest also ernsthaft, ein beliebiges TImage würde nur 4 Byte brauchen ? :shock: Erkläre mal, was 10 TImages in verketteter Liste brauchen, wobei jedes 1 MB hat und die sollen abgespeichert werden. Das mußt Du mir mal vormachen mit 40 Bytes für 10 TImages. :mrgreen: |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Was bedeutet eigentlich
Delphi-Quellcode:
wie es zum Beispiel in der Deklaration von TRect steht?
case Integer of
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Dass es nicht von einem Ordinaltyp im Record, sondern von der Art des Aufrufs abhängig ist.
Beispiel:
Delphi-Quellcode:
Achja: Mit "Keine Grundlage" meinte ich, dass man es als Anfänger nicht unbedingt wissen muss, sondern dass es eher etwas für Fortgeschrittene ist.
type
TARGB=record case Integer of 0: (Value: Integer); 1: (A, R, G, B: Byte); end; //... myARGB.Value:=$000000FF; //...ist das gleiche wie... myARGB.R:=255; |
Re: Erklärung von record (Delphihilfe unverständlich :))
Aha. Hat das einen Grund, warum es
Delphi-Quellcode:
heißt und nicht
case Integer of
0: { ... } 1: { ... }
Delphi-Quellcode:
oder vielleicht auch Byte heißt, oder ist das einfach nur Zufall?
case Boolean of
True : { ... } False: { ... } |
Re: Erklärung von record (Delphihilfe unverständlich :))
Ich denke mal das ist recht egal.
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Guck doch mal endlich in die Delphi-Hilfe. :roll: Hinter Case steht immer das, was später anhand seines Wertes ausgewertet werden muß. Im Case-Abschnitt für einen integer hat deshalb ein boolean-Wert nichts zu suchen und umgekehrt. Und bevor die nächste unvermeidliche Frage kommt : Ja, Strings, reals usw. gehen im Case nicht.
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Delphi-Quellcode:
Das müsste aber eigentlich gehen, wobei es aber irgendwie seltsam aussieht.
case Boolean of
True : { ... } False: { ... } |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
Delphi-Quellcode:
genauer erklärt. Damit hatte ich auch nie Probleme, <Name> ist dann auch eine Eigenschaft des records. Aber Integer ist ja keine Eigenschaft von TRect. Was ist dieser Integer, wo wird ihm etwas zugewiesen, könnte man statt
case <Name>:<Ordinal-Typbezeichner> of
Delphi-Quellcode:
auch
0: { ... }
1: { ... }
Delphi-Quellcode:
schreiben? Auslesen kann man anscheinend auch nicht, ob Integer 0 oder 1 ist, denn:
14: { ... }
15: { ... }
Delphi-Quellcode:
Delphi weiß, dass z.B. R.TopLeft.y = R.Top ist? Woher?
procedure TForm1.FormCreate(Sender: TObject);
var R: TRect; begin R := Rect(50, 50, 20, 20); Caption := IntToStr(R.TopLeft.y); end; |
Re: Erklärung von record (Delphihilfe unverständlich :))
Weil es der gleiche Speicherbereich ist... :roll:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
Hab das andere auch mal ausprobiert: Mit Boolean und anderen Typen geht das auch. |
Re: Erklärung von record (Delphihilfe unverständlich :))
Natürlich geht ds mit allen ordinalen Typen. Genau, wie beim "richtigen" Case.
Steht im Record
Delphi-Quellcode:
kann man vorher tatsächlich feststellen, welcher Wert vorliegt. Steht dort nur
case MeineVariable : Integer of
Delphi-Quellcode:
, dann geht es nicht.
case Integer of
Was dann im Case-Block für Fälle drin stehen, ist im Grunde völlig egal. Man muss für die Varianten nur einen Datentyp nehmen, der genügend Varianten verwalten kann. Nimmt man Boolean, gehen nur zwei Varianten. Beim Beispiel von TRect hätte Borland theoretisch auch ein Boolean statt Integer nehmen können, das es nur zwei Varianten gibt. |
Re: Erklärung von record (Delphihilfe unverständlich :))
hallo!
da ich noch kein "fortgeschrittener" bin, wollte ich mal die frage stellen, ob die records dann so etwas ähnliches wie eine klasse ist? es schaut jedenfalls fast gleich aus danke für die verbesserungen ;-) mr |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
Spätestens seit BDS 2006 kann man in Records auch Methoden verwenden.
Zitat:
Delphi-Quellcode:
verändert alle vier Bytes (A=255 und R,G,B = 0), während
myARGB.Value:=$000000FF;
Delphi-Quellcode:
Nur das eine Byte (Das zweite von rechts :mrgreen:) verändert.
myARGB.R:=255;
Ein 'Record' ist imho ein Überbleibsel aus den Anfängen der strukturierten Programmierung. Um alle Bits eines Bytes (in Standardpascal) anzusprechen, blieb nur dieses Konstrukt (AND/OR auf Byte-Ebene ging nicht, einer der Gründe warum es dann mal 'Turbopascal 1.0' gab):
Delphi-Quellcode:
Das 'packed' veranlasst(e) den Compiler, das Record so dicht wie möglich zu packen. Da ein Boolean genau ein Bit benötigt, ein Nibble (0..15) genau 5 bits, kann man so bei einem Byte sowohl auf die Nibbles (halbe Bytes) als auch auf die einzelnen Bits zugreifen. Leider klappt das mit dem Packed heute nicht mehr.
Type
TNibble = 0..15; TBitsNibblesAndByte = Packed Record Case Integer Of 0 : (TheByte : 0..255); 1 : (TheNibbles : Array [0..1] Of TNibble); 2 : (The Bits : Array [0..7] Of Boolean); End; Bei der Programmierung von Treibern (ja ja, ging früher, unter Win32 nicht mehr so leicht) sind häufig die Statusinformationen in den einzelnen Bits eines Statusbytes/Wortes kodiert. Durch die Deklaration eines geeigneten 'Packed Records' konnte man dann sehr elegant auf die einzelnen Informationen zugreifen. Heute verwendet man Masken und AND bzw. OR Soweit ich weiss (bin aber C-Laie), dürfte das heute in C auch noch gehen, das weiss ich aber nicht. |
Re: Erklärung von record (Delphihilfe unverständlich :))
@mkinzler: Wenn ich mich nicht irre, können records seit D2006 auch Methoden besitzen.
Man könnte records entfernt mit Klassen vergleichen, jedoch müssen Klassen instantiiert und freigegeben werden, das heißt der Programmierer muss sich darum kümmern, dass der Konstruktor vor dem ersten Zugriff aufgerufen wurde und dass die Klasse auch wieder freigegeben wird. Records hingegen werden von Delphi selbst verwaltet, auf die kann man also immer sofort zugreifen. Records können auch sehr leicht abgespeichert oder in Strömen verschickt werden. Sie können Methoden besitzen (ab D2006), aber verfügen IMHO nicht über Vererbung, Kapselung und das ganze Zeug drumherum. |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Re: Erklärung von record (Delphihilfe unverständlich :))
@3von8: Schön, den wichtigsten Unterschied hast du vergessen ;) .
Records sind Wertetypen, Klassen Referenztypen. Das ist der einzige Grund, warum Records noch nicht veraltet sind. In den übrigen Unterschieden gleichen sich beide Typen langsam aneinander an - natürlich beide in Richtung OOP: Records/Structs/... bekommen Methoden, Properties, Events und Konstruktoren, sogar ein wenig Vererbung durch Interfaces, Klassen werden genauso einfach verwaltbar wie Records. @mkinzler: Nein, meint er nicht ;) . |
Re: Erklärung von record (Delphihilfe unverständlich :))
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 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