![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двух величин TNotifyEvent [D6, WinXP]
Andsin © (2005-09-26 12:26:00)Привет!
Планирую использовать контейнер для уведомления экземляров классов о событии. Именно экземпляров, а не одного экземпляра. Пытаюсь реализовать так:
procedure Foo.AttachOnReply(AnEvent: TNotifyEvent);
var
matched: boolean;
i: integer;
begin
matched := false;
for i := 0 to Length(FEvents)-1 do
if FEvents[i] = AnEvent then matched := true;
if not matched then
begin
i := Length(FEvents);
SetLength(FEvents, i+1);
FEvents[i] := AnEvent;
end;
end;
В строчкеif FEvents[i] = AnEvent then matched := true;возникают две одинаковых ошибки:
[Error] foo.pas(221): Not enough actual parameters.
т.е. компилятор пытается вызвать соответствующие методы.
Могу ли я исправить код так, чтобы компилятор проверял равенство указателей на метод класса, вместо вызова?
P.S. Преобразование TNotifyEvent к типу TMethod, на мой взгляд, не является документированной производителем, поэтому такие варианты не катят...
Спасибо!
Verg (2005-09-28 09:42:00) [1]Темы
"The @ operator", "Procedural types in statements and expressions"
"Справка" называется Object Pascal Language Guide
P.S. Английским можно овладеть пользуясь словарем, как думаешь?
andsin (2005-09-28 09:36:00) [2]к стати, с двумя @ работает правильно.
итак, есть два способа, оказывается - приведение к Tmethod и CompareMem(@@Event....
andsin (2005-09-28 09:26:00) [3]
> добавь "барана" к @Form1.OnXXX ...
а про двух баранов ты где в справке прочитал? и в [24] у тебя один баран.
Суслик (2005-09-27 18:14:00) [4]maniaki
Digitman (2005-09-27 18:14:00) [5]
> andsin (27.09.05 18:05) [55]
а ПОЧЕМУ он НЕ должен возвращать True ?
Digitman (2005-09-27 18:13:00) [6]
> andsin (27.09.05 17:38) [53]
добавь "барана" к @Form1.OnXXX ...
andsin (2005-09-27 18:05:00) [7]правда случай 2 из [48] все равно возвращает true.
Verg (2005-09-27 17:53:00) [8]Да, блин,....
... оператор @действует в этом случае не "в лоб". Он возвращает значение поля codeэквивалентной структуры TMethod, а не адрес памяти, где эта структура хранится!
> 1.
> Form1.OnShow := nil;
> CompareMem( @@Form1.OnShow, @@Form1.OnShow, 4); //здесь прога
> негибнет
andsin (2005-09-27 17:38:00) [9]
> ну РАЗУМЕЕТСЯ, что если объекта Form1 не существует (т.е.
> в дан.случае переменная Form1, содержащая nil, НЕ ссылается
> НИ на какой объект), то БЕССМЫСЛЕННО пытаться определять
> адрес некоего поля в несуществующей структуре несуществующего
> же объекта !
>
> так что убеждать кого-то в очевидном - себе дороже станет)
>
нет, ну что ты? я бы не стал тебя так обманывать. мало того, что Form1 существует и указывает на реальную форму, этот код губит прогу в обработчике Form1.Button1.OnClick. проверь.
> ты спросил, КАК сравнить два значения типа TNotifyEvent БЕЗ
> приведения к TMethod - я тебе и ответил) ... чем ты не доволен
> ?))
тем, что не сравнивает!!!!!!!!!! смотри п.2 из [48].
umbra (2005-09-27 17:29:00) [10]
> //здесь прога гибнет
она и не может не погибнуть. ты просишь ее читать из недоступного адреса. а во втором - из доступного (сам присваиваешь!)
Digitman (2005-09-27 17:25:00) [11]
> andsin (27.09.05 17:17) [48]
да какое мне дело до твоих "объектов" ?!)
это уже твои проблемы - существуют объекты или нет)
ты спросил, КАК сравнить два значения типа TNotifyEvent БЕЗ приведения к TMethod - я тебе и ответил) ... чем ты не доволен ?))
а тебя понесло в совершенно иной огород)
ну РАЗУМЕЕТСЯ, что если объекта Form1 не существует (т.е. в дан.случае переменная Form1, содержащая nil, НЕ ссылается НИ на какой объект), то БЕССМЫСЛЕННО пытаться определять адрес некоего поля в несуществующей структуре несуществующего же объекта !
так что убеждать кого-то в очевидном - себе дороже станет)
umbra (2005-09-27 17:24:00) [12]вообще-то я писал andsin
а насчет владельцев - хорошо, не владельцы, а ассоциированные объекты.
A method is a procedure or function associated with a class. A call to a method specifies the object (or, if it is a class method, the class) that the method should operate on.
перевод
Метод - процедура или функция, связанная с классом. В Вызове метода указывается объект (или, если это - метод класса, класс), в котором метод должен выполняться.
Германн (2005-09-27 17:18:00) [13]По LMD удобнее стрелять дуплетом?
andsin (2005-09-27 17:17:00) [14]и вторая ерунда в твоем подходе обнаружилась - твой метод не различает объектов. чтобы не быть голословным, приведу код.
1.
Form1.OnShow := nil;
CompareMem(@Form1.OnShow, @Form1.OnShow, 4); //здесь прога гибнет
2.
Form1.OnShow := Button1Click;
Form2.OnHide := Button1Click;
CompareMem(@Form1.OnShow, @Form2.OnHide, 4);//возвращает true;
убедил наконец?
Digitman (2005-09-27 17:10:00) [15]
> umbra © (27.09.05 17:01) [45]
> владельца процедуры
о боже)..
хрен редьки не слаще)
НЕТ у процедуры никаких "владельцев" !
и быть не может)
Digitman (2005-09-27 17:06:00) [16]
> umbra © (27.09.05 17:01) [45]
> владельца процедуры
о боже)..
хрен редьки не слаще)
НЕТ у процедуры никаких "владельцев" !
и быть не может)
umbra (2005-09-27 17:01:00) [17]
> компилятор резервирует под размещение инф-ции о методе объекта
> 8 байт
и 4 из них - указатель на код процедуры, а 4 - на владельца процедуры!
> Form1.OnClick
Form1 - указатель на владельца
OnClick - указатель на код
Приведение типов уже произошло при запуске программы!
Digitman (2005-09-27 16:57:00) [18]
> andsin (27.09.05 16:42) [41]
> бомбить будем твой пост [24] что ты там пишешь?
ну рискни)...
> сравнивать память по адресам, взятым из двух
> указателей, размер которых, как ты правильно пишешь равен
> 4, причем сравнивать просишь sizeof(TNotifyEvent) =8 байт
Нет.
Я сравниваю содержимое двух областей памяти, адрес каждой из которых мне вычислит компилятор и размер каждой из которых равен sizeof(TNotifyEvent)=8 байт.
НИКАКИХ TMethod'ов здесь явно не упоминается (как ты и просил собственно в [21])
Но при этом TMethod'ы здесь неявно присутствуют, и быть иначе не может !
> не наерундил?
Где ?!
Тебе уже 40 с лишним постов долдонят. что компилятор резервирует под размещение инф-ции о методе объекта 8 байт !
Те самые 8 байт, что и составляет любая структура типа TMethod !
Digitman (2005-09-27 16:55:00) [19]
> andsin (27.09.05 16:42) [41]
> бомбить будем твой пост [24] что ты там пишешь?
ну рискни)...
> сравнивать память по адресам, взятым из двух
> указателей, размер которых, как ты правильно пишешь равен
> 4, причем сравнивать просишь sizeof(TNotifyEvent) =8 байт
Нет.
Я сравниваю содержимое двух областей памяти, адрес каждой из которых мне вычислит компилятор и размер каждой из которых равен sizeof(TNotifyEvent)=8 байт.
НИКАКИХ TMethod'ов здесь явно не упоминается (как ты и просил собственно в [21])
Но при этом TMethod'ы здесь неявно присутствуют, и быть иначе не может !
> не наерундил?
Где ?!
Тебе уже 40 с лишним постов долдонят. что компилятор резервирует под размещение инф-ции о методе объекта 8 байт !
Те самые 8 байт, что и составляет любая структура типа TMethod !
andsin (2005-09-27 16:50:00) [20]а, к стати, да не наерундил в размерностях, это я действительно зря.
но все равно наедрундил, т.к. Event1 вполне имеет право быть nil. сам понимаешь, что в этом случае будет.