Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: case Integer of

  Alt 28. Aug 2010, 06:25
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Aug 2010 um 06:43 Uhr)
  Mit Zitat antworten Zitat