设为首页 加入收藏

TOP

【转】代码编辑器(三)-PageControl和类(一)
2017-10-10 12:06:42 】 浏览:7389
Tags:代码 编辑器 -PageControl 和类
恩恩,有这么一篇转载自这里的文章;http://www.th7.cn/Program/delphi/201602/762726.shtml,呵呵,真有趣
 
PageControl位于Win32选项卡中,可以在控件上右键点击“New Page”,来实现静态的页面添加。
先说说几个重要的属性:
ActivePage:当前活动的页面(在设计模式中切换页面会更改ActivePage属性)
MultiLine:选项卡以多行形式显示。
Style:页面样式。
tsTabs:(默认)选项卡样式
tsButtons:按钮样式(经典样式)
tsFlatButtons:按钮样式2(经典样式)
TabHeight, TabWidth:选项卡位置设置(默认为0,单位:px)

TabPosition:选项卡的位置

tpBottom:下面(很奇怪)
tpLeft:左面(经典样式)
tpRight:右面(经典样式)
tpTop:(默认)上面

然后是PageControl中的TabSheet:

Caption:在选项卡中显示的内容
TabVisible:选项卡可见性
PageIndex:页面的索引值
首先添加一个PopupMenu,PageControl1。PageControl不要添加TabSheet。
PageControl的Align设置为alClient,PupopMenu设置为PopupMenu1。
PopupMenu1添加如下菜单(Add的Visible是False):
然后进入代码编辑界面,在interface中的uses引用StdCtrls。
和以前不同的是,之前是把Memo也添加到窗体中,直接在属性窗口设置好相应的属性值。但是,用代码创建的控件,就只能用代码去设置其属性了。
 
不难看出,这里面的每一个控件(包括窗体)都是一个类。当然,不同于C++java,类定义了之后要手动创建,一般情况下是Create()。
1 procedure TForm1.Button1Click(Sender: TObject); 2 var
3  btn: TButton; 4 begin
5   btn := TButton.Create(); 6   //下面是对Button的属性修改
7   btn.Caption := '按钮'; 8 end;
然后,在ActionList中添加一些Action,接下来设置主菜单。如图:

Action里面的StandardAction可以直接使用。
只不过,有的还需要自己手动添加代码,比如:打开等等。
像撤销,剪切,粘贴等不需要自己添加代码,也不需要自己弄Enabled属性。
之前说过,只有窗体,菜单(主菜单和弹出式菜单),按钮等一些控件能使用Action。
想想如果不使用ActionList里面的StandardAction,自己去写代码的话,除了引用Clipbrd.pas之外就是使用Windows.pas里面的SendMessage了。
不过,还是得提醒一下:在菜单上添加Action会更改菜单的Caption, Checked和ShortCut属性。
所以在设置完Action之后再改Caption(StandardAction的默认的Caption是英文...)。
--如何判断当前活动的Memo
在这里,一个Page里面只有一个Memo,这样,就可以通过PageControl的ActivePageIndex来决定了。
在静态使用Memo的时候我们可以直接Memo1.Text什么的,但是现在不可以。那么,可以用下面的替代:
类名(PageControl1.Pages[PageControl1.ActivePageIndex].Controls[0]).属性
比如:
TMemo(PageControl1.Pages[PageControl1.ActivePageIndex].Controls[0])
--关闭页面与打开、保存
关闭的时候,直接调用TabSheet的Destroy()就可以了,对于容器型的控件来说,对容器进行Destroy的同时,内部的控件也同样会被Destroy。
注意,静态添加的控件也可以用代码Destroy。但是...不推荐这么做。
在关闭之前最好询问用户没保存的文件是否保存。
那么,Memo的Modified属性就非常重要了,初始情况是False,当文本框的内容出现变化的时候Modified为True(但也有特例)。
在不考虑UTF-8编码的情况下直接使用Lines.LoadFromFile()和Lines.SaveToFile()就可以了。
 1 procedure TForm1.FileOpenAccept(Sender: TObject);  2 var
 3   fName: string;  4  cIndex: Integer;  5 begin
 6  Add1.Click();  7   cIndex := PageControl1.ActivePageIndex;  8   fName := FileOpen1.Dialog.FileName;  9   TMemo(PageControl1.Pages[cIndex].Controls[0]).LoadFromFile(fName); 10 end;
在不考虑类的继承的情况下,保存这部分实现比较难而且很麻烦。
首先,需要一个字符串类型的动态数组,按照PageControl1的标签的顺序记录其完整的文件名(新建的文件,值为空),而且数组的索引值要和PageControl的TabSheet的索引值对应。
然后还需要考虑什么时候需要修改这个动态数组等等。显然很麻烦。
所以,这里通过类的继承实现。则有:
1 type
2   TRecEdit = class(TMemo) 3   protected
4     fPath: string;        //用于存放通过打开的文件的完整路径
5   end;
这样子类拥有父类能继承的所有属性,以及子类定义的属性。
类的定义写在interface中。
另外,主菜单的“关闭当前”和“关闭所有”使用的过程基本相同,这样我们可以不用在另一个过程里面写xxx.Click();了。
选择一个菜单,在属性窗口中单击Events,找到OnClick,选择要使用的过程即可。
当用户关闭窗口的时候,应该询问用户没保存的文件是否保存,当然,这里面会用到while循环,同时我定义了函数ClosePageQuery,通过其返回值来决定。
当ClosePageQuery返回False的时候使FormCloseQuery的CanClose为True。
则有如下代码:
1 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 2 begin
3   while PageControl1.PageCount > 0 do
4     if not ClosePageQuery() then begin
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【转】Png异形窗口 下一篇【Asphyre引擎】发布了新版本V101

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目