用 Delphi 开发一个简单的记事本程序: 打开和保存功能

| 选择喜欢的代码风格  

在使用各种 Windows 应用程序和 Delphi 时,我们已经习惯于使用标准对话框之一来打开和保存文件、查找和替换文本、打印,选择字体或设置颜色。

在本文中,我们将研究这些对话框的一些最重要的属性和方法,特别关注“打开”和“保存”对话框。

常用对话框位于“组件”选项板的“对话框”选项卡上。

这些组件利用标准Windows对话框(位于 \Windows\System 目录中的DLL中)。 要使用通用对话框,我们需要在表单上放置适当的组件(组件)。 公共对话框组件是非可视的(没有可视设计时界面),因此在运行时对用户不可见。

Delphi - 所见即所得 WYSIWYG


TOpenDialog 和 TSaveDialog


“文件打开”和“文件保存”对话框具有几个常用属性。 文件打开通常用于选择和打开文件。 从用户获取文件名以保存文件时,将使用“文件保存”对话框(也用作“另存为”对话框)。 TOpenDialog 和 TSaveDialog 的一些重要属性是:

  • 选项属性对于确定框的最终外观非常重要。 例如,一行代码如:
  • with OpenDialog1 do
    	Options := Options +
    	[ofAllowMultiSelect, ofFileMustExist];//注意这里!
    
    将保留已设置的选项,并允许用户在对话框中选择多个文件,并在用户尝试选择不存在的文件时生成错误消息。
  • InitialDir 属性用于指定在显示文件对话框时将用作初始目录的目录。 以下代码将确保“打开”对话框的“初始”目录是“应用程序”启动目录。
  • SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName);
    
  • Filter 属性包含用户可以从中选择的文件类型列表。 当用户从列表中选择文件类型时,对话框中仅显示所选类型的文件。 可以通过“过滤器编辑器”对话框在设计时轻松设置过滤器。
  • 要在程序代码中创建文件掩码,请为Filter属性指定一个值,该属性由描述和由竖线(管道)字符分隔的掩码组成。 像这样:
  • OpenDialog1.Filter :=
    'Text 文件 (*.txt)|*.txt|All files (*.*)|*.*';
    
  • FileName 属性。 用户单击对话框中的“确定”按钮后,此属性将包含所选文件的完整路径和文件名。

Execute 方法


要实际创建和显示公共对话框,我们需要在运行时处理特定对话框的 Execute 方法。 除 TFindDialogTReplaceDialog 外,所有对话框都以模态显示

所有常用对话框允许我们确定用户是否单击“取消”按钮(或按ESC)。 由于如果用户单击“确定”按钮,Execute 方法返回 True,我们必须单击“取消”按钮以确保不执行给定代码。

if OpenDialog1.Execute then
	ShowMessage(OpenDialog1.FileName);

此代码显示“文件打开”对话框,并在“成功”调用 Execute 方法(用户单击“打开”)后显示所选文件名。

注意:如果用户单击“确定”按钮,双击文件名(在文件对话框的情况下)或按键盘上的 Enter 键,则 Execute 返回 True。 如果用户单击“取消”按钮,按下 Esc 键,使用系统关闭按钮或使用 Alt-F4 组合键关闭对话框,则 Execute 返回 False

代码


为了在运行时使用Open对话框(或任何其他对象)而不在表单上放置 OpenDialog 组件,我们可以使用以下代码:

procedure TForm1.btnFromCodeClick(Sender: TObject);
var OpenDlg : TOpenDialog;

begin OpenDlg := TOpenDialog.Create(Self);
{set options here...}

if OpenDlg.Execute then begin
{code to do something here}
end;

OpenDlg.Free;
end;

注意:在调用 Execute 之前,我们可以(必须)设置任何 OpenDialog 组件的属性。

我的第一个 Windows 下的 Exe 程序:NotePad++


最后,是时候做一些真正的编码了。 创建一个简单的 NotePad 应用程序 - 类似 Windows 下的记事本这样的应用程序。

