Tab控制和多窗口是怎样实现?100分!!(100分)

  • 主题发起人 主题发起人 gzwy
  • 开始时间 开始时间
G

gzwy

Unregistered / Unconfirmed
GUEST, unregistred user!
有谁知道UltraEdit的Tab控制和多窗口是怎样实现的,有例子源代码吗?给我一份,谢谢!
 
放一个空的pagecontrol在form上,使其充满客户区。
然后每打开一个文件增加一个tab
var
temptab:ttabsheet;
begin
temptab:=ttabsheet.create(pagecontrol1);
temptab.pagecontrol:=pagecontrol1;
temptab.caption:=文件名;
.....
end;
 
多窗口可以在属性里直接设,tab 的控制也有相应的属性,找找吧formstylet和taborder
 
各位,在MDI中,点击不同的Tab怎样切换到相对应的MdiChile窗口,还有产生新的
Mdichild或关闭Mdichild窗口时Tab怎样知道,怎样排序?????
 
先搞个tagcount来计数
在新建一个mdichild的时候,
mdichild.tag:=tagcount+1
new 一个tab ,tab.tag=mdichild.tag
你可以设一下tab和mdichild窗口的tag属性,在点中那个tab的时候,找一下mdichild窗口那个tag和tag的tag是相等的,就把这个mdichild给显示到激活,在关闭的时候也一样,如果关闭mdichild,查找tab
的tag和mdichild的tag相等的那个,然后把tab free掉。

 
honghs的方法基本上是原理了。不过,我是通过在OnIdle中
检测子窗口的变化来动态改变tab的,这样,就不需要在子
窗口创建和删除的时候进行判断了。(其实这时候就在OnIdle
中进行处理了)。

在frmMain上放一个ApplicationEvent控件,在OnIdle中调用
CheckChildren(false);
tbcWindows是TTabControl(没用TPageControl)。
由于我在别的地方也需要调用Children列表,所以用了一个
private
ChildList:TStringList;//保存各个Child的Tag标记。

procedure TfrmMain.CheckChildren(force:boolean);
var
iLoop:integer;
begin
if((ChildList.Count = MDIChildCount) and (not force))
then exit;

tbcWIndows.Tabs.BeginUpdate;
try
tbcWindows.Tabs.Clear;
ChildList.Clear;
for iLoop := 0 to MDIChildCount - 1 do
begin
tbcWIndows.Tabs.Add((MDIChildren[iLoop]).Caption);
ChildList.Add(IntToStr((MDIChildren[iLoop]).Tag));
end;

for iLoop := 0 to MDIChildCount - 1 do
begin
if(MDIChildren[iLoop] = ActiveMDIChild) then
begin
tbcWindows.TabIndex := iLoop;
break;
end;
end;
finally
tbcWindows.Tabs.EndUpdate;
end;
end;

procedure TfrmMain.tbcWindowsChange(Sender: TObject);
var
tagIndex :integer;
begin
if(tbcWindows.Tabs.Count = 0)
then exit;

tagIndex := StrToInt(ChildList.Strings[tbcWindows.TabIndex]);
ShowSelectedChild(tagIndex);
end;

procedure TfrmMain.ShowSelectedChild(TagIndex:integer);
var
I:integer;
begin
if ActiveMDIChild <> nil then
begin
if(ActiveMDIChild.Tag = tagIndex) then exit;

for I := MDIChildCount - 1 downto 0 do
begin
if(MDIChildren.Tag = tagIndex) then
begin
MDIChildren.Show;
break;
end;
end;
end;
end;
 
PageControl不好,窗口有浪费。
我的方法是用TabSet提供切换,编辑区直接对齐到Form,
最大限度地利用窗口空间。
 
多人接受答案了。
 
后退
顶部