Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема с расположением элементов на форме


Автор: Valart 30.3.2011, 10:57
В общем, есть неразрешимая проблема! smile
Есть MDI-форма на ней расположен CategoryPanelGroup (align=alLeft) и TabControl (align=alTop).
http://s2.ipicture.ru/uploads/20110330/Gg1FFMxv.png

Так вот каким образом сделать так, чтобы alLeft имел приоритет над alTop?
http://s2.ipicture.ru/uploads/20110330/5T7RI5tK.png

Единственное, что пришло в голову так это бросить TabControl на Panel и менять размер TabControl по изменению размера формы. Но в результате получается не совсем тот вид, который нужен.
http://s2.ipicture.ru/uploads/20110330/tUCAR0QJ.png

Автор: superVad 30.3.2011, 11:50
Цитата(Valart @  30.3.2011,  09:57 Найти цитируемый пост)
Так вот каким образом сделать так, чтобы alLeft имел приоритет над alTop?

Не совсем понял, что это значит - иметь приоритет.
Может поставить TabControl alClient?

Автор: Valart 30.3.2011, 12:15
Цитата(superVad @  30.3.2011,  11:50 Найти цитируемый пост)
Не совсем понял, что это значит - иметь приоритет.

В принципе, на скрине всё показано... Стандартно alTop имеет приоритет над alLeft, т.е. alTop, грубо говоря, отнимает у alLeft место. smile
Если поставить у TabControl alClient, то не будет места для отображения MDIChild. TabControl в данном случае используется для переключения между дочерними окнами.

Автор: Frees 30.3.2011, 12:25
для TabControl  не делай align, а используй Ancher, что бы правый его край двигался вместе с формой

Автор: Poseidon 30.3.2011, 12:33
Цитата(Valart @  30.3.2011,  12:15 Найти цитируемый пост)
TabControl в данном случае используется для переключения между дочерними окнами.
А принципиально в этом случае так извращаться? Не проще ли использовать PageControl и на страницы накидать тех компонентов, что должны быть на миди-формах?

Автор: Valart 30.3.2011, 17:02
Цитата(Frees @  30.3.2011,  12:25 Найти цитируемый пост)
для TabControl  не делай align, а используй Ancher, что бы правый его край двигался вместе с формой


Если для TabControl не делать Align, то дочерние окна подлезают под него.

Добавлено через 4 минуты и 21 секунду
Цитата(Poseidon @  30.3.2011,  12:33 Найти цитируемый пост)
Не проще ли использовать PageControl и на страницы накидать тех компонентов, что должны быть на миди-формах?


Нет, не проще. В программе иногда нужно будет рассматривать одновременно два или больше окон. Да и форм предполагается большое количество.

Автор: Valart 3.4.2011, 18:35
Судя по всему, проблема действительно неразрешимая, хотя кажется такой простой...

Автор: superVad 3.4.2011, 18:43
Кинь справа панель с alClient. А уже на эту панель TabControl alTop.

Автор: Valart 4.4.2011, 15:26
Цитата(superVad @  3.4.2011,  18:43 Найти цитируемый пост)
Кинь справа панель с alClient. А уже на эту панель TabControl alTop.


Ты сам пробовал? Если панель будет alClient, то где будут отображаться дочерние окна? Подсказываю: под панелью.

Автор: Frees 4.4.2011, 16:15
Цитата(Valart @  4.4.2011,  18:26 Найти цитируемый пост)
Ты сам пробовал? Если панель будет alClient, то где будут отображаться дочерние окна? Подсказываю: под панелью.

для дочерних окон можно парентом панель сделать, и они будут на ней показываться.

Автор: Valart 4.4.2011, 17:01
Цитата(Frees @  4.4.2011,  16:15 Найти цитируемый пост)
для дочерних окон можно парентом панель сделать, и они будут на ней показываться.


Пробовал уже. Но что-то не получилось. Не отображается у меня дочернее окно на панели. Если у тебя получилось, то пожалуйста напиши как?

Автор: _Dimon_ 5.4.2011, 01:17
1) Есть компонент TsFrameBar из пакета http://alphaskins.com (для СНГ бесплатно даже в ком. целях). 
    Можно поменять MDI-Child на фреймы(а можно и не менять). События обработки есть в этом компоненте.  (ну это другой вариант)
2) Не могу понять, почему не работает так, как предложил Frees в последнем посте.

Может не так понял, но судя поскриншотам задача легко решается.

З.Ы. Напиши как создаешь чилд-форму, может там че не то, хз......................

Автор: Frees 5.4.2011, 06:23
Цитата(Valart @  4.4.2011,  20:01 Найти цитируемый пост)
Пробовал уже. Но что-то не получилось. Не отображается у меня дочернее окно на панели. Если у тебя получилось, то пожалуйста напиши как?

нет я так не пробовал, поэтому и не посоветовал такой вариант в своем первом посте.


Цитата(_Dimon_ @  5.4.2011,  04:17 Найти цитируемый пост)
2) Не могу понять, почему не работает так, как предложил Frees в последнем посте.

попробовал, не работает..

просто присвоить Parent не работает

Код

procedure TMainForm.CreateMDIChild(const Name: string);
var
  Child: TMDIChild;
begin
  { create a new MDI child window }
  Child := TMDIChild.Create(Application);
  Child.Parent := Panel1;
  Child.Caption := Name;
  if FileExists(Name) then Child.Memo1.Lines.LoadFromFile(Name);
end;


при присвоении

Код

---------------------------
Debugger Exception Notification
---------------------------
Project MDIAPP.exe raised exception class EInvalidOperation with message 'Cannot focus a disabled or invisible window'.
---------------------------
Break   Continue   Help   
---------------------------



Автор: Valart 5.4.2011, 09:58
Цитата(_Dimon_ @  5.4.2011,  01:17 Найти цитируемый пост)
З.Ы. Напиши как создаешь чилд-форму, может там че не то, хз......................


Цитата(Frees @  5.4.2011,  06:23 Найти цитируемый пост)
Child := TMDIChild.Create(Application);


smile

Автор: Valart 5.4.2011, 13:57
Цитата(_Dimon_ @  5.4.2011,  01:17 Найти цитируемый пост)
1) Есть компонент TsFrameBar из пакета AlphaControls (для СНГ бесплатно даже в ком. целях). 
    Можно поменять MDI-Child на фреймы(а можно и не менять). События обработки есть в этом компоненте.  (ну это другой вариант)


А он, этот TsFrameBar, может быть контейнером для форм?

Автор: Valart 5.4.2011, 17:17
Попробовал сделать вот так:
user posted image
Т.е. бросил на форму CategoryPanelGroup (alLeft), Panel1 (alClient). На Panel1: TabControl (alTop) и Panel2 (alClient).
Ну и написал Form2.Parent := Panel2.
При этом Form1 и Form2 обычные, не MDI, формы.
Но сразу же обнаружились недостатки: нельзя переключиться на форму, кликнув мышкой в произвольное место на ней, а только по заголовку; размер дочерней формы автоматически не меняется при изменении размера родительской. Т.е. всё это нужно будет дописывать руками.

Автор: Valart 6.4.2011, 09:11
Цитата(_Dimon_ @  5.4.2011,  01:17 Найти цитируемый пост)
1) Есть компонент TsFrameBar из пакета AlphaControls (для СНГ бесплатно даже в ком. целях).     Можно поменять MDI-Child на фреймы(а можно и не менять). События обработки есть в этом компоненте.  (ну это другой вариант)


Ну, с этим компонентом всё понятно. Не подойдёт он по ряду причин. Там же для переключения используются вертикально расположенные кнопки-заголовки, да и как с помощью него открыть на просмотр несколько окон? В общем, не годится!

Автор: Valart 6.4.2011, 11:44
Кстати, кто-нибудь знает компонент-наследник от TabControl или TabSet для переключения между окнами?

Автор: Frees 6.4.2011, 12:09
 я такой знаю
http://www.tmssoftware.com/site/aot.asp

Автор: Valart 6.4.2011, 12:26
Цитата(Frees @  6.4.2011,  12:09 Найти цитируемый пост)
я такой знаюhttp://www.tmssoftware.com/site/aot.asp


На сколько я понял, TAdvOfficeMDITabSet платный и годится только для переключения между MDI.
А бесплатных аналогов с поддержкой обычных окон нет?

Автор: Valart 8.4.2011, 14:56
В общем, решил, что всё-таки буду использовать MDI-формы. Потому как иначе возникнут лишние заморочки с доделыванием обычных форм до свойств и поведения MDI.
Для переключения между дочерними окнами нашел вот это: http://www.mitec.cz/mdibg.html.

А вот решение моего вопроса: http://www.sql.ru/forum/actualthread.aspx?tid=767142
http://s1.ipicture.ru/

Автор: Gwire 12.4.2011, 14:01
Как вариан могу предложить следуюшее:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
    AutoScroll:= False;

    // Место для TPageControl
    PanelTabs := TPanel.Create( Self );
    PanelTabs.BevelOuter := bvNone;
    PanelTabs.Align      := alTop;
    PanelTabs.Parent     := Self;

    // Отступ для TPageControl
    BevelTabSp := TBevel.Create( Self );
    BevelTabSp.Shape  := bsSpacer;
    BevelTabSp.Align  := alLeft;
    BevelTabSp.Parent := PanelTabs;

    // TPageControl
    PageControl := TPageControl.Create( Self );
    PageControl.Align  := alClient;
    PageControl.Parent := PanelTabs;

    // Отступ рабочей области дочерных окон
    PanelSpacer := TPanel.Create( Self );
    PanelSpacer.BevelOuter := bvNone;
    PanelSpacer.Align      := alLeft;
    PanelSpacer.Parent     := Self;
    PanelSpacer.OnResize   := PanelSpacerResize;

    // Панель для бокового меню
    PanelWork := TPanel.Create( Self );
    PanelWork.BevelOuter := bvNone;
    PanelWork.Parent     := Self;

    // Для изменения разменов PanelSpacer
    Splitter := TSplitter.Create( Self );
    Splitter.ResizeStyle := rsUpdate;
    Splitter.AutoSnap    := False;
    Splitter.Align       := alLeft;
    Splitter.Left        := PanelWork.Width + 1;
    Splitter.Parent      := Self;
end;
Код

procedure TForm1.PanelSpacerResize(Sender: TObject);
begin
    PanelWork.Width  := PanelSpacer.Width;
    PanelWork.Height := PanelSpacer.Height + PanelTabs.Height;
    BevelTabSp.Width := PanelSpacer.Width + Splitter.Width;
end;

Автор: Gwire 12.4.2011, 14:17
А по поводу переключения. В TabSet.Tag присваивай указатель формы которая связана с ним
Код

var F: TForm2;
  // . . .
  TabSet.Tag := Integer( F );

Код

  TForm(PageControl1.ActivePage.Tag).BringToFront;


Автор: Gwire 12.4.2011, 14:45
Cовет: Чтобы не парить мозги что написать в AlignControls
1) Сохрани в папку с проектом файл Controls.pas.
2) Добавь его к проекту
3) И поменяй местами строки как тебе нравится (найди поиском):
Код

      DoAlign(alTop);
      DoAlign(alBottom);
      DoAlign(alLeft);
      DoAlign(alRight);
      DoAlign(alClient);
      DoAlign(alCustom);

PS: Этот вариант мне лично понравился.

Автор: Valart 13.4.2011, 10:29
Gwire, спасибо, но вариант с sql.ru мне нравится больше. Он, скажем так, более красивый. smile
А по переключению, я просто не хочу обрабатывать вручную. Делал так когда-то, только с TabSet. Есть хороший бесплатный компонент, так почему его не использовать? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)