2015-05-19 3 views
-1

У меня есть этот код>Проходя процедуру в качестве параметра в Delphi

type 
    TCallBack = procedure(APerc: Integer) of object; 

....

procedure CallingProcedure(a, b, c: Integer; ACallBack: TCallBack = nil); 

....

Я называю эту функцию из моего основного класса/объект такой:

CallingProcedure(1, 2, 3, DoOnCallBack); 

, где Do OnCallBack определяется как:

procedure DoOnCallBack(APerc: Integer); 

Это компилируется хорошо, это не проблема - я сделал это много раз.

Но в CallingProcedure, когда я хочу проверить, назначено ли Assigned (ACallBack), я получаю False.

Может кто-нибудь сказать мне, что я делаю неправильно.

Я называю это из Thread, это может быть проблемой?

+3

Не должно быть никаких проблем из-за того, что я вижу. Можете ли вы опубликовать SSCCE, который демонстрирует проблему. – Graymatter

+3

Это компилируется? Я так не думаю ... 'DoOnCallback' является обычной процедурой -' TCallBack' определяется как 'процедура объекта'. Можете ли вы отправить свой реальный код, пожалуйста? –

+1

Два человека жаловались на код, который не демонстрирует проблему, но не проголосовали за закрытие. Вопросы с фиктивным кодом здесь не обсуждаются. –

ответ

1

Я не понимаю, где вы его назвали. Синтаксис тот же. Я только что сделал этот небольшой пример испытания:

type 
    TCallBack = procedure(APerc: Integer) of object; 
    TForm20 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure CallingProcedure(a, b, c: Integer; ACallBack: TCallBack = nil); 
    procedure DoOnCallBack(APerc: Integer); 
    public 
    { Public declarations } 
    end; 

var 
    Form20: TForm20; 

implementation 

{$R *.dfm} 

procedure TForm20.CallingProcedure(a, b, c: Integer; ACallBack: TCallBack); 
begin 
    if Assigned(ACallBack) then 
    ACallBack(a); 
end; 

procedure TForm20.DoOnCallBack(APerc: Integer); 
begin 
    ShowMessage(IntToStr(APerc)); 
end; 

procedure TForm20.FormCreate(Sender: TObject); 
begin 
    CallingProcedure(1, 2, 3, DoOnCallBack); 
    CallingProcedure(1, 2, 3, nil); 
end; 

И это работает просто отлично. Скорее всего, код выглядит так. Поскольку вы не отправили свой реальный код, я могу только догадываться, в чем проблема.

+1

Мне очень жаль неудобства и глупого вопроса. Этот код работает отлично, но после 14 часов кодирования я не понимал, что я вызываю функцию из другого места, где по умолчанию всегда был NIL ... Извините за ваше время и спасибо за ответы !! –

Смежные вопросы