我准备制作一个类Outlook风格的软件:即左边放上一些菜单,工作区在右边,现在有两个问题:
1、右边的工作区上的各表单是用Dock(停靠)?MDI方式?还是Frame?
2、有些资料上不建议用MDI,而我在用Dock方式时遇到返回的DockClientCount为0。
代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2:= TForm2.Create(Application);
//  Form2.Dock(Panel2,ClientRect);
  Form2.ManualDock(Panel2,Nil,alBottom); //这两种方式都试用
  ShowMessage(InttoStr(Form2.DockClientCount)); //测试用,总返回0
  Form2.Show;
end;procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  ShowMessage(InttoStr(Form2.DockClientCount)); //测试用,总返回0
  for i := Panel2.DockClientCount - 1 downto 0 do
    if Panel2.DockClients[i].Name= 'Form2' then
      ShowMessage('测试');
end;

解决方案 »

  1.   

    右边我觉得用TNoteBook控件好,只是好象有点闪屏呢!
      

  2.   

    我的意见是使用Action系列控件,方法如下:
    首先在Form1上放一个CoolBar1,设置Align:=alTop,AutoSize:=True;
    然后在CoolBar1上放一个ActionMainMenuBar1和ActionToolBar1,其中前者用来生成菜单效果,后者用来放置一些比较常用的快捷按钮,,然后在Form1上放一个ActionManager1,最后在Form1上放两个Panel1和2,Panel1的属性Align:=alLeft,Panel2的Align:=alClient;Panel1和2中间夹一个Splitter1。
    这所有的工作完成后,可以看到窗体分成了三个部分,接下来就是在Panel1上放若干个Panel3到m,然后均BevelOuter:=bvLowered,然后在每个Panel中再放一个Panel,从m+1到n,Align属性都为alTop;接着在Panel3到m中每个放一个ActionToolBar控件,注意不要放在Align属性为alTop的Panel上,然后把这些ActionToolBar控件的Align属性都设置为alClient;接下来就是写代码实现类似QQ那样的效果了:首先定义一个全局的变量MenuItemPanelList
    var MenuItemPanelList:TObjectList;然后在Form1的OnCreate事件中加上下面的代码
    procedure TForm1.OnCreate(Sender:TObject);
    begin
      MenuItemPanelList:=TObjectList.Create ;
      with MenuItemPanelList do
      begin
        OwnsObjects:=False;
        Add(Panelm+1);
        ......
        Add(Paneln);
      end;
      Panelm+1.OnClick (Panelm+1);
    end;接下来定义个Form1的Public过程AjustMenuItemTitlePanelPosition,这个过程的作用是当点击Panelm+1到n时直接调用这个过程来实现类似QQ的效果
    procedure TForm1.AjustMenuItemTitlePanelPosition(Sender:TObject);
    {当选择一个Paneli时进行位置调整,其中i在m+1到n之间,}
    var
      M,N:Integer;
    begin
      for M:=0 to MenuItemPanelList.Count-1 do
      begin
        //设置所有Panel的位置和大小
        (MenuItemPanelList[M] as TPanel).Align := alNone;
        (MenuItemPanelList[M] as TPanel).Height := 30;
        //记录当前用户选择的Panel是那个
        if MenuItemPanelList[M] = (Sender as TPanel).Parent then
          N := M;
      end;
      //实现滑动效果
      for M := N-1 downto 0 do
        (MenuItemPanelList[M] as TPanel).Align := alTop;
      for M := MenuItemPanelList.Count-1 downto N+1 do
        (MenuItemPanelList[M] as TPanel).Align := alBottom;
      (MenuItemPanelList[M] as TPanel).Align := alClient;
    end;最后将Panelm+1到n的OnClick事件全部指向这个过程,这样运行程序的时候,你就可以看到在主窗口的左侧有多个分块,你点哪个分块哪个分块就展开,从而实现类似QQ的那样的效果。至于具体的分块中放什么内容,你可以在ActionManager1中建立若干个Category,然后把这些Category拖到对应的ActionToolBar中就可以了。虽然Action系列控件刚开始接触可能感觉比较麻烦,但这种控件对于标准化程序控制很有帮助!
      

  3.   

    我这问题是有关Dock,有人知道吗?
      

  4.   

    Dock?我给你介绍现在最标准的方法,你还死定着Dock干什么啊?Dock也不是很麻烦吧,不就那几个事件吗?
      

  5.   

    to  FrameSniper(框架狙击手) :你这也不失为一种实现Outlook风格功能选择的好方法。但我现在希望解决的是右边用户区(功能实现区)的实现方式。即在选定左边的相应菜单后,右边以何种方式来显示相应的Form?是以Dock?MDIChild?还是Frame?