// 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;


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke