Mist, ich war zu langsam... aber egal.
Delphi hat quasi drei verschiedene Array-Typen, deren Details sich voneinander unterscheiden, und die nicht direkt Zuweisungskompatibel sind.
- Statische Arrays:
Test: array [0..9] of Integer;
Test2: array [0..15, 0..31] of Byte;
usw.
Das sind einfach nur zusammenhängende Speicherblöcke entsprechender Größe.
- Dynamische Arrays:
Test: array of Integer;
Test2: TIntegerDynArray; // alter Typ bevor es Generics gab
Test3: TArray<Integer>; // neuer Typ nach Generics
Das sind Zeiger (Pointer) auf dynamisch allozierten Heap-Speicher.
Mehrdimensionale DynArrays (z.B. "Test3: array of array of Integer") sind deshalb keine zusammenhängende Speicherblöcke, sondern Zeigerlisten (array of Pointer), die auf weitere Zeigerlisten verweisen, bis man in der letzten Dimension angekommen ist.
- Offene Array-Parameter:
Kommen als Funktions/Prozedurparameter zum Einsatz, wenn man solche Deklarationen vornimmt:
procedure MachWas(Werte: array of Integer);
function function Format(const Format: string; const Args: array of const): string;
Dein erstes Beispiel, "pDo1D", benutzt also einen offenen Array-Parameter.
Das zweite, "pDo2D", dagegen ein dynamisches Array.
Neuere Delphi-Versionen (ab XE8?) haben erweiterte Syntax für dynamische Arrays bekommen, so dass z.B. das hier möglich ist:
Test := [1, 2, 3, 4];
Damit könnte vielleicht auch ein Funktionsaufruf mit der Syntax offener Array-Parameter funktionieren.
Sonst musst du so vorgehen:
Delphi-Quellcode:
type
T2DControls = Array of Array of TControl;
procedure pDo2D(lCs: T2DControls);
procedure Click;
var
C: T2DControls;
begin
SetLength(C, 2, 4); // Dimension des Arrays = 4 Spalten, 2 Zeilen
C[0, 0] := lControl1;
C[0, 1] := lControl2;
C[0, 2] := lControl3;
C[0, 3] := lControl4;
C[1, 0] := lControl5;
C[1, 1] := lControl6;
C[1, 2] := lControl7;
C[1, 3] := lControl8;
C[2, 0] := lControl9;
// usw.
pDo2D(C);
end;
Oder warum nimmst du nicht einfach ein (offenes) eindimensionales Array und "simulierst" die zweite Dimension (genauso funktionieren mehrdimensionale statische Arrays):
ElementXY := MyArray1D[Y * Breite + X];
Wobei X von 0 bis Breite-1 läuft, und Y von 0 bis Höhe-1.