Если правильно понял, то можно сделать примерно так
Задайте всем панелям вот такой обработчик
Код:
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;
всё