Delphi:RzPageControl(pagecontrol)实现多标签的动态添加,切换,关闭

摘要:
使用RzPageControl实现多个选项卡。使用菜单打开选项卡。通过标签的标题判断标签是否已打开。1.创建选项卡并判断它们是否是打开的页面processTFmain Page1Click(Sender:TObject);varnewpage:TRzTabSheet;索引:整数;开始新页面:=nil;如果没有进入页面('第一页

使用RzPageControl来实现多标签页
使用菜单来打开标签页,通过标签页的caption来判断将标签页是否已经被打开过了.

1.创建标签页,并判断是否是已经打开过的页面

 

procedure TFmain.Page1Click(Sender: TObject);
var
newpage:TRzTabSheet;
index:integer;
begin
newpage:=nil;
if not gotopage('第一页',newpage) then
begin
index:=findpage('第一页');
if index=-1 then exit;
Form1:=TForm.Create(nil);
Form1.Parent:=Fmain.pagecontrol1.Pages[index];
Form1.Align:=alclient;
Form1.BorderStyle:=bsnone;
Form1.Show;
end;
end;

gotopage函数,跳转到需要显示的那页,不存在的话就创建那一页

{
gotopage:跳转到某页
如果存在这页,跳转后返回true;
如果不存在,则新建一页,返回false;
}
function TFmain.gotopage(scaption:string;newpage:TRzTabSheet):boolean;
var
i:integer;
isExists:Boolean;
begin
newpage:=nil;
isExists:=false;
if length(scaption)<=0 then exit;
for i:=0 to pagecontrol1.PageCount-1 do
begin
if pagecontrol1.Pages[i].Caption=scaption then
begin
pagecontrol1.ActivePage:=pagecontrol1.Pages[i];
isExists:=true;
break;
end;
end;
if not isExists then
begin
newpage:=TRZTabSheet.Create(pagecontrol1);
newpage.Caption:=scaption;
newpage.PageControl:=pagecontrol1;
pagecontrol1.ActivePage:=newpage;
end;
result:=isExists;
end;

findpage函数,找到指定caption的那一页,返回那页的index,如果那页不存在,返回-1

{
findpage:根据标题查询页,返回index
参数为页caption
没有找到返回-1,找到返回index
}
function TFmain.findpage(scaption:string):integer;
var
i:integer;
isExists:boolean;
begin
isExists:=false;
for i:=0 to pagecontrol1.PageCount-1 do
begin
if pagecontrol1.Pages[i].Caption=scaption then
begin
pagecontrol1.ActivePage:=pagecontrol1.Pages[i];
isExists:=true;
result:=i;
break;
end;
end;
if not isExists then result:=-1;
end;


2.双击标签,关闭标签页
RzpageControl的双击事件,如果标题不是’首页’就关闭当前显示的这页

procedure TFmain.PageControl1DblClick(Sender: TObject);
begin
if PageControl1.ActivePage.Caption<>'首页' then
pagecontrol1.CloseActiveTab;
end;


3.通过关闭按钮关闭
先设置ShowCloseButton属性为true
然后重写OnClose事件

procedure TFmain.PageControl1Close(Sender: TObject;
var AllowClose: Boolean);
begin //如果只剩下一页不关闭,或当前页是首页不关闭
if (self.PageControl1.PageCount=1) or (self.PageControl1.ActivePage.Caption='首页') then
begin
AllowClose:=False;
Exit;
end;
AllowClose:=True;
end;

Delphi中TRzPageControl实现多窗口的融合窗口
procedure ShowDockForm(FormClass: TFormClass; dockCtrl: TWinControl;
IsMaxed: Boolean);

procedure ShowCaption(ParentCtrl:TWinControl;ACaption:string);
begin
   if ParentCtrl is TRzTabSheet then
    TRzTabSheet(ParentCtrl).Caption := ACaption;
end;

var
i: Integer;
TabCtrl:TRzTabSheet;
Form:TForm;
begin
Screen.Cursor := crHourGlass;
try
   for i := 0 to Screen.CustomFormCount - 1 do
     if Screen.CustomForms[i] is FormClass then
     begin
       if (not (Screen.CustomForms[i]).Visible) then
         (Screen.CustomForms[i]).Visible := True;
       (Screen.CustomForms[i]).BringToFront;
       (Screen.CustomForms[i]).SetFocus;
       TabCtrl := TRzTabSheet(Screen.CustomForms[i].Parent);
       ShowCaption(TabCtrl,Screen.CustomForms[i].Caption);
       TRzPageControl(dockCtrl).ActivePageIndex := TabCtrl.PageIndex;
         exit;
     end;

   TabCtrl := TRzTabSheet.Create(dockCtrl);   //dockCtrl
   TabCtrl.PageControl := TRzPageControl(dockCtrl);
   TRzPageControl(dockCtrl).ActivePageIndex := TabCtrl.PageIndex;

   Form := FormClass.Create(TabCtrl);
   with Form do
   try
     ManualDock(TabCtrl);
     ShowCaption(TabCtrl,Caption);

     Show;
     Form.WindowState := wsMaximized;
     Form.Align := alClient;
   except
     Free;
   end;
  
finally
   Screen.Cursor := crDefault;
end;
end;

免责声明:文章转载自《Delphi:RzPageControl(pagecontrol)实现多标签的动态添加,切换,关闭》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在WPF中使用字体图标xml中设置button的背景颜色下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delphi dbgrideh颜色设置

dbgrideh颜色设置 (2010-06-30 10:30:59)转载 标签:杂谈 (1)分行不同颜色设置;在DBGridEh1DrawColumnCell中写;     if ADOQuery1.RecNo mod 2=0 then    begin        DBGridEh1.Canvas.Font.Color := clRed...

Pascal精要笔记

Pascal精要笔记 Pascal语言的大小写不敏感特性有一个例外:控件包中的Register 过程必须以大写字母R开始,因为需要与C++Builder 兼容。 ,编译器不编译代码中的空格、空行和Tab键空格,这些元素通称为空白,它们只用来提高代码的可读性,不影响编译过程。(也就是说: = 这样的写法没有问题,我原来还以为由问题那!) 记住要用代码模板(方便...

【转】DELPHI 线程类

原文地址:http://yyimen.blog.163.com/blog/static/179784047201211811178223/ Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就...

delphi 数组类型

数组类型 数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素。定义数组时,方括号也用来指定可能的下标值。例如,下面的代码中定义了一个有 24 个整数的数组:type    DayTemperatures = array [1..24] of Integer;在数组定义时,你需要在方括号中填入一个子界类型的值,或者用两个有序类型的...

delphi类型转换 asci与char

ord(char) = asc chr(asc) = char inttohex(int,1) = hex (string)   使用AStr[i]取AStr:String中的第i个字符时需要注意的事项:这里i表示第i个字符,并不是通常的0表示第1个,i表示第i+1个。   二位的16进制转换为10进制: function HexToInt(hex :...

Delphi指针的定义和取值

效果图如下: 要点: 1.指针的2中定义方法 PInteger 和 ^Integer 2.取地址符号 @ 和 Addr函数 3.取内容符号 ^ ,比如MyPointInt1^则是取MyPointInt1指针所指向的内容了。 program MyPoint; //指针详解 {$APPTYPE CONSOLE} usesSysUtils,windows,G...