首先添加一个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