Ich denke nicht dass das genau so geht wie du es möchtest.
Eine record muss bei der declaration wissen wieviel Speicher er braucht.
Du kannst zwar einen Variant Record bauen der dir nur einen Teil seines Speichers ausgibt,
Delphi-Quellcode:
TBeispiel = record
case integer of
1: (zahl1: integer;);
2: (zahl2: int64;);
end;
end;
// gibt jenachdem welche zahl du ansprichst verschiedene typen zurück
// wenn ein int32 drin steht geben beide das gleiche ergebnis
// wenn ein int64 drin steht gibt zahl1 nur die unteren 32bit zurück, zahl2 aber den gesamten int 64
aber es wird trotzdem soviel angelegt wie maximal gebraucht wird.
Der case gibt nur verschiedene möglichkeiten an den angelegten Speicher zu interpretieren, aber alle variablen zeigen auf die gleiche Stelle im Speicher.
Wenn es also darum geht Speicher zu spaaren geht das meiner Meinung nach so nicht.
Und da du den einen Teil der Variablen ja in jedem Fall brauchst, macht es genau garkeinen Unterschied ob du den zweiten Teil in einem case declarierst.
Du könntest aber ein Zweidimensionales array anlegen und nur in deinem Einzelfall etwas in das zweite Feld schreiben.
Delphi-Quellcode:
TBeispiel = record
Textsize: byte;
text, item: string;
x, y, height, width: integer;
end;
var
table1, table2: array of array of TBeispiel;
procedure Fill;
var
beispiel1: TBeispiel;
beispiel2: TBeispiel;
begin
beispiel1:= irgendwas;
beispiel2:= irgendwas;// irgendwas in die records schreiben^^
setlength(table1, 1, 1);//speicher für das erste element der tabelle anlegen
table1[0,0] := beispiel1;// erstes tabellenelement füllen
if table1[0].textsize = 2 then begin//testsize abfragen
setlength(table1, 1, 2);//speicher für das zweite element der tabelle anlegen
table1[0,1]:= beispiel2;//zweites tabellenelement füllen
end;
end;
//nicht getestet^^
Das wäre mein Ansatz um Speicher zu spaaren.
table1/2 sind arrays in denen zum einen dein record steht und zum andern noch ein record für die zusätzlichen variablen.
Der zweite record wird aber nur angelegt(per setlenght(table,1,2)) wenn textsize = 2 ist. Damit spaarst du dir in allen fällen in denen textsize <> 2 ist den gesamten Speicher für den zweiten record. (in den restlichen hast du durch meine Faulheit 25 überflüssige bytes in den beiden strings und dem byte, aber ist ja nur ein Ansatz^^)