hier mal ein bissl was zum Lesen:
http://docwiki.embarcadero.com/RADSt...n_Record-Typen
http://www.fh-jena.de/contrib/fb/gw/.../pas_recv.html
Der Typ zur Kennzeichnung des Varianten Teils ist egal, das könnte auch ein Enumerator sein.
Delphi-Quellcode:
TMyVarRec = packed record
normal: irgendwas;
case Boolean of
True: (...);
False: (...);
//end // Achtung: dieses End gibt es blöder Weise nicht
end;
TMyEnum = (eFirst, eNext);
TMyVarRec = packed record
normal: irgendwas;
case TMyEnum of
eFirst: (...);
eNext: (...);
//end // Achtung: dieses End gibt es blöder Weise nicht
end;
Falls es wichtig ist, sich zu merken, welchen Teil man verwendet hat, dann kann man dieses mit angeben:
Delphi-Quellcode:
TMyVarRec = packed record
normal: irgendwas;
case Kennung: Integer of
0: (...);
1: (...);
end;
Und von der Speicherverwaltung her, sieht es nun quasi so aus:
Delphi-Quellcode:
TMyVarRec = packed record
normal: irgendwas;
Kennung: Integer;
case Integer of
0: (...);
1: (...);
end;
Die varianten Teile liegen alle im Speicher am selben Ort, so daß der Record
Delphi-Quellcode:
TMyVarRec = packed record
normal: irgendwas;
case Integer of
0: (TheWord: Word);
1: (TheLowByte, TheHighByte: Byte);
end;
eigentlich 2 übereinandergelegte Records darstellt:
Delphi-Quellcode:
TMyVarRec = packed record
normal: irgendwas;
TheWord: Word;
end;
Delphi-Quellcode:
TMyVarRec = packed record
normal: irgendwas;
TheLowByte: Byte;
TheHighByte: Byte;
end;
Man kann dieses also einmal für eine Typenkonvertierung nutzen,
indem man z.B. MyVar.TheWord etwas zuweist und dann über MyVar.TheLowByte und MyVar.TheHighByte dieses als anderen Typen wieder ausließt.
Oder man kann
einen Records auch für unterschiedliche Dinge benutzen, ohne daß man immer für alles Platz reservieren müßte, wo man doch nur für Eines den Platz benötigt.
Delphi-Quellcode:
TFahrzeugTypen = (ftBoot, ftAuto, ftFahrad);
TFahrzeug = packed record
Name: String;
Hersteller: String
case Typ: TFahrzeugTypen of
ftBoot: (
Wassertiefe: Integer;
GeschwindigkeitInKnoten: Real);
ftAuto: (
AnzahlDerAchsen: Integer;
GeschwindigkeitInKilometerProStunde: Integer);
ftFahrad: (
...);
end;
Ich hoff' das klärt die ganze Sache soweit auf.