![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как правильно сравнить процедуры
Евгений Р. © (2008-10-07 14:59:00)необходимо проверить является ли процедура OnClick нужной процедурой:
if PopUpMenu.Items[i].OnClick<>procedure1 then
компилятор сообщает:
[Error] MnuVest.pas(207): E2035 Not enough actual parameters
Palladin (2008-10-07 18:46:00) [1]
> Если m1 и m2 объявить как TNotifyEvent
то мы будем вынуждены отказаться от универсального подхода к сравнению
Григорьев Антон (2008-10-07 16:37:00) [2]Если m1 и m2 объявить как TNotifyEvent, можно избавиться от раскладывания на адрес кода и адрес класса при присваивании.
var
m1, m2: TNotifyEvent;
begin
m1 := PopUpMenu.Items[i].OnClick;
m2 := procedure1;
if (TMethod(m1).Code = TMethod(m2).Code) and (TMethod(m1).Data = TMethod(m2).Data) then
...
end;
При сравнении Data и Code всё равно приходится сравнивать отдельно. Более естественная конструкция if @m1 = @m2 then ... тут не проходит, т.к. в компиляторе здесь явная ошибка: при таком сравнении он учитывает только адрес кода метода, но не учитывает адрес объекта, к которому этот метод относится.
Palladin (2008-10-07 15:25:00) [3]или еще проще
If (TMethod(PopUpMenu.Items[i].OnClick).Data=ОбъектТТвойКлассСПроцедурой1) and
(TMethod(PopUpMenu.Items[i].OnClick).Code=@ТТвойКлассСПроцедурой1.procedure1)
Then ShowMessage('da') Else ShowMessage('net');
Palladin (2008-10-07 15:18:00) [4]
Var
m1,m2:TMethod;
begin
m1:=TMethod(PopUpMenu.Items[i].OnClick);
m2.Code:=@ТТвойКлассСПроцедурой1.procedure1;
m2.Data:=ОбъектТТвойКлассСПроцедурой1;
If CompareMem(@m1,@m2,SizeOf(m2)) Then ShowMessage('da') Else ShowMessage('net');
end;
Евгений Р. (2008-10-07 15:17:00) [5]type
tForm = class(TForm)
----
procedure mnJKvitKvitClick(sender:tObject);
----
end
Поросенок Винни-Пух (2008-10-07 15:16:00) [6]актуал параметерз она хочет для левого операнда.
Vlad Oshin (2008-10-07 15:15:00) [7]
> Anatoly Podgoretsky © (07.10.08 15:12) [4]
чем от [0] отличается?
на 0.5? :)
Anatoly Podgoretsky (2008-10-07 15:12:00) [8]А если так
// if PopUpMenu.Items[i].OnClick<>procedure1 then
то ошибка есть?
Ega23 (2008-10-07 15:11:00) [9]
> procedure1
это процедура или метод?
Евгений Р. (2008-10-07 15:07:00) [10]нет. таже ошибка. Чтото нужно менять в левой части.
Palladin (2008-10-07 15:01:00) [11]
if PopUpMenu.Items[i].OnClick<> @procedure1 then