Форум: "Начинающим";
Текущий архив: 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.005 c