如何自动将GUI保存到文件? (范式)

时间:2018-01-10 09:52:30

标签: user-interface delphi delphi-xe7 paradigms visual-paradigm

good (and bad) old Delphi教我们经典"建立应用程序的方式,因为我们编写代码的方式"背后" IDE。

基于这个范例,我前段时间建立了一个库,它允许我使用一行代码将GUI保存/加载到INI文件。

LoadForm(FormName)

BAM!那就是它!没有更多INI文件!

图书馆只保存"相关"属性。例如,对于TCheckBox,它仅保存其Checked属性,而不保存其ColorTop/Left。但这已经足够了。

保存表单没有问题。但是,我有"问题"在app初始化期间。它们不是很大的问题,但是初始化代码不是那么好/优雅。

例如,当我指定Checkbox1.Checked := True时,它将触发OnClick事件(假设在设计时取消选中该复选框)。但是,(自然地)分配False值不会触发OnClick事件。

因此,我必须在CheckBox1Click(Sender)之后手动调用SaveForm(FormName)以确保CheckBox1Click中的任何代码都已初始化。但这引发了另一个问题。在应用程序启动期间CheckBox1Click(Sender)可能会被调用两次(一次是SaveForm,一次是我的,手动)。

当然,从理论上讲,程序的逻辑应该放在单独的对象中并与GUI分开。但即使我们这样做,初始化问题仍然存在。您从磁盘加载对象的属性,并将它们分配给GUI。当您将对象中的任何值设置为Checkbox1时,它将(或不)调用CheckBox1Click(Sender),这会将值设置回对象。

在应用启动时:

procedure TForm.FormCreate (Sender: TObject);
begin
  LogicObject.Load(File); // load app logic
  Checkbox1.Checked := LogicObject.Checked; // assign object to GUI
end;

procedure TForm.CheckBox1Click(Sender: TObject);
begin
  LogicObject.Checked := Checkbox1.Checked; 
end;

该解决方案可能涉及在表单上编写这样的内容进行控制:

OldEvent := CheckBox1.OnClick;
CheckBox1.OnClick := Nil;
CheckBox1.Checked := something;
CheckBox1.OnClick := OldEvent;

不优雅。

问题:
如何解决此特定问题在将磁盘保存/恢复到磁盘时,您的方法是什么?

1 个答案:

答案 0 :(得分:2)

这是从一开始就把我放在某些组件中的事情之一。我所知道的是3个选项,除了将GUI和业务逻辑分开,如@David所说,这并不总是一个选项。

  1. 如上所述,始终取消分配事件,使其不会被触发
  2. 使用非触发事件,例如OnMouseDownOnMouseUp
  3. 或者我使用的类似解决方案,我认为是最优雅的
  4. 创建一个在初始化期间设置的全局变量FormPreparing,并在事件开头检查其值,如下所示。

    procedure TForm.FormCreate (Sender: TObject);
    begin
      FormPreparing := True;
      try    
        LogicObject.Load(File); // load app logic
        Checkbox1.Checked := LogicObject.Checked; // assign object to GUI
      finally
        FormPreparing := False;
      end;
    end;
    
    procedure TForm.CheckBox1Click(Sender: TObject);
    begin
      if FormPreparing then
        Exit;
      LogicObject.Checked := Checkbox1.Checked;
    end;