Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как правильно сравнить процедуры


Евгений Р. ©   (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


Наверх

Титульная страница Поиск, карта сайта Написать письмо