Показать сообщение отдельно
  #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;
всё
Ответить с цитированием