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, на мой взгляд, не является документированной производителем, поэтому такие варианты не катят...

Спасибо!


andsin   (2005-09-27 16:42:00) [21]

ну долго ты думал...
бомбить будем твой пост [24] что ты там пишешь?
if CompareMem(@Event1, @Event2, SizeOf(TNotifyEvent)) then
а пишешь ты там сравнивать память по адресам, взятым из двух указателей, размер которых, как ты правильно пишешь равен 4, причем сравнивать просишь sizeof(TNotifyEvent) =8 байт.
не наерундил?


evvcom   (2005-09-27 16:41:00) [22]


> andsin   (27.09.05 15:47) [36]

Ты бы еще размер миллионного массива сравнил бы с адресом его начала! А потом бы Борланду претензии предъявил. :)
LMD АднАзначнА! :-)


Digitman   (2005-09-27 16:29:00) [23]


> andsin   (27.09.05 15:47) [36]


> наерундил, мягко говоря


нет, ну ты точно напрашиваешься на LMD))..

"наерундил", говоришь ?

так.
поехали бомбить тебя)

слушай сюда:

sizeof( @Form1.OnClick);

вот это ЖИРНОЕ @видишь ? разуй лупетки-то )

это ж - АДРЕС структуры !

а адрес в 32-битном ВАП Win 32-процесса  - 32-хбитный же) ...т.е. = 4 )

и с какого перепугу размер структуры TMethod (= 8 байт) вдруг будет равен размеру адресачего-то там  в 32-битном адресном пространстве (= 4 байта) ?


andsin   (2005-09-27 16:10:00) [24]


> Lamer@fools.ua ©   (27.09.05 15:59) [37]
>
> Delphi-программист считает, а Борланд располагает  :o)

ага. а на начало топика я этого не знал.


Lamer@fools.ua   (2005-09-27 15:59:00) [25]

> я считаю, должен быть встроен и TNotifyEvent::operator==, извини за С++ еквивалент.

Delphi-программист считает, а Борланд располагает  :o)


andsin   (2005-09-27 15:47:00) [26]

а, вот ты о чем... так в [24] ты наерундил, мягко говоря.
коротенькая программка тебя в этом убедит.

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage(IntToStr(sizeof(TNotifyEvent)-sizeof(@Form1.OnClick)));
end;

если нет, пиши. :)
а непонятно то, как сравнивать встроенный тип procedure of object без приведений, которые я ненавижу. т.к. тип procedure of object встроен, то, я считаю, должен быть встроен и TNotifyEvent::operator==, извини за С++ еквивалент.


Digitman   (2005-09-27 15:35:00) [27]


> andsin   (27.09.05 15:29) [34]


> реализовал через приведение к TMethod


ну я ж тебе сказал в [24] - НИКТО не обязывает тебя заниматься какими-то там "приведениями" ! НЕТ там никаких упоминаний о TMethod, коль скоро уж они тебя напрягают)

чем не устраивает-то такой вариант ?

и ЧТО тебе непонятно в СУТИ работы компилятора, когда он имеет дело с методами объектов, тобой тем или иным образом объявляемых ?


andsin   (2005-09-27 15:29:00) [28]

ё- да тут не только пули... тут уже и раки на горе свистели.
реализовал через приведение к TMethod. не нравится. :( а куда деваться?
всем спасибо за помощь. :)


Digitman   (2005-09-27 15:22:00) [29]


> andsin   (27.09.05 15:04) [32]


а что, уже пули свистели ?)


andsin   (2005-09-27 15:04:00) [30]

Digitman, ты еще жив? :)))


Digitman   (2005-09-27 14:35:00) [31]


> andsin   (27.09.05 14:29) [30]


напрасно пальцы гнешь.

если тему закрыл, то "уходя - уходи".

если иначе, то  поостерегись упоминать всуе про "вменяемость". иначе тебе грозит LMD-диагноз


andsin   (2005-09-27 14:29:00) [32]

да, вынужден констатировать, что не смотря на наличие правильных ответов в постах людей, вменяемым стоит признать не многих,  Leonid Troyanovsky, например.
Lamer@fools.ua,  evvcom для вас отдельно повторю, что тема закрыта, вопрос понятен, решение получено. вам понятно?


evvcom   (2005-09-27 13:55:00) [33]


> Lamer@fools.ua ©   (27.09.05 13:29) [28]

Думаю, не поможет. Это хронический случай с летальным исходом. :(


Lamer@fools.ua   (2005-09-27 13:29:00) [34]

>> andsin   (27.09.05 12:19) [27]

Читать [3]. До полного просветления.


andsin   (2005-09-27 12:19:00) [35]


> Ну? До чего можно довникаться?

Ответ на этот вопрос предлагаю найти в качестве упражнения.

> Если справка - единственный источник информации, то чего
> же ты делаешь на этом форуме?

Я же писал, ищу документированный способ осуществить сравнение.
Тема закрыта, в общем.


evvcom   (2005-09-27 11:21:00) [36]


> OnClick := FSomeObj.OnFormClick; // И совсем здесь не Self,
>  а FSomeObj.

Это в TForm1.FormCreate здесь действительно не Self. А когда вызовется твой FSomeObj.OnFormClick, там это будет уже Self.

> Да, так можно знаешь до чего довникаться... Нет, справка
> это единственный источник информации

Ну? До чего можно довникаться?
Если справка - единственныйисточник информации, то чего же ты делаешь на этом форуме?


Leonid Troyanovsky   (2005-09-27 11:13:00) [37]


> andsin   (27.09.05 10:07) [23]

> > "использовать контейнер для уведомления экземляров классов
> > о событии" мне представляется неудачной задумкой

> что-нить лучше подсказать можете?


Все уже украдено до нас.
Начиная от уведомлений TControl лежащих на TWinControl
(например, компонентные сообщения),  
и  до COM+ "издатель-подписчик".

--
Regards, LVT.


Digitman   (2005-09-27 10:28:00) [38]


> Существует ли документированный способ сравнения двух величин
> типа TNotifyEvent. Преобразование к типу TMethod прошу не
> предлагать


да на здоровье !

if CompareMem(@Event1, @Event2, SizeOf(TNotifyEvent)) then ..

как видишь, никаких преобразований к типу TMethod нет и в помине ..

но суть от этого НЕ изменилась - по прежнему сравнивается содержимое областей памяти, занятых структурами типа TMethod


andsin   (2005-09-27 10:07:00) [39]


> "использовать контейнер для уведомления экземляров классов
> о событии" мне представляется неудачной задумкой

что-нить лучше подсказать можете?


Leonid Troyanovsky   (2005-09-27 09:55:00) [40]


> andsin   (27.09.05 09:39) [21]

> Существует ли документированный способ сравнения двух величин
> типа TNotifyEvent. Преобразование к типу TMethod прошу не
> предлагать.


Экий ты настырный. Проверок типа
 
if (TMethod(Value).Code <> TMethod(OnExecute).Code) or
    (TMethod(Value).Data <> TMethod(OnExecute).Data) then

полная VCL огурцов (еще от царя Гороха).
Чего там еще документировать?
Ну, или попроси разрешения у борландов напрямую.

--
Regards, LVT.

ЗЫ И, вообще, "использовать контейнер для уведомления экземляров классов о событии" мне представляется неудачной задумкой.


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

Наверх

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