![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Потерял пример кода, может кто поможет восстановить...
Пример стандартного присвоения события в run-time:
Это конечно работает без нареканий. А как сделать чтобы "procedure Click" была не методом класса, а отдельно стоящей функцией? Мелькают воспоминания, что там нужно добавить ещё один параметер в функцию, но какой и где не могу вспомнить.... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Le Taon |
|
|||
|
Unregistered |
procedure Click(Self: TObject; Sender: TObject);
begin ... end; var evhandler: TNotifyEvent; TMethod(evhandler).Code := @Click; TMethod(evhandler).Data := nil; Button1.OnClick := evhandler; Без извращений можно так: TDummy = class class procedure Click(Sender: TObject); end; Button1.OnClick := TDummy.Click; |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Не, не то! Я видел где-то очень простое решение, что то типа
Procedure Click(Something:TSomething; Sender:TObject); Вот только не могу вспомнить что там было вместо Something:TSomething, а с фиктивными классами и указателями я знаю, только это как то не очень изящно... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Le Taon |
|
|||
|
Unregistered |
Не думаю, что это вообще возможно, поскольку
тип TProc = procedure(...); - это просто указатель, 4 байта, а TProcObj = procedure(...)of object; - это 8 байтовая структура, и они не могут быть приведены друг к другу иначе чем TMethod(ProcObj).Code := @Proc; TMethod(ProcObj).Data := nil; // Self То, что там есть дополнительный параметр - это понятно, это Self, (туда будет передано то, что хранится в TMethod(ProcObj).Data), но, как его не объяви, преобразовать ссылку на процедуру в ссылку на метод объекта компилятор не даст. Ни при каких условиях. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
А так вроде работает, но может это черевато проблемами?
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Забавно.
А ты Sender анализировать не пробывал? По идее, при вызове OnClick первым параметром будет запихнут указатель на экземпляр того класса который в этом OnClick хранится . Я в низкоуровневой реализации не силен, но кажись, так как параметры в процедурах в Delphi передаются через регистры, то ничего страшного не произойдет. В этом случае можно даже выудить Sender взяв значение нужного регистра. А если они передаются через стек? Кто-то его должен очищать. Ага. Вот тут Delphi загрузилось, и проверим.... Так и есть, чтобы все было тип-топ пишим: procedure C(Self:pointer;Sender:TObject); begin TButton(Sender).Caption:='ee'; end; procedure TForm1.FormCreate(Sender: TObject); begin @Button1.OnClick:=@c; end; Self тут у нас будет равен nil, а Sender как раз и получается Sender'ом. -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |