Вызов локальных процедур из списка 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;
→ Ссылка