Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.119.149] |
|
Сообщ.
#1
,
|
|
|
Форма на основе контрола-контейнера
Очень часто бывает, что возможностей стандартных диалогов не хватает, но и отдельный файл формы заводить под пару нестандартных контролов неохота. Формировать динамически - большая морока. Можно юзать Winapi диалоги, но с ними свои нюансы, да и удобство обработки событий несравнимо с VCL. Мне пришла в голову идея, как просто накидывать интерфейс диалогов без необходимости заводить файл формы - достаточно кинуть на главную форму контрол-контейнер (panel, pagecontrol, groupbox), сделать его невидимым и создать интерфейс на нём. После чего с помощью нижеприведенной функции сгенерировать форму с контролами, скопированными с этого контейнера. function FormFromControl(Container: TWinControl): TForm; var CtrlClass: TControlClass; Ctrl: TControl; ms: TMemoryStream; i: Integer; begin Result := TForm.Create(nil); Result.ClientHeight := Container.Height; Result.ClientWidth := Container.Width; ms := TMemoryStream.Create; for i := 0 to Container.ControlCount - 1 do begin CtrlClass := TControlClass(Container.Controls[i].ClassType); // Enable component to be read RegisterClass(CtrlClass); // Clone component via stream ms.WriteComponent(Container.Controls[i]); ms.Position := 0; Ctrl := CtrlClass.Create(Result); // To assign Parent before restoring from stream Ctrl.Parent := Result; ms.ReadComponent(Ctrl); ms.Position := 0; end; FreeAndNil(ms); end; // Пример procedure TForm1.btnClick(Sender: TObject); begin with FormFromControl(PageControl1.Pages[0]) do begin BorderStyle := bsDialog; Caption := 'Dialog from PageControl'; Position := poScreenCenter; // assign handlers... ShowModal; Free; end; end; Для большого количества диалогов можно сделать так: 1 - завести отдельную форму 2 - на нее PageControl, для удобства переключения между диалогами в дизайн-тайм 3 - на каждый TabSheet PageControl-а - Panel или GroupBox, для задания габаритов диалога 4 - указывать эти Panel или GroupBox в качестве параметров FormFromControl |
Сообщ.
#2
,
|
|
|
Цитата Fr0sT @ Для большого количества диалогов можно сделать так: 1 - завести отдельную форму 2 - на нее PageControl, для удобства переключения между диалогами в дизайн-тайм ... А какой тогда смысл создавать новую форму и копировать на нее контролы, если можно использовать существующую, просто установив активную страницу PageControl-а и скрыв ярлычки остальных страниц? Не устраивает рамка (и визульный стиль)? Можно древний TNotebook времен Win 3.1 использовать |
Сообщ.
#3
,
|
|
|
leo, сценарий использования такой - есть форма с интерфейсом, возможно даже главная, и некоторые действия юзера запускают диалоги. Естественно, для этого нужны отдельные окна (вариант с попап-рамкой а-ля диалоги на веб-страницах тоже подходит, но это муторно).
|
Сообщ.
#4
,
|
|
|
А нет решений попроще?
|
Сообщ.
#5
,
|
|
|
Проще - по форме на каждый диалог.
|