![]() |
| ||
|
|
Новости |
Поиск |
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, на мой взгляд, не является документированной производителем, поэтому такие варианты не катят...
Спасибо!
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.
ЗЫ И, вообще, "использовать контейнер для уведомления экземляров классов о событии" мне представляется неудачной задумкой.