Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2014, 19:40
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию Событие клика мыши, куда угодно кроме компонента х

Доброго времени суток.
Мне надо сделать следующие, у меня в программе имеется достаточное кол-во выпадающих панелей, и я хочу что бы они закрывались как только пользователь нажал куда угодно кроме этой панели.

То есть что бы мои панели закрывались как контекстное меню, если его вызвать и нажать куда угодно мимо него, то оно сразу закрывается,мне надо сделать такое же со своими панелями.
Отследить нажатие на фоновой компонент я не могу, т.к там могут быть разные компоненты.

Конечно можно сделать какой то невидимый компонент что бы тот закрывал все остальное пространство окна кроме самой панели и выслеживать клик по нему, но это не очень меня вдохновляет ))

Кто подскажет как это можно реализовать, может есть обработчик исключительно нажатия на мышку?
Ответить с цитированием
  #2  
Старый 11.04.2014, 19:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от JunkieBeat
Мне надо сделать следующие, у меня в программе имеется достаточное кол-во выпадающих панелей, и я хочу что бы они закрывались как только пользователь нажал куда угодно кроме этой панели.
Выпадающие панели это что такое?
Разработка самопальных комбобоксов обсуждалась буквально вчера-сегодня вот в этой теме: компонент за пределами формы
Ответить с цитированием
  #3  
Старый 11.04.2014, 20:23
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Я не правильно выразился, это обычные панели,просто невидимые,по нажатию кнопки идет визибл=тру, а вот отключать её надо по нажатию ЛКМ мимо это йпнаели
Ответить с цитированием
  #4  
Старый 11.04.2014, 21:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Если правильно понял, то можно сделать примерно так

Задайте всем панелям вот такой обработчик
Код:
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;
главное чтоб других панелей не использовалось или тогда нужным задайте свойство tag напр. равным 10 и отслеживайте панельки только с таким его значением


Добавлено немного позже

Вот ещё вариант, с глобальным ЛКМ приложения, только нужно в 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;
и теперь вам осталось лишь позаботиться о том, чтоб в момент показа "невидимки" её имя оказалось в CmpName, напр.
Код:
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  
Старый 12.04.2014, 11:24
Аватар для JunkieBeat
JunkieBeat JunkieBeat вне форума
Прохожий
 
Регистрация: 01.02.2013
Сообщения: 48
Версия Delphi: Delphi7 Lite Ed
Репутация: 10
По умолчанию

Спасибо большое, то что надо,прекрасно работает
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter