![]() |
Record erweitern
Hallo,
mal ne Frage: Kann ich in einem Rekord mit 2 Variablen auf die gleiche Speicherstelle verweisen? Gruß BBB |
Re: Record erweitern
Mit varianten Records (Hilfe sagt dazu mehr) geht das:
Delphi-Quellcode:
felder1 und felder2 haben nun den gleichen Startpunkt im Speicher.
... = record
... case Integer of 1: (felder1); 2: (felder2); end; |
Re: Record erweitern
mal ein praktisches Beispiel:
Delphi-Quellcode:
Weiteres siehe Delphihilfe
type
LongRec = packed record case Integer of 0: (Lo, Hi: Word); 1: (Words: array [0..1] of Word); 2: (Bytes: array [0..3] of Byte); end; Abschnitt: ![]() |
Re: Record erweitern
Ich will ein vorhandenes Record
Delphi-Quellcode:
so erweitern:
rec=record
p1:tpoint; p2:tpoint; p3:tpoint; p4:tpoint; end;
Delphi-Quellcode:
ggf. auch mit pointern. So dass ich mit rec.p1 und rec.p[1] auf den gleichen Wert zugreife.
rec=record
p1:tpoint; p2:tpoint; p3:tpoint; p4:tpoint; p:Array[1..4]of tpoint; end; |
Re: Record erweitern
wie zu sehn ... ist es doch recht einfach :angel:
Delphi-Quellcode:
oder
type
Rec = record case Integer of 0: (p1: TPoint; p2: TPoint; p3: TPoint; p4: TPoint); 1: (p: Array[1..4] of TPoint); end;
Delphi-Quellcode:
type
Rec = record case Integer of 0: (p1, p2, p3, p4: TPoint); 1: (p: Array[1..4] of TPoint); end; |
Re: Record erweitern
gut funktionieren tut es, aber verstanden hab ich's trotz Durchlesen der Hilfe noch nicht.
Was sagt mir
Delphi-Quellcode:
?
case integer of
Sollte der Selektor einer CaseAnweisung nicht eine Variable sein??? In der Hilfe steht: Zitat:
Delphi-Quellcode:
immer gilt p1=p[1], p2=p[2]...?
type
Rec = record case Integer of 0: (p1, p2, p3, p4: TPoint); 1: (p: Array[1..4] of TPoint); end; |
Re: Record erweitern
Wenn du noch ein packed rein setzt sollte das sicher so sein, ohne bin ich nicht sicher, ob dir das Alignment nicht reinpfuscht.
|
Re: Record erweitern
Jupp, davon kanns du ausgehen (nja, zumindestens die Feldausrichtung im Record dieses hergibt)
drum verwende ich oftmals ganz gern packed Records und Arrays
Delphi-Quellcode:
ohne Feldnahmen im CASE wird der dort angegebene Type zur Unterteilng er einzelnen überlagerten Teile verwendet
Rec = record
case x: Integer of 0: (p1, p2, p3, p4: TPoint); 1: (p: Array[1..4] of TPoint); end;
Delphi-Quellcode:
Rec = record
case Boolean of false: (p1, p2, p3, p4: TPoint); true: (p: Array[1..4] of TPoint); end; // oder MySet = (msPoints, msPointArray); Rec = record case Boolean of msPoints: (p1, p2, p3, p4: TPoint); msPointArray: (p: Array[1..4] of TPoint); end; bezüglich der "Variable"
Delphi-Quellcode:
in diesem Fall könnte man X z.B. dazu verwenden welche Defiinition verwendet wird.
Rec = record
case x: Integer of 0: (p1, p2, p3, p4: TPoint); 1: (p: Array[1..4] of TPoint); end; // entspricht Rec = record x: Integer; case Integer of 0: (p1, p2, p3, p4: TPoint); 1: (p: Array[1..4] of TPoint); end; // bzw. Rec = record x: Integer; p1, p2, p3, p4: TPoint; end; vorallem nützlich, wenn man da unterschiedliche ypen einbaut
Delphi-Quellcode:
Rec = record
case verwendet: Integer of 0: (s: string); 1: (i: integer); 2: (b: byte); end; |
Re: Record erweitern
Also. ich werde das nur für gleiche Typen nutzen. Ich will einfach ein vorhandenes Record so erweitern, dass ich über ein Array auf die Punkte zugreifen kann, was das arbeiten damit einfacher macht. Leider ist das Record 20 Jahre alt und eine generelle Umstellung wäre fatal.
Besten Dank! und schönen Feierabend! |
Re: Record erweitern
seit 'ner Weile (ich glaub Delphi 2006) geht auch Folgendes:
Delphi-Quellcode:
also fast so wie man es auch von den Klassen her kennt.
TRec = record
p1, p2, p3, p4: TPoint; private function ReadP(index: integer): TPoint; procedure WriteP(index: integer; p: TPoint); public property p[index: integer]: TPoint read ReadP write WriteP; procedure ReadP3: TPoint; end; function TRec.ReadP(index: integer): TPoint; begin case index of 1: result := p1; 2: result := p2; 3: result := p3; 4: result := p4; end; end; procedure TRec.WriteP(index: integer; p: TPoint); begin case index of 1: p1 := p; 2: p2 := p; 3: p3 := p; 4: p4 := p; end; end; procedure TRec.ReadP3: TPoint; begin result := p3; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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 by Thomas Breitkreuz