|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Событие клика мыши, куда угодно кроме компонента х
Доброго времени суток.
Мне надо сделать следующие, у меня в программе имеется достаточное кол-во выпадающих панелей, и я хочу что бы они закрывались как только пользователь нажал куда угодно кроме этой панели. То есть что бы мои панели закрывались как контекстное меню, если его вызвать и нажать куда угодно мимо него, то оно сразу закрывается,мне надо сделать такое же со своими панелями. Отследить нажатие на фоновой компонент я не могу, т.к там могут быть разные компоненты. Конечно можно сделать какой то невидимый компонент что бы тот закрывал все остальное пространство окна кроме самой панели и выслеживать клик по нему, но это не очень меня вдохновляет )) Кто подскажет как это можно реализовать, может есть обработчик исключительно нажатия на мышку? |
#2
|
||||
|
||||
Цитата:
Разработка самопальных комбобоксов обсуждалась буквально вчера-сегодня вот в этой теме: компонент за пределами формы |
#3
|
||||
|
||||
Я не правильно выразился, это обычные панели,просто невидимые,по нажатию кнопки идет визибл=тру, а вот отключать её надо по нажатию ЛКМ мимо это йпнаели
|
#4
|
||||
|
||||
Если правильно понял, то можно сделать примерно так
Задайте всем панелям вот такой обработчик Код:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TPanel).Height:= 100 {visible:= true}; end; Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var i: integer; begin if Button = mbLeft then for i: = 0 to ComponentCount -1 do if (Components[i] is TPanel) then (Components[i] as TPanel).Height:= 20 {visible:= false}; end; Добавлено немного позже Вот ещё вариант, с глобальным ЛКМ приложения, только нужно в var секции формы сначало добавить сторковую переменную в которой будет содержаться имя "развёрнутой" панельки - нужно чтоб не убрать её если курсор в данный момент над ней Код:
... var Form1: TForm1; CmpName: string; ... Код:
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean); var nm: string; begin inherited; if Msg.message = WM_LBUTTONDOWN then begin if (FindControl(WindowFromPoint(Msg.pt)) is TPanel) then nm:= (FindControl(WindowFromPoint(Msg.pt)) as TPanel).Name; if (FindComponent(CmpName) is TPanel) and (nm <> CmpName) then (FindComponent(CmpName) as TPanel).Visible:= false; end; end; Код:
procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage:= AppMessage; end; Код:
procedure TForm1.Button1Click(Sender: TObject); begin Panel1.Visible:= true; CmpName:= Panel1.Name; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 12.04.2014 в 05:00. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
JunkieBeat (12.04.2014)
|
#5
|
||||
|
||||
Спасибо большое, то что надо,прекрасно работает
|