var Arr: TArray<T>
funktioniert, vielen Dank! Wieder etwas gelernt...
Edit: Ich kann kein
a: array of Integer
übergeben, sondern nur ein
a: TArray<Integer>
, aber das ist vertretbar, denn TArray ist definiert als:
TArray<T> = array of T
.
Edit2: Klappt super, außer mit
TArray<Pointer>
oder
TArray<TMyRecordType>
... Also etwas genauer:
Delphi-Quellcode:
type
TProcArray = TArray<Pointer>;
...
procedure UnRegisterEvt(var Evts: TProcArray; Handler: Pointer);
var
i: Integer;
begin
i := HandlerIndex(Evts, Handler);
if i > -1 then
TArrays.Remove(Evts, i); // Compilerfehler: E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
end;
Delphi ist hier also nicht clever genug, um mitzukriegen, dass als generischer Typ Pointer eingesetzt werden muss. Ich will an dieser Stelle auch nicht Pointer hardcoden, denn dann könnte ich mir die Typdefinition von TProcArray sparen. Bei Klassen gibt es die Methode ClassType von TObject, die den Klassentyp einer Instanz zurückgibt. Kann man irgendwie auch für "normale Variablen" den Typ bestimmen? So etwas wie
TArrays.Remove<TypeOf(Evts[0])>(Evts, i);
würde mir sehr gefallen.
Edit3: Sorry, dass die Edits hier so ausufern...
TArrays.Remove<TypeOf(Evts[0])>(Evts, i);
ist natürlich nicht möglich, da Generics ja zur Compiletime "übersetzt" werden. Ich habe also folgende Änderung gemacht:
Delphi-Quellcode:
type
TProcFunc = Pointer; // TProc gibt es schon in SysUtils
TProcFuncArray = TArray<TProcFunc>;
...
TArrays.Remove<TProcFunc>(Evts, i); // kein Compilerfehler mehr, die Annahme, dass TProcFuncArray ein Array aus TProcFuncs ist, ist denke ich annehmbar.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."