![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Спасибо большое, то что надо,прекрасно работает  
		
	
		
		
		
		
		
	
		
		
	
	
	![]()  |