在本文中,我们将看到“打开”和“保存”对话框,让我们看看它们的运行情况。

创建 NotePad 用户界面的步骤:

  • 启动 Delphi 并选择 File - New VCL Forms Application
  • 在表单上放置一个 Memo 用于文本编辑、OpenDialog 打开文件对话框、SaveDialog 保存对话框、MainMenu 用于显示菜单。
  • 将菜单加入设置 新建打开(&O)..保存(&S)... 等项目(如图)。

提示:在 Windows 下开发 EXE 我们有一个来自微软默认的潜规则即不需要鼠标我们可以操作 *exe 的一切,这种情况下要求有快捷键,在 Delphi 的 Menu Designer 里我们刚才的 (&O).. 其实就是快捷键 O 可以对应到打开的行为,后面的省略号代表这个行为将在一个新的窗体。中文里我们一般都是括号里用 & 连接我们希望设计的快捷键来操作,英文是直接在字母前面,比如 &Open, &Save, E&xit 等。规范的设计可以让你的 Win32 程序看上去更正式噢。

Coding


1.使用 Object Inspector 将以下代码分配给 FormCreate 事件:

procedure TForm1.FormCreate(Sender: TObject);
begin
with OpenDialog1 do begin
	Options:=Options+[ofPathMustExist,ofFileMustExist];
	InitialDir:=ExtractFilePath(Application.ExeName);
	Filter:='Text files (*.txt)|*.txt';
end;

with SaveDialog1 do begin
	InitialDir:=ExtractFilePath(Application.ExeName);
	Filter:='Text files (*.txt)|*.txt';
end;

//也可以在可见即所得(WYSIWYG)的模式下,设置这些属性
Memo1.ScrollBars := ssBoth;
end;

此代码设置了一些 Open 对话框属性,如本文开头所述。

2.为菜单的打开和保存添加 OnClick 事件添加此代码:

//Open
procedure TForm1.menuOpenClick(Sender: TObject);
begin
if OpenDialog1.Execute then begin
	Form1.Caption := OpenDialog1.FileName + ' - NotePad++';
	Memo1.Lines.LoadFromFile
		(OpenDialog1.FileName);
	Memo1.SelStart := 0;
end;
end;
//Save
procedure TForm1.menuSaveClick(Sender: TObject);
begin
	SaveDialog1.FileName := 'CommandNotFound-Delphi';
	if SaveDialog1.Execute then begin
	Memo1.Lines.SaveToFile
		(SaveDialog1.FileName + '.txt');
	Form1.Caption:=SaveDialog1.FileName + 'NotePad++';
end;
end;

好了,此时,我们按 Ctrl + F9 编译 Delphi 的程序,或者用组合键 Shift + Ctrl + F9 然后运行您的第一个基于 Delphi 的 Windows 下的 Hello World 项目。 你会发现: 文件打开、保存使用过程的体验,就像“真正的”记事本一样,是不是很鸡冻?

Delphi 开发“记事本”总结


Delphi 的语法其实就是 Pascal 语法,Delphi 开发的东西特点是:快速、高效、原生(不需要什么.NET Runtime中间件的库,直接原生 Windows 程序),所以是 RAD 首选,尤其是数据库类型的桌面应用更是方便,很多早期的基于 Win32 的桌面 CRM 系统,如金蝶等,都是基于 Delphi 开发的(或者是 Borland C++ Builder,简称 BCB:均为同一家产品,后续 Borland 卖给了 Embarcadero ..)。

后续 Delphi 也可以开发 Web 应用,如 IntraWeb,也可以开发基于 Android、iOS 的手机 AppIDE 中的“全栈”...), 但由于太过小众,这里对于非 Win32 的开发就严重不推荐使用 Delphi 了。安卓开发,就老老实实的用 Android Studio 或者 Eclipse ADT,开发 iOS App 就用 XCode OC 或者 Swift 吧……

GitHub 上关于本章节 Delphi 入门的 Demo




发表评论