Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
Евгений Р.   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.006 c
2-1223512199
AlexDan
2008-10-09 04:29
2008.11.16
Реестр..


2-1222931133
031178
2008-10-02 11:05
2008.11.16
Обновление MS SQL


2-1223552041
Iris
2008-10-09 15:34
2008.11.16
объект-Контейнер


15-1221609374
Германн
2008-09-17 03:56
2008.11.16
WM_USER +100 vs WM_USER +400


2-1223206467
ЛамоРщщук
2008-10-05 15:34
2008.11.16
Как найти все главные Окна и распредилить их по заголовку ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский