「11.Lazarus数据库编程」13.嵌入式数据库管理工具开发案例(3)

13.嵌入式数据库管理工具开发案例(3)

在前面两节中,对于嵌入式数据库管理工具的开发已经实现了基本的功能,但不是一个完整的产品,在此基础上应该具有 sql 文件的操作能力,实际上就是类似于记事本功能,所以本节我们在前面两节的基础上实现文件操作能力。

13.1 对文件操作的封装

对于 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; 

13.2文件操作的实现

文件操作的实现也就是对“新建”、“打开”、“保存”、“另存为”等按钮的单击事件进行代码编写,如下:

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;  

13.3 关于日志文件的处理

对于 SQL 日志,我们在数据模块中添加了 TZSQLMonitor 组件,如果想要改变日志文件名,在主窗体下方的 Tab 日志页中的设置按钮,点击后弹出对话框来设置日志文件名。日志文件设置的窗体如下:

「11.Lazarus数据库编程」13.嵌入式数据库管理工具开发案例(3)

代码如下:

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 条评论) “”
   
验证码:

相关文章

推荐文章