Te írtad:
for i:=0 to (Self.ProcList.Count - 1) do
TProcVar(Self.ProcList.Items[i]^)();
Ezzel nem a mutatott címen kezdődő eljárást hívod, hanem onnan veszed az eljárás címét. Tehát az ott található eljárás első négy bájtját (ami gépi kódú utasítás) úgy használod mintha az az eljárásra mutató pointer lenne. Ráadásul közbeszólhat az operációs rendszer is hogy kódterületről nem olvashatsz adatot. Szerintem a következő módon próbáld hívni a tárolt rutint:
for i:=0 to (Self.ProcList.Count - 1) do
Self.ProcList.Items[i]();
Mivel az alábbi hibátlanul működik:
type
TProc=procedure;//a procedurális tipus meghatározása
var
ProcVar:TProc; //ez veszi fel a procedura címét
List:array[0..7]of TProc; //a procedurák címeinek listája
procedure TheProc; //ennek a címét kell a listába tenni
begin
WriteLn('Hello Cruel World!'); //ezt fogja kiírni ha minden jól megy
end;
begin
//List[0]:=@TheProc; // :)
ProcVar:=@TheProc; //a procedure címének változóba helyezése
List[0]:=ProcVar; //a változó értékének listába helyezése
List[0]; //a procedure meghívása így történik
end.