DELPHI - Как объявить процедуру в качестве аргумента в других процедурах? - PullRequest
0 голосов
/ 23 октября 2019

Мне нужна функция, подобная приведенному ниже коду (не работает! Это просто пример)

type
  TCallBack = procedure( x:String) of object;

procedur procA(CallBack : TCallBack);
begin
    CallBack('hello world')
end;

, а затем запустить процедуру в качестве параметра:

procA( procedure (res : string)
begin
    ShowMessage(res);
end);

1 Ответ

4 голосов
/ 23 октября 2019

Исходя из вашего синтаксиса на сайте CALLING, кажется, что вы хотите объявить процедуру, которая будет вызываться встроенной на сайте вызова.

Если это так, вам не следует использовать определение OF OBJECT, а ССЫЛКУ НА:

type
  TCallBack = reference to procedure(x : String);

Затем вы можете использовать свой код:

procedure procA(CallBack : TCallBack);
begin
    CallBack('hello world')
end;

procA(procedure (res : string)
        begin
          ShowMessage(res);
        end);

РЕДАКТИРОВАТЬ: Пример кода

type
  TCallBack = reference to procedure(x : String);

procedure procA(CallBack : TCallBack);
begin
    CallBack('hello world')
end;

procedure TForm59.FormCreate(Sender: TObject);
begin
procA(procedure (res : string)
        begin
          ShowMessage(res);
        end);

end;

РЕДАКТИРОВАТЬ: Использование события CallBack из потока:

PROCEDURE TWebThread.Execute;
  BEGIN
    .
    .
    .
    Synchronize(PROCEDURE
                  BEGIN
                    CallBack('Hello World')
                  END)
  END;

Но тогда вы должны убедиться, что любые переменные, к которым вы обращаетесь из встроенной процедуры, все еще действительны во время вызова обратного вызова, поэтому не используйте локальные переменные, так как они могутхорошо вышли за рамки. Кроме того, убедитесь, что все экземпляры CLASS, которые вы используете во встроенной процедуре, не были свободны или иным образом недействительны между временем создания потока и временем выполнения события обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...