在前面两节中,对于嵌入式数据库管理工具的开发已经实现了基本的功能,但不是一个完整的产品,在此基础上应该具有 sql 文件的操作能力,实际上就是类似于记事本功能,所以本节我们在前面两节的基础上实现文件操作能力。
对于 sql 文件操作,主要表现在“新建”、“打开”、“保存”、“另存为”等按钮上,由于这几个按钮的操作需要在不同的情况下交叉调用,比如:新建文件时要判断当前操作的文件是否已经保存,如果未保存则保存文件,在保存文件的时候还要看看是否有文件名,没有文件名的情况下,需要执行另存为的功能等。所以需要对文件的操作进行封装,具体的封装代码如下:
procedure TMainForm.NewFile;
begin
// 新建文件
HasSaved := False;
SavedFileName := '';
SqlMemo.Clear;
FileNameLabel.Caption:='*'+SavedFileName;
end;
procedure TMainForm.OpenFile;
var
F: TextFile;
sLine: String;
begin
// 打开文件
ScriptFileOpenDialog.FileName:='';
if not ScriptFileOpenDialog.Execute then Exit;
AssignFile(F, ScriptFileOpenDialog.FileName);
Reset(F);
SqlMemo.Clear;
while not EOF(F) do
begin
Readln(F, sLine);
SqlMemo.Lines.Add(sLine);
end;
CloseFile(F);
HasSaved := True;
SavedFileName := ScriptFileOpenDialog.FileName;
FileNameLabel.Caption:=SavedFileName;
end;
procedure TMainForm.SaveFile;
var
F: TextFile;
i: Integer;
begin
// 保存文件
AssignFile(F, SavedFileName);
Rewrite(F);
for i:=0 to SqlMemo.Lines.Count do
Writeln(F, Utf8encode(SqlMemo.Lines.Strings[i]));
CloseFile(F);
HasSaved := True;
FileNameLabel.Caption:=SavedFileName;
end;
Function TMainForm.SaveAsFile:Boolean;
var
F: TextFile;
i: Integer;
isSave: Boolean;
begin
// 另存为文件
ScriptFileSaveDialog.FileName:='';
if not ScriptFileSaveDialog.Execute then
begin
Result:=False;
Exit;
end;
isSave := True;
if FileExists(ScriptFileSaveDialog.FileName) then
if MessageDlg('文件已存在,覆盖吗?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
isSave:=False;
if not isSave then
begin
Result:=False;
Exit;
end;
AssignFile(F, ScriptFileSaveDialog.FileName);
Rewrite(F);
for i:=0 to SqlMemo.Lines.Count do
Writeln(F, Utf8encode(SqlMemo.Lines.Strings[i]));
CloseFile(F);
HasSaved := True;
SavedFileName := ScriptFileSaveDialog.FileName;
FileNameLabel.Caption:=SavedFileName;
Result:=True;
end;
这里涉及到了两个窗体的私有变量:HasSaved 和 SavedFileName,用于识别文件的保存状态,对文本编辑器的 OnChange 事件编写代码如下:
procedure TMainForm.SqlMemoChange(Sender: TObject);
begin
HasSaved:=False;
FileNameLabel.Caption:='*' + SavedFileName;
end;
文件操作的实现也就是对“新建”、“打开”、“保存”、“另存为”等按钮的单击事件进行代码编写,如下:
procedure TMainForm.NewButtonClick(Sender: TObject);
begin
// 新建按钮事件
if HasSaved then
begin
NewFile;
Exit;
end;
if MessageDlg('保存文件吗?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
if SavedFileName = '' then
begin
if SaveAsFile then NewFile;
end
else
begin
SaveFile;
NewFile;
end
else
NewFile;
end;
procedure TMainForm.OpenFileButtonClick(Sender: TObject);
begin
// 打开按钮事件
if HasSaved then
begin
OpenFile;
Exit;
end;
if MessageDlg('保存文件吗?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
if SavedFileName = '' then
begin
if SaveAsFile then OpenFile;
end
else
begin
SaveFile;
OpenFile;
end
else
OpenFile;
end;
procedure TMainForm.SaveFileButtonClick(Sender: TObject);
begin
// 保存按钮事件
if SavedFileName <> '' then
SaveFile
else
SaveAsFile;
end;
procedure TMainForm.SaveAsButtonClick(Sender: TObject);
begin
// 另存为按钮事件
SaveAsFile;
end;
对于 SQL 日志,我们在数据模块中添加了 TZSQLMonitor 组件,如果想要改变日志文件名,在主窗体下方的 Tab 日志页中的设置按钮,点击后弹出对话框来设置日志文件名。日志文件设置的窗体如下:
代码如下:
uses unitdm;
procedure TLogForm.CancelButtonClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TLogForm.FormActivate(Sender: TObject);
begin
// 组件初始化
LogFileEdit.Text:='';
end;
procedure TLogForm.LogFileButtonClick(Sender: TObject);
begin
// 设置文件
LogFileSaveDialog.FileName:='';
if not LogFileSaveDialog.Execute then Exit;
LogFileEdit.Text := LogFileSaveDialog.FileName;
end;
procedure TLogForm.OkButtonClick(Sender: TObject);
begin
if LogFileEdit.Text = '' then
begin
MessageDlg('提示', '请设置日志文件名!', mtInformation, [mbOK], 0);
Exit;
end;
EdbDM.ZDBSQLMonitor.FileName:=LogFileEdit.Text;
ModalResult := mrOk;
end;
留言与评论(共有 0 条评论) “” |