Delphi - Одинаковые обработчики?

part 03.06.2004 - 12:29 | Добрый день, возникла такая проблема: Есть два произвольных наследника TControl, как установить что на OnClick у обоих вызывается одинаковая процедура - т.е. обработчики у них одинаковы?
tvv 1 - 03.06.2004 - 12:44 | напиши что то типа mycontrol1.OnClick:=MyOnClick; mycontrol2.OnClick:=MyOnClick; где MyOnClick это твоя процедура
x77 2 - 03.06.2004 - 12:45 | procedure MyOnClick (Sender: TObject); begin ... end; . begin MyControl1.OnClick := MyOnClick; MyControl2.OnClick := MyOnClick; end. . с таким же успехом это делается в диспетчере объектов.
x77 3 - 03.06.2004 - 12:49 | tvv, сорри, не видел твоего поста. . прикол, даже все объекты обозвали одинаково :)
part 4 - 03.06.2004 - 12:55 | Народ, мне не нужну устанавливать обработчики, мне нужну всего лиш ответить на вопрос олинаковы ли они
x77 5 - 03.06.2004 - 13:00 | а что, сравнение не проходит? Result := (mc1.OnClick = mc2.OnClick)
part 6 - 03.06.2004 - 13:26 | 2 x77 не а, не проходит
Hook 7 - 03.06.2004 - 13:44 | Result := (@(mc1.OnClick) = @(mc2.OnClick))?
u-uups 8 - 03.06.2004 - 13:53 | Result := (@mc1.OnClick = @mc2.OnClick) наверное так.
x77 9 - 03.06.2004 - 13:53 | точно, не проходит :) прикольно, блин. единственное, что приходит в голову, это проверять на адрес прицепленного обработчика. у меня нормально отработала вот такая шняжка: . procedure TForm1.Button1Click(Sender: TObject); begin if @Button2.OnClick = @Button3.OnClick then ShowMessage ('Yes!') else ShowMessage ('No!'); end; . т.е. фактически, ты будешь сравнивать адреса точек входа в обработчик. у разных обработчиков они будут разными.
part 10 - 03.06.2004 - 14:13 | С адресами я уже сделал - не нравиться решение, некрасиво
VaS 11 - 03.06.2004 - 14:17 | function IsSameMethods(M1, M2: TMethod): Boolean; begin Result := (M1.Code = M2.Code) and (M1.Data = M2.Data); end; . if IsSameMethods(TMethod(B1.OnClick), TMethod(B2.OnClick)) then ShowMessage('Same') else ShowMessage('Not same'); . x77: Ты сравниваешь расположение в памяти двух записей TMethod, а не значения их полей, а только они определяют метод конкретного объекта (точнее - метод + объект).
Тупой ламер 12 - 03.06.2004 - 14:18 | if TMethod(Button1.OnClick).Code = TMethod(Button2.OnClick).Code then ...
Тупой ламер 13 - 03.06.2004 - 14:19 | VaS, мои извинения, я не видел, что ты уже отвечаешь
part 14 - 03.06.2004 - 14:20 | 2 Vas: очень признателен
x77 15 - 03.06.2004 - 14:26 | VaS, ну да. разные методы лягут в разные адреса. Каким образом у двух разных методов эти поля в VMT могут оказаться одинаковыми? ведь речь идёт о расположении TMethod в VMT, нет?
VaS 16 - 03.06.2004 - 15:08 | Ошибся я :) В 9 ты сравниваешь адреса процедур (точки входа), которые уникальны. Ни TMethod, ни VMT тут ни при чем.
x77 17 - 03.06.2004 - 15:23 | я тоже прогнал с VMT :) . но всё равно хотелось бы разобраться, раз коснулось. проверка на точки входа отработает корректно всегда, вроде бы. а вот проверка через TMethod?
VaS 18 - 03.06.2004 - 16:11 | Пусть есть форма, на ней кнопка, у нее на OnClick назначен метод формы. Создано 2 экземпляра этой формы. Так вот сравнение через TMethod покажет, что обработчики кнопки с первой и второй формы не являются идентичными (код (TMethod.Code) один, данные (TMethod.Data) - разные). Хотя ясно, что это - единственная статическая процедура. TMethod нужен для, например, организации списка нотификации, когда совершенно разные объекты регистрируют свои методы с определенной заданной сигнатурой в некотором списке для последующего вызова с действительным Self внутри метода.
Тупой ламер 19 - 04.06.2004 - 08:13 | VaS всё верно говорит, но это далеко не единственное применение TMethod. Вообще в Delphi он используется приблизительно в том же плане, как расщепитель сообщений в прямых обработчиках сообщений. Можно использовать WParam и LParam, но расщепитель просто удобнее. Можно использовать прямое приведение обработчика к указателю, но TMethod удобнее. Разумеется, если знать, как он формируется. А формируется он по разному для обработчиков методов класса, для указателей на функции, для статических методов интерфейсов, для ссылок на интерфейсы COM-объектов или на геттеры/сеттеры их свойств. А вот если знать, как это всё "у ей внутре" формируется и работает, то можно гораздо более понятный и гибкий код писать, чем работать напрямую с указателем. Просто для сравнения можно использовать оба метода, но... каждый выбирает сам, что ему удобнее. ps. В нутрях Delphi, кстати, в исходниках, стараются сравнивать именно через TMethod (там, где это возможно), а не через указатели. Это всё моё imho, конечно ;-)
Тупой ламер 20 - 04.06.2004 - 08:27 | именно поэтому я и написал в первом посте только сравнение Code - это именно сравнение указателя на метод без привязки к объекту...

>>