![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват всех Click-ов по кнопкам [D5, D7]
YaMaximus © (2004-08-20 16:35:00)Есть проект, в котором штук 200 форм, на них разные
кнопочки (TRxSpeedButton) в событиях OnClick которых идет определенная обработка.
Как перехватить все эти клики и узнать имя кнопки, по которой
клацнули.
Есть конечно возможность перехвата всех событий через
Application.OnMessage или WndProc, но там я не узнаю имя кнопки.
Может кто-нибудь подскажет идейку.
Заранее благодарен.
Erik1 (2004-08-27 11:55:00) [1]Переопредалять надо однозначно, но если хочется похалявить, то есть такой выход: При зпруске программы пробегаем по всем необходимым объектам(for i := 0 to ComponentCount-1 do) и переопределяем у них событие OnClick, старое соответственно запоминаем вместе с именем объекта(кнопки). При возникновении события делаем, что дуща желает и получаем имя объекта, находим его старый обрабочик и ..... передаем ему управление.
Помоему все элементарно и работает со всеми контролами, но предупреждаю это для халявщеков.
P.S.
Настоящие герои всегда идут в обход. :)
NAlexey (2004-08-27 10:44:00) [2]Да, а у меню есть ShortCut-ы как быть с ними?
NAlexey (2004-08-27 10:30:00) [3]>YaMaximus (27.08.04 09:59) [25]
Впринципе я могу кнопку нажать пробелом или по Enter как будешь отлавливать?
YaMaximus (2004-08-27 09:59:00) [4]>ну так объясните мне, почему нельзя было подправить/перекрыть >метод Click в TRxSpeedButton??
Была и такая идея. Но это надо переопределять методы и TMainMenu
и TPopupMenu, а завтра еще где-нибудь.
А в таком виде(в OnMessage) очень даже централизовано и красиво получилось.
>по наличию виснушек на пятке левой ноги судить о вашем >интелектуальном уровне.
:o))
Красиво сказано.
nikkie (2004-08-26 20:57:00) [5]ну так объясните мне, почему нельзя было подправить/перекрыть метод Click в TRxSpeedButton??
MIm1 (2004-08-26 19:19:00) [6]
> [22] YaMaximus (26.08.04 16:05)
Не обращайте внимания, некоторым люди обажают по наличию виснушек на пятке левой ноги судить о вашем интелектуальном уровне.
YaMaximus (2004-08-26 16:05:00) [7]> О полезном свойстве Tag читали? Его то и надо менять у кнопки в > ее OnClick, а потом проверять. Ну и сделали же из мухи слона %)
При чем тут Tag? Причем тут OnClick?
Я определяю имя нажатой кнопки в обработчике всех событий
Application.OnMessage. Что мне в каждом OnClick писать процедуру проверки?
>Да это не проект а фуфло какое-то! Никак чувак решил операционку >новую сваять (на Дэлфях:)
Зачем сразу фуфло. Если в проекте 200 форм - значит сразу отстой.
Просто 6 проектов комплекса по управлению производством на предприятии. Даже с учетом наследования форм их количество получается нехилое, их наверное даже больше чем 200.
SPy (2004-08-26 12:20:00) [8]ЛОЛ! Удачи ему :)
Палыч (2004-08-26 12:18:00) [9]проект, в котором штук 200 форм???
Да это не проект а фуфло какое-то! Никак чувак решил операционку новую сваять (на Дэлфях:)
SPy (2004-08-26 12:13:00) [10]О БОЖЕ МОЙ! Вот накрутили так накрутили!!!
О полезном свойстве Tag читали? Его то и надо менять у кнопки в ее OnClick, а потом проверять. Ну и сделали же из мухи слона %)
YaMaximus (2004-08-26 10:36:00) [11]< Mim1 © (25.08.04 20:07) [17]
СУПЕР!!! Спасибо огромное, вы мне очень помогли!
Вообще всем спасибо за советы.
Mim1 (2004-08-25 20:07:00) [12]При создании менюхи в Delphi 7 она регистрируется в PopupList
PopupList.Add(Self);
которая если котнролов менюх больше нуля генерит невидимое окошко.
if Count = 0 then FWindow := Classes.AllocateHWnd(MainWndProc);
После этого все сообщения пришедшие этому окну передаются менюхам.
WM_COMMAND:
for I := 0 to Count - 1 do
if TPopupMenu(Items[I]).DispatchCommand(Message.wParam) then Exit;
Ссылка на обьектик PopupList находит в интервейсной части модуля Menus так что думаю у вас не возникнет труднойстей с определением что к чем относится.
YaMaximus (2004-08-25 18:02:00) [13]>В сообщении так же известен handle окна с которым связано мень. >От этого контрола вы можете узнать его меню через getmenu, а по >handle меню вы можете вычислить какому vcl компоненту >принадлежит это меню (перебором).
Да, я собственно так и собирался делать.
Во время WM_COMMAND на MainMenu в поле Msg.Hwnd действительно хандл окна(Form1).
Вот только в момент WM_COMMAND на PopupMenu в поле Msg.Hwnd вообще непонятно какой хандл(я проверил хандлы Form1, Application, PopupMenu, PopupMenuItem, dbGrid-a(на котором в моем примере висит Popup), но это не они).
FindControl(Msg.Hwnd) дает nil, чо делать не пойму :о(
Можно конечно использовать:
Window := FindVCLWindow(Msg.pt);
sClickCode := (Window as TRxDbGrid).PopupMenu.FindItem(Msg.wParam, fkCommand).Name;
Но Popup может висеть не только на гриде.
Mim1 (2004-08-25 15:34:00) [14]
> Если учесть, что PopupMenu может быть несколько штук
В сообщении так же известен handle окна с которым связано мень. От этого контрола вы можете узнать его меню через getmenu, а по handle меню вы можете вычислить какому vcl компоненту принадлежит это меню (перебором).
begin...end (2004-08-25 14:17:00) [15]
> [12] YaMaximus (21.08.04 10:45)
> узнать название самой формы (TForm.Name), на которой сидит эта панель или тулбар
TControl.Parent ?
YaMaximus (2004-08-25 14:10:00) [16]>Тоже вполне реально. Перехватвайте сообщение wm_command, ищите в >менюхе пункт с нужным wID.
Подскажите пожалуста как найти пункт меню в PopupMenu.
При перехвате wm_command убедился , что в wParam действительно сидит wID, но как
по нему найти нажатый пункт меню я не пойму.(Если учесть, что PopupMenu может быть несколько штук).
YaMaximus (2004-08-21 10:45:00) [17]Огромное спасибо всем за ответы, особенно за ControlAtPos.
Очень помогло!
Ну может еще кто подскажет:
Я делаю так...
procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: boolean);
var
sClickCode: string;
Window: TWinControl;
Control: TControl;
begin
if Msg.message = WM_LBUTTONUP then
begin
Window := FindVCLWindow(Msg.pt);
if Window <> nil then
begin
Control := Window.ControlAtPos(Window.ScreenToClient(Msg.pt), false);
if (Control <> nil) and (Control.ClassNameIs('TRxSpeedButton')) then
begin
sClickCode := Window.ClassName + '.' + Control.Name;
DoSomething(sClickCode);
end;
end;
end;
Handled := false;
end;
Вся штука в том, что FindVCLWindow находит виндоу на котором сидит кнопка(TPanel, TToolBar и т.д.), а как бы мне в этой процедуре узнать название самой формы (TForm.Name), на которой сидит эта панель или тулбар или еще чего с этой кнопкой?
Mim1 (2004-08-20 18:11:00) [18]
> Вообщето не только TRxSpeedButton, но и для TMenuItem.OnClick
> Но это помоему из области фантастики.
Тоже вполне реально. Перехватвайте сообщение wm_command, ищите в менюхе пункт с нужным wID.
YaMaximus (2004-08-20 18:05:00) [19]> s999 (20.08.04 17:11) [7]
Вообщето не только TRxSpeedButton, но и для TMenuItem.OnClick
Но это помоему из области фантастики.
А в чем заключается рекурсивность ControlAtPos?
Mim1 (2004-08-20 18:05:00) [20]
> Если так, то да, только тяжеловато немного будет, ControlAtPos
> - рекурсивная.
Думается что пользователь даже не заметит тяжести даже на самом медленном компе. :)