Как отобразить элемент управления (например, TListbox) за пределами TForm - PullRequest
0 голосов
/ 02 июля 2018

Как отобразить список за пределами родительской формы во время выполнения:

enter image description here

Изображение получается из IDE при нажатии на список во время разработки. Я хотел бы добиться этого эффекта во время выполнения.

1 Ответ

0 голосов
/ 02 июля 2018

Вы не можете визуально расширить элемент управления за пределы родительской формы. Но вы можете добиться эффекта, создав отдельную форму без полей для этого элемента управления и частично отобразив эту вторичную форму поверх первой:

enter image description here

Здесь Form1 - это основная форма со следующим обработчиком OnClick для Button1:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(nil);
  try
    Form2.Left := ClientOrigin.X + 140;
    Form2.Top := ClientOrigin.Y + ClientHeight - 20;
    Form2.ShowModal;
    Edit1.Text := IntToStr(Form2.ModalResult);
  finally
    Form2.Free;
  end;
end;

Поскольку вторая форма (Form2) не связана (с точки зрения дочерних элементов) с Form1, мы должны указать ее местоположение в виде пикселей экрана, но все же относительно Form1. Поэтому мы используем Form1.ClientOrigin (`клиентская область Form1 сверху и слева в качестве координат экрана) в качестве ссылки.

Вторая форма, Form2, которая содержит TListBox, имеет следующие настройки свойств

BorderStyle = bsNone
KeyPreview = True (to catch `Enter` key)

и имеет обработчик OnKeyUp, записанный как

procedure TForm2.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then
    ModalResult := ListBox1.ItemIndex;
end;
...