good (and bad) old Delphi教我们经典"建立应用程序的方式,因为我们编写代码的方式"背后" IDE。
基于这个范例,我前段时间建立了一个库,它允许我使用一行代码将GUI保存/加载到INI文件。
LoadForm(FormName)
BAM!那就是它!没有更多INI文件!
图书馆只保存"相关"属性。例如,对于TCheckBox
,它仅保存其Checked
属性,而不保存其Color
或Top/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;
不优雅。
问题:
如何解决此特定问题或在将磁盘保存/恢复到磁盘时,您的方法是什么?
答案 0 :(得分:2)
这是从一开始就把我放在某些组件中的事情之一。我所知道的是3个选项,除了将GUI和业务逻辑分开,如@David所说,这并不总是一个选项。
OnMouseDown
或OnMouseUp
创建一个在初始化期间设置的全局变量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;