Страница 1 из 1
Вызов процедуры.
Добавлено: 19.10.2015 11:57:25
Tsuyu
В чем разница между обычным вызовом и вызовом (по ссылке?) ?
Пример:
Так работает:
Так не работает:
Re: Вызов процедуры.
Добавлено: 19.10.2015 12:38:08
gvido
Tsuyu писал(а):В чем разница между обычным вызовом и вызовом (по ссылке?) ?
Пример:
Так работает:
Так не работает:
Последний вариант, будет работать в дельфи. Там многое лишнего позволено.
Re: Вызов процедуры.
Добавлено: 19.10.2015 14:26:41
Лекс Айрин
Tsuyuя не знаю как определено ChangeTool, но очень похоже, что это не процедура, а ссылка на нее, соответственно, второй вариант и не должен быть верным. Ведь не всегда ссылка ведет на процедуру. она может быть равна и nul.
Re: Вызов процедуры.
Добавлено: 21.10.2015 12:30:30
Tsuyu
Лекс Айрин писал(а):Tsuyuя не знаю как определено ChangeTool, но очень похоже, что это не процедура, а ссылка на нее, соответственно, второй вариант и не должен быть верным. Ведь не всегда ссылка ведет на процедуру. она может быть равна и nul.
Код: Выделить всё
procedure TMainWindow.ChangeTool(Sender: TObject);
begin
CurToolIndex := (Sender as TSpeedButton).Tag;
end;
Re: Вызов процедуры.
Добавлено: 21.10.2015 13:52:05
Лекс Айрин
Tsuyu, то, что вы указали тело процедуры, а не определение. Вы лучше дайте определение из интерфейсной части. Но, если я правильно понял, что TMainWindow форма, то onClick определяется как:
Код: Выделить всё
property OnClick: TNotifyEvent read FOnClick write FOnClick;
где
Код: Выделить всё
TNotifyEvent = procedure(Sender: TObject) of object;
FOnClick: TNotifyEvent;
то есть, onClick это, фактически, ссылка на адрес процедуры. ChangeTool же обычная процедура. Следовательно, для приведения их друг к другу, требуется взятие адреса процедуры.
Re: Вызов процедуры.
Добавлено: 21.10.2015 15:28:47
runewalsh
Это просто разный синтаксис для одного и того же. Не помню, какой вариант в каком режиме ({$mode delphi}, {$mode objfpc}, {$mode fpc}) работает, но лучше использовать тот, что предполагает @, иначе получается неоднозначность:
Код: Выделить всё
function F: pointer;
var p: pointer;
p := F; // вызов функции или взятие адреса?
// В C-подобных языках это разрешается обязательностью пустых скобок: p = F — ссылка на функцию, p = F() — вызов.
Re: Вызов процедуры.
Добавлено: 21.10.2015 16:09:35
Лекс Айрин
runewalsh писал(а):Это просто разный синтаксис для одного и того же.
Если так считать, то тогда и начинаются проблемы. Человек со временем может перестать понимать где есть ссылка на процедуру/функцию, а где она сама.