В одном файле, у меня есть кусок кода, который идет как это:функция передается в качестве параметра вызывает ошибку E2035
// foo.pas
unit Foo;
type
FooExecutorMethod = function (param: Pointer) : Integer of Object;
FooExecutor = class
private
FMethod: TiTefExecutorMethod;
FMethodParam: Pointer;
FMethodResult: Integer;
public
function RunMethod(method: TiTefExecutorMethod; param: Pointer) : Integer;
end;
implementation
function FooExecutor.RunMethod(method: FooExecutorMethod; param: Pointer) : Integer;
begin
FMethod:= method; // Never gets assigned :(
FMethodParam:= param;
// Some threading logic here.
end;
В другом файле в том же проекте, я получил что-то вроде этого:
// bar.pas
uses Foo;
type
bar = class
protected
executor: FooExecutor;
function doSomething(params: Pointer): Integer;
Constructor Create(params: Pointer);
implementation
Function bar.doSomething(params: Pointer) : Integer;
begin
// Do something with the pointer
Result := 1;
end;
Constructor bar.Create(params: Pointer)
var
r: Integer;
begin
executor := FooExecutor.Create
r := executor.RunMethod(doSomething, params);
end;
Проблема в том, bar.DoSomething
никогда не выполняется. При отладке FooExecutor.RunMethod
, оценщик не показывает значение его параметра «method
» - это показывает следующее вместо:
E2035 Не хватает фактических параметров
И таким образом, я не могу использовать ссылку до bar.DoSomething
.
Что я делаю неправильно?
Вы не показываете свое заявление для TiTefExecutorMethod. Это просто опечатка, которая должна читать FooExecutorMethod? Ошибка E2035, вероятно, не о чем беспокоиться - это просто средство оценки выражений, пытающееся выполнить функцию, чего, конечно, не может сделать. И, как комментирует Дэвид Хеффернан, в RunMethod вы просто сохраняете параметры. Вы на самом деле ничего не делаете с ними. – Dsm