Как отобразить элемент управления (например, TListbox) за пределами TForm

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

введите описание изображения здесь

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

1 ответ

Решение

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

Вот 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;
Другие вопросы по тегам