Как я могу отобразить список за пределами родительской формы во время выполнения:
Изображение получается из IDE при нажатии на список во время разработки. Я хотел бы добиться этого эффекта во время выполнения.
Как я могу отобразить список за пределами родительской формы во время выполнения:
Изображение получается из IDE при нажатии на список во время разработки. Я хотел бы добиться этого эффекта во время выполнения.
Вы не можете визуально расширить элемент управления за пределы родительской формы. Но вы можете добиться этого эффекта, создав отдельную форму без полей для этого элемента управления и отобразив эту вторичную форму частично поверх первой формы:
Здесь 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;
Form2.Show
(не модальный) и установить FormStyle
в fsStayOnTop
. Если Form2 является ShowModal, то Form1 полностью недоступна, что не является идеей наличия Listbox в форме.
- person RaelB; 03.07.2018