Вызов локальных процедур из списка pointer в Delphi
Как вызвать локальные процедуры из списка т.е по ссылке на нее?
Пробовал через:
TProc = procedure of object;TProc = procedure;TProc = reference to procedure;
ничего не работает. Может через asm только можно?
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
procedure Loc1;
begin
ShowMessage('1' + Self.Memo1.Name + ' cl:' + Sender.ClassName);
end;
procedure Loc2;
begin
ShowMessage('2' + Self.Memo1.Name + ' cl:' + Sender.ClassName);
end;
procedure Loc3;
begin
ShowMessage('3' + Self.Memo1.Name + ' cl:' + Sender.ClassName);
end;
type
TProc = procedure of object;
var
L: TAmListVar<Pointer>;
M: TMethod;
begin
L.Add(@Loc1);
L.Add(@Loc2);
L.Add(@Loc3);
M.Data := Self;
M.Code := L[1];
TProc(M)();
end;
Вот так получилось вызвать, но есть ли вариант без asm?
P := @Loc1;
asm
push ebp
call [P]
pop ecx
end;
Ответы (1 шт):
Автор решения: Kromster
→ Ссылка
И не будет оно так работать. (Тут хорошее объяснение - https://stackoverflow.com/a/15183713/77764)
А вот так - будет:
procedure TForm.FormCreate(Sender: TObject);
type
TProc2 = reference to procedure;
var
L: TList<TProc2>;
p: TProc2;
begin
L := TList<TProc2>.Create;
p := procedure begin showmessage('1 cl:'+Sender.ClassName); end;
L.Add(p);
p := procedure begin showmessage('2 cl:'+Sender.ClassName); end;
L.Add(p);
L[0]();
L[1]();
L.Free;
end;