Moin Hazardos,
Zitat von
Hazardos:
Nun ist es aber zu spät..
nicht unbedingt
Leider funktionieren HugeStrings nicht in varianten Teilen von Records, aber wenn man sich einfach noch ein paar Typen deklariert, so dass am Ende ein Typ herauskommt, der genauso gross ist, wie der ursprüngliche (Typ String ist eigentlich nur ein Pointer, also 4 Byte), kann man sich durch ein wenig Speicher kopieren aus diesem Problem retten.
Delphi-Quellcode:
TcsProg = array [1..10] of string;
TcsName = array [1..10] of string;
TcsSubRec = record
Name : String;
Exe : String;
iscategory : Boolean;
asProg : TcsProg;
asName : TcsName;
end;
TcsRecord = record
Prog : array [1..25] of TcsSubRec;
end;
var daten : datensatz;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
rWork : TcsRecord; // Das neue Format mit Arrays
pArray : Pointer;
pLines : Pointer;
begin
Daten.Prog1.Name := 'Name';
Daten.Prog1.Exe := 'EXE';
Daten.Prog1.Programm1 := 'Prog1';
Daten.Prog1.Name1 := 'Name1';
Daten.Prog25.Programm10 := '25Prog250';
Daten.Prog25.Name10 := '25Name10';
// Umgehen des Problems mit den varianten Teilen im Record
pArray := @rWork; // Adresse der Variablen im neuen Format
pLines := @Daten; // Adresse der Variablen im alten Format
// Da der Aufbau von beiden Datentypen intern der gleiche ist
// kann jetzt einfach der eine in den anderen kopiert werden
CopyMemory(pArray,pLines,SizeOf(rWork));
// Und der Zugriff auf auf das Array klappt
ShowMessage(rWork.Prog[25].asName[10]);
// geht auch umgekehrt
rWork.Prog[13].asName[5] := 'HALLO';
// nur muss man hier den Pointer für Quelle und Ziel vertauschen
CopyMemory(pLines,pArray,SizeOf(rWork));
// aber auch so herum geht's
ShowMessage(Daten.Prog13.Name5);
end;
Am Besten wäre es vielleicht sich für dieses hin und her kopieren eine Funktion zu basteln.
Wenn Du die Daten speichern willst, wird's allerdings interessant, dann muss man sich noch was einfallen lassen.