2015-10-05 2 views
0

В одном файле, у меня есть кусок кода, который идет как это:функция передается в качестве параметра вызывает ошибку 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.

Что я делаю неправильно?

+0

Вы не показываете свое заявление для TiTefExecutorMethod. Это просто опечатка, которая должна читать FooExecutorMethod? Ошибка E2035, вероятно, не о чем беспокоиться - это просто средство оценки выражений, пытающееся выполнить функцию, чего, конечно, не может сделать. И, как комментирует Дэвид Хеффернан, в RunMethod вы просто сохраняете параметры. Вы на самом деле ничего не делаете с ними. – Dsm

ответ

0

Метод никогда не выполняется, потому что вы его никогда не называете. Все, что вы делаете, это передать ссылку на метод. Но вы никогда не называете это.

Вы назвали бы это так:

function FooExecutor.RunMethod(method: FooExecutorMethod; param: Pointer): Integer; 
begin 
    Result := method(param); 
end; 

Очевидно ваш код пытается сделать что-то еще, но это, как вызов метода.