2010-04-14 6 views
1

Я стараюсь выровнять форму MDIChild слева от родительской настройки MDIForm Align: = alLeft во время разработки. На родительском MDIForm панель инструментов выровнена в alTop. По-видимому, выровненный MDIChild выше клиентской области родителей (я не знаю почему), поэтому вертикальная полоса прокрутки появляется в родительской форме. Проблема в том, что я хочу, чтобы эта форма создавалась динамически; поместив вертикальный разделитель между этими формами MDIchild, чтобы их размер определял мышью. Но когда я создаю Splitter, он полностью выравнивается слева, как если бы форма MDIChild не была выровнена (alLeft) вообще.Как выровнять MDIChild слева?

Я установил параметры MDIChild в:

Align:=alLeft; 
Windowstate:=wsNormal; 
Borderstyle:=bsSizable; 

ли решить эту проблему кто-нибудь раньше?

спасибо большое

P.S Delphi 7, Win XP

ответ

0

MDI детей обрабатываются отдельно от обычных вложенных элементов управления, как TSplitter, так что-то вроде "Align: = alLeft" не будет работать с ними. Область MDI - это то, что осталось после выравнивания всех остальных элементов управления.

Лучше всего использовать фреймы или разместить дочернюю форму непосредственно на форме без использования поддержки MDI (набор Child.Parent := MainForm). Если вы действительно хотите использовать поддержку MDI, я думаю, вам нужно будет написать свой собственный компонент TMDISplitter. Вы можете попробовать создать TSplitter во время выполнения, используя TSplitter.CreateParented(MainForm.ClientHandle), но я сомневаюсь, что он сработает.

+0

Я попытался также разместить дочернюю форму непосредственно внутри TPanel (alClient), который был вложен в родительскую форму. Эта хорошая идея сокрушила тот факт, что TEdit, TMemo ... компонент перестали работать (я не мог писать в них), если borderstyle дочерней формы не был bsNone. Я не уверен, если он не зависит от версии Delphi. Я не пытался использовать фреймы, так что, может быть, сейчас ... – lyborko

+0

Я не пробовал, но я не слишком удивлен тем, что неправильный стиль границы вызывает проблемы. Если вам нужны перетаскиваемые окна с титрами, вам понадобится поддержка MDI, а это означает, что вам нужно создать новый класс сплиттера, который знает, как обрабатывать MDI-окна. Это, конечно, возможно, но существующий код выравнивания и сплиттера Delphi не поможет. –

+0

Я потратил много времени, чтобы решить это, молоток и щипцы, никакого успеха. Должен признаться, что ты можешь быть прав. Я попробовал фреймы, как вы предлагали, но мне это не понравилось - у него нет титров, нет кнопки x для закрытия. И я хочу, чтобы он выглядел красиво. Итак, пользовательский новый сплиттер ... Я не очень доволен этим ... – lyborko

0

Если вы используете интерфейс MDI только для того, чтобы поместить «выровненные» формы внутри основной формы, я предлагаю вам использовать другой подход, например, работать с основными и дочерними формами fsNormal и стыковать ребенка внутри родительской формы (возможно, в панели).

Если вам интересно, ознакомьтесь с методом ManualDock для свойств дочерней формы и DockSite для панели (ов) основной формы.

В этом случае обычные сплиттеры будут хорошо работать для вас.

+0

Да, я упомянул об этом в последнем комментарии ... Ребенок образует в Formstyle = fsNormal выглядит как обычные панели внутри Docked Control. Панель заголовка полностью исчезает. По неизвестной причине родительская форма в Tpanel хорошо работает ТОЛЬКО, когда borderstyle: = bsNone. В противном случае это выглядит так, как я хочу, но вы не можете использовать TEdit или TMemo или другие элементы управления редактированием ... – lyborko

0

Решение, которое я нашел лучшим, основано на комбинации TFrame и обычного подхода TForm. Я создал все границы, заголовок, кнопки формы и их поведение в объекте TFrame из различных компонентов (TPanel, TButton, TShape). Этот объект я надел «нормальный» TForm. Я установил свойства TForm:

TForm.FormStyle: = fsNormal; TForm.BorderStyle: = bsNone; TForm.WindowState: = wsMaximized;
TForm.Align: = alClient;

и программно Я родил этот TForm в контейнер TPanel, который был обычным TPanel с свойством alClient.

Смежные вопросы