我准备制作一个类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、右边的工作区上的各表单是用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;
解决方案 »
- 在DELPHI中用什么语句可以将一个过程或函数中止。
- 高手请进,高分,关于用ACCESS数据库多条件查询出现的问题,提示错误!!
- 如何写一个软件项目报价书??
- intraWeb的“后退” 和 升级
- 如何存取服务器的目录下的文件?
- 奇怪问题,高分求解
- Delphi如何做到监视一个WEB窗口的运行,并能截取WEB窗口发往网站的消息?在线等候...
- windows启动的问题
- property Connection:TADOConnection read FConnection write FConnection中read和write 的作用
- 使用spcomm控件读写串口,怎么判断串口是否已经打开?
- 工作了,散点分!
- 如何截获这些消息?
首先在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系列控件刚开始接触可能感觉比较麻烦,但这种控件对于标准化程序控制很有帮助!