当用户在多个页面中进行切换时,程序应当保证对当前页面进行编辑。 例如在多页编辑器中,用户选中某一页面,即可对该页面中的文件进行编辑、寻找、设置、打印等。为了实现这一功能,定义了一个TMemo类型的变量:Memo1,该变量没有实例化,每次调用DynaAdd,DynaDel方法均定把TabIndex指定页面的Memo指针传给Memo1。这样在程序运行中,始终有一个实例化的Memo指针赋给Memo1,而菜单中的文本编辑功能均对Memo1进行操作。这种指针传递就能保证对当前页进行操作。
定义了TDynaPage后,只需在Open,Close菜单项中加入如下代码,即可方便的在用户打开关闭文件时创建成删除页面。
procedure TEditForm.Close1Click(Sender: TObject);
begin
if DynaPage.CurPage<>0 then
DynaPage.Del(Notebook1,DynaPage.CurPage);
if Notebook1.Pages.count = 1 then
Close1.Enabled:=False;
end;
procedure TEditForm.Open1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
if not(OpenFile or NewFile) then
begin
OpenFile:=true;
Open(OpenDialog1.FileName);
Notebook1.Pages.Strings[0]:=ExtractFileName( OpenDialog1.FileName);
TabSet1.Tabs:=Notebook1.Pages;
end
else
begin
DynaPage.DynaAdd( Notebook1, ExtractFileName(OpenDialog1.FileName));
Open(OpenDialog1.Filename);
if Notebook1.Pages.count > 1 then
Close1.Enabled:=True;
end;
end;
end;
4.3 文本编辑部件及应用
4.3.1 TEdit 部件
TEdit部件是一个标准的编辑框,用户可在编辑框中输入数据。编辑框也可向用户显示数据。编辑时只能读写一行信息。
TEdit的Text属性存放着用户输入的数据或向用户显示的数据,Modified属性用以标识 Text的数据是否改变,可通过设置Maxlength属性值来限制用户输入字符的个数量,CharCase
属性可定义编辑框中字符的大小写。如果设计者想禁止用户输入,可将ReadOnly属性设置成真值。编辑框也能用做密码输入框。通过设置PassWordChar 属性的值,可将用户输入的字符在编辑框中显示成指定的字符,如"*"号等。编辑框还可以进行字符选择操作、粘贴、复制和剪切操作。
4.3.2 TMemo 部件
TMemo部件与TEdit部件类似,能向用户显示数据,用户也可输入数据。与TEdit 部件
不同的是,TMemo部件可以处理多行文本,因此主要用于编辑文件。
TMemo的Text属性只能在运行时才能访问。Modified属性用以标识Text的数据是否改
变,通过设置MaxLength属性值来限制用户输入字符的数量。
如果把文本当成一个整体进行访问,可使用Text属性;若想逐行访问,则要使用Lines属性。Lines属性能对文件更方便地进行访问。Lines是TStrings类型的,因此可使用Add 、Delete方法,例如在Memo1中加入一行字符串的代码如下:
Memo1.Lines.Add('Another line is added');
通过Lines属性可以方便地把文件读入部件中,例程中使用下面的代码将文件读入Memo1:
Memo1.Lines.loadFromFile(Filename).
从TMemo 部件中剪切、复制、粘贴文本非常方便,只需使用 CutToclipboard ,CopyToClipBroad,PasteFromClipBoard方法,其代码如下:
Memo1.CopyToClipboard
Memo1.CutToClipboard
Memo1.PasteFromClipboard
TMemo有一些属性,用以控制文本的显示效果。ScrollBars属性可以定义部件的水平滚动条和垂直滚动条。当文件字体改变时,使用AutoSize属性可使部件大小做相应的调整。设置WordWrap属性可以实现自动换行。
例程中Edit|WordWrap菜单项提供了设置WordWrap的功能,并可根据WordWrap的值决定滚动条的形式。当WordWrap为真时,不需要水平滚动条, 并在菜单中作出检查记号。
其代码如下:
procedure TEditForm.SetWordWrap(Sender: TObject);
begin
with Memo1 do
begin
WordWrap := not WordWrap;
if WordWrap then
ScrollBars := ssVertical else
ScrollBars := ssBoth;
WordWrap1.Checked := WordWrap;
end;
SetEditRect;
end;
TMemo部件提供了一组关于选择文本的属性和方法。如果想在部件成为当前控件时自动选择文本,可设置 AutoSelect 属性。运行时可用SelectAll 方法选中部件的全部文本。 Selstart属性返回选中文本的开始位置,SelText 包含着被选中的文本。SelLength属性返回选中文本的长度,这两个属性可用于字符串的查找和替换。下一节将详细讨论。
TMemo的Modified属性是一个运行时才能得到的属性,可判断部件被创建时或Modified属性最后一次设置成假值之后,部件上的文本是否修改。如果修改了,Modified 将设成真值,反之假值。
例程中在关闭文件时将测试文件的modified属性,如果文件修改后尚未保存, 将出现对话框,询问用户是否保存文件,其代码如下:
procedure TEditForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
DialogValue: Integer;
FName: string;
begin
if Memo1.Modified then
begin
FName := Caption;
DialogValue := MessageDlg(Format(SWarningText, [FName]), mtConfirmation,
[mbYes, mbNo, mbCancel], 0);
case DialogValue of
id_Yes: Save1Click(Self);
id_Cancel: CanClose := False;
end;
end;
end;
4.4 常用对话框的使用
Delphi的可视部件类库(Vistual Component Liberty)中,有一组对话框部件,在对象选择板的Dialog 页面中可以找到。 本节着重介绍与文件编辑有关的字体对话框(TFontDialog Componement),查找对话框(TFindDialog Componement) ,替换对话框(TReplace Dialog Componement),文件对开对话框(TOpenDIalog Componement).
应用这几个对话框可对文件进行字体设置、查找、替换等操作,但需要编写相应的代码。
4.4.1字体对话框部件
字体对话框部件在应用程序中产生字体对话框, 用户可在对话框中进行字体选择和属性设置。用户选择字体并按下OK按钮之后,有关信息便贮存在部件的Font属性中。
应用程序可通过调用字体对话框的Execult方法来显示对话框,当用户选择OK按钮时,Execult返回True值,否则返回Flase值。
应用程序可以使用Options属性来定义字体对话框的显示和行为方式:例如可在对话框中定义一个帮助按钮或指定出现在字体列表框中的字体。有关Options的主要取值如下表4.1:
表4.1 字体对话框的Options取值及含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
取值 含义
───────────────────────────────────────
AdAnsiOnly 如果是真值,只能使用Window字符集,
fdEffects 如果是真值,对话框中显示颜色列表和效果检查框;用户可使
用效果检查框定义Strikout下划线文本;使用颜色列表定义字体
颜色。
fdForceFontExise 如果是真值,用户在字体组合框中输入字体名后选择OK按钮,
将出现一个用户字体无效的消息框。
fdNoOEMFont 如果是真值,字体组合框中将不显示向量字体。
fdShowHelp 如果是真值,对话框显示Help按按钮。
fdWysiwyg 如果是真值, 只有打印和屏幕均可得到的字体才会出现在字体
组合框中。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例程中(Edit/Font)菜单具有设置文本字体的功能,其代码如下:
procedure TEditForm.SetFont(Sender : TObject);
begin
FontDialog.Font := Memo1.Font;
if FontDialog1.Execult then
Memo1.Fout := FontDialog1.Font;
SetEdit Rect;
end;
4.4.2查找对话框部件
查找对话框部件为应用程序提供查找对话框, 用户可使用查找对话框在文本文件中查找字符串。
可用Execult方法显示查找对话框,如图4.8。应用程序要查找的字符放到FindText属性中。Options 属性可决定查找对话框中有哪些选项。例如, 用户可选择是否显示匹配检查框。Options的常用选项如表4.2所示。
考试大论坛 如果用户在对话框中输入字符并选择FindNext按钮,对话框将发生OnFind事件。
表4.2 查找对话框的Options属性的取值及含义
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
取值 含义
──────────────────────────────────────
frDown 如果是真值,对话框中出现Down按钮,查找方向向下。如果是假
值,Up按钮将被选中,查找方向向上,frDown 值可在设计或运行
时设置。
frDisableUpDown 如果是真值,Up和Down按钮将变灰,用户不能进行选取;如果是
假值,用户可以选择其中之一。
frFindNext 如果是真值,应用程序查找在FindNext属性中的字符串。
frMatchCase 如果是真值,匹配检查框被选中。设计、运行时均可设置。
frWholeWord 如果是真值,整字匹配检查框被选中,设计、运行时均可设置。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
在OnFind事件中可使用Options属性来决定以何种方式查找。Find方法响应查找对话框的OnFind事件。
procedure TEditform.Find(Sender: TObject);
begin
with Sender as TFindDialog do
if not SearchMemo(Memo1, FindText, Options) then
ShowMessage('Cannot find "' + FindText + '".');
end;
其中SearchMemo函数是Search单元中定义的,SearchMemo可在TEdit,TMemo,以及其它TCustomEdit派生类中查找指定的字符串。查找从控件的脱字号(^)开始, 查找方式由Options决定。如果向后查找从控件的StlStart处开始,如果向前查找则从控件的SelEnd处查找。
如果在控件中找到相匹配的字符串,则字符串被选中,函数返回真值。如无匹配的字符串,函数返回假值。
特别注意的是TEdit,TMemo中有一个HideSeletion属性,它决定当焦点从该控制转移至其它控制时,被选中的字符是否保持被选中的状态。如果是真值,则只有获得焦点才能保持被选中状态。查找时,焦点在查找对话框上,因此要想了解查找情况,必须将HideSeletion设成假值。控制的缺省值为真值。