// Hiermit kann man
dynamische Arrays, welche vom gleichen Typ
// sind, zusammenfassen.
// Getestet mit D4 unter XP
// Variante 1
//
Arrays mit Elementen feststehender Größe
//
(keine Huge
Strings, aber Shortstrings)
// Hier mit
Integer-Werten
type
constantsize = Integer;
// Cardinal, Byte, Smallint, Int64, Word, Char, Double, Single usw.
arr = array of constantsize;
var
grsse: integer = sizeof(constantsize);
procedure DynArrayConcat(var f: arr; a: array of arr);
var x, lg: integer;
begin
f := nil;
for x := 0 to high(a) do begin
lg := length(a[x]);
setlength(f, length(f) + lg);
move(a[x][0], f[length(f) - lg], grsse * lg);
end;
end;
// Beispielaufruf
procedure TForm1.Button3Click(Sender: TObject);
var
a1, a2, a3, gesamt: arr;
begin
setlength(a1, 2);
a1[0] := 11111;
a1[1] := 2222;
setlength(a2, 3);
a2[0] := 333;
a2[1] := 4;
a2[2] := 55;
setlength(a3, 1);
a3[0] := 666;
DynArrayConcat(gesamt, [a1, a2, a3]);
// nicht Gebrauchtes löschen
a1 := nil;
a2 := nil;
a3 := nil;
// zum Testen
showmessage(inttostr(gesamt[5]));
end;
//
--------------------------------------------------------
// Variante 2 (langsamer als Variante 1)
// Für Arrays
mit Elementen unterschiedlicher Größe
//
(aber auch mit
Elementen feststehender Größe)
type
arr = array of string;
procedure DynArrayConcat(var f: arr; a: array of arr);
var x, y, lg: integer;
begin
f := nil;
for x := 0 to high(a) do begin
lg := length(a[x]);
setlength(f, length(f) + lg);
for y := 0 to pred(lg) do
f[length(f) + y - lg] := a[x][y];
end;
end;
// Beispielaufruf
procedure TForm1.Button3Click(Sender: TObject);
var
a1, a2, a3, gesamt: arr;
begin
setlength(a1, 2);
a1[0] := 'abc';
a1[1] := 'ABCDEFG';
setlength(a2, 3);
a2[0] := 'Test';
a2[1] := 'Versuch';
a2[2] := 'Delphi';
setlength(a3, 1);
a3[0] := 'DBR';
DynArrayConcat(gesamt, [a1, a2, a3]);
// nicht Gebrauchtes löschen
a1 := nil;
a2 := nil;
a3 := nil;
// zum Testen
showmessage(gesamt[5]);
end;
// --- oder auch ---
:
type
arr = array of Variant;
procedure DynArrayConcat(var f: arr; a: array of arr);
var x, y, lg: integer;
begin
f := nil;
for x := 0 to high(a) do begin
lg := length(a[x]);
setlength(f, length(f) + lg);
for y := 0 to pred(lg) do
f[length(f) + y - lg] := a[x][y];
end;
end;
// Beispielaufruf
procedure TForm1.Button3Click(Sender: TObject);
var
a1, a2, a3, gesamt: arr;
begin
setlength(a1, 2);
a1[0] := 100;
a1[1] := 12.75;
setlength(a2, 3);
a2[0] := 77.5;
a2[1] := 'Versuch';
a2[2] := 'Delphi';
setlength(a3, 1);
a3[0] := 333;
DynArrayConcat(gesamt, [a1, a2, a3]);
// nicht Gebrauchtes löschen
a1 := nil;
a2 := nil;
a3 := nil;
// zum Testen
showmessage(gesamt[5]);
end;
|