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

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

Сравнение двух величин TNotifyEvent [D6, WinXP]


Страницы:   1 2 3 4

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. сам понимаешь, что в этом случае будет.


Страницы:   1 2 3 4

Наверх

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