Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.16;
Скачать: CL | DM;

Вниз

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

 
Евгений Р.   (2008-10-07 14:59) [0]

необходимо проверить является ли процедура OnClick нужной процедурой:

if PopUpMenu.Items[i].OnClick<>procedure1 then

компилятор сообщает:
[Error] MnuVest.pas(207): E2035 Not enough actual parameters


 
Palladin ©   (2008-10-07 15:01) [1]

if PopUpMenu.Items[i].OnClick<>@procedure1 then


 
Евгений Р.   (2008-10-07 15:07) [2]

нет. таже ошибка. Чтото нужно менять в левой части.


 
Ega23 ©   (2008-10-07 15:11) [3]


> procedure1


это процедура или метод?


 
Anatoly Podgoretsky ©   (2008-10-07 15:12) [4]

А если так

// if PopUpMenu.Items[i].OnClick<>procedure1 then

то ошибка есть?


 
Vlad Oshin ©   (2008-10-07 15:15) [5]


> Anatoly Podgoretsky ©   (07.10.08 15:12) [4]

чем от [0] отличается?
на 0.5? :)


 
Поросенок Винни-Пух ©   (2008-10-07 15:16) [6]

актуал параметерз она хочет для левого операнда.


 
Евгений Р.   (2008-10-07 15:17) [7]

type
 tForm = class(TForm)
----
   procedure mnJKvitKvitClick(sender:tObject);
----
 end


 
Palladin ©   (2008-10-07 15:18) [8]

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;


 
Palladin ©   (2008-10-07 15:25) [9]

или еще проще

If (TMethod(PopUpMenu.Items[i].OnClick).Data=ОбъектТТвойКлассСПроцедурой1) and
  (TMethod(PopUpMenu.Items[i].OnClick).Code=@ТТвойКлассСПроцедурой1.procedure1)
 Then ShowMessage("da") Else ShowMessage("net");


 
Григорьев Антон ©   (2008-10-07 16:37) [10]

Если 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 18:46) [11]


> Если m1 и m2 объявить как TNotifyEvent

то мы будем вынуждены отказаться от универсального подхода к сравнению



Страницы: 1 вся ветка

Текущий архив: 2008.11.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1222847653
SkyN
2008-10-01 11:54
2008.11.16
несколько раз вызывать EnterCriticalSection корректно?


2-1223539684
aslanbek
2008-10-09 12:08
2008.11.16
Регистрация расширения в реестре


2-1223549315
TStas
2008-10-09 14:48
2008.11.16
Зачем у сишных структур есть поле Size?


15-1221727773
m2804
2008-09-18 12:49
2008.11.16
downgrade с Vista на XP


15-1221674501
Subzero
2008-09-17 22:01
2008.11.16
Intel® Threading Building Blocks