Moin Ernie,
also das mit dem packed war die "Macht der Gewohnheit". Meist benutze ich Records für Dateien, und da macht das schon Sinn, um Lücken zwischen den einzelnen Datenfeldern zu vermeiden.
In Deinem Falle wirst Du wohl darauf verzichten können. Wie Du schon so richtig bemerkt hast drückt das auf die Performance.
Nun zum eigentlichen Problem:
Ist schon richtig, zum Speichern/Auslesen musst Du entscheiden, ob es sich nun um einen numerischen Wert handelt oder nicht.
Der Vorteil ist halt, dass Du nur einmal Speicher belegen musst, und ihn, je nach Art des Datums anders interpretieren kannst.
Code:
type
TMyVariantRecord =
record
fNumeric : Boolean;
case Boolean of
false :
(sContent : string[SizeOf(Extended)]);
true :
(exContent : extended);
end;
var
vr : TMyVariantRecord;
begin
// speichern
vr.fNumeric := true;
try
vr.exContent := StrToFloat(Edit1.Text);
except
vr.fNumeric := false;
vr.sContent := Edit1.Text;
end;
// auslesen
if vr.fNumeric then
begin
ShowMessage('Numerisch: '+FloatToStr(vr.exContent));
end
else
begin
ShowMessage('Text:'+vr.sContent);
end;
end;
So ist es auch möglich ein array of TMyVariantRecord anzulegen, bei dem die numerischen und nicht numerischen Werte problemlos gemischt gespeichert werden können. Man braucht nur eine Variable, und kann anhand des Flag Feldes entscheiden, wie der Inhalt jeweils zu interpretieren ist.
Um das zu tun, was Deiner Vorstellung entspricht, müsstest Du wohl den Typ Variant nehmen. Dem kannst Du beliebig Werte unterschiedlicher Typen zuweisen.
Aber der ist so richtig langsam.