Delphi 翻两种形式
我只是想知道我是否在做一些可能不好的事情,尽管这对我来说似乎是一个非常实用的解决方案 我有两个表单,用户必须遍历它们。用户点击一个按钮,form1弹出。用户按下OK,第二个按钮弹出。用户再次单击OK,屏幕消失。或者用户单击重试,屏幕返回到第一个。这两个屏幕的大小完全不同,信息也不同 所以我想出了这个代码:Delphi 翻两种形式,delphi,delphi-2007,Delphi,Delphi 2007,我只是想知道我是否在做一些可能不好的事情,尽管这对我来说似乎是一个非常实用的解决方案 我有两个表单,用户必须遍历它们。用户点击一个按钮,form1弹出。用户按下OK,第二个按钮弹出。用户再次单击OK,屏幕消失。或者用户单击重试,屏幕返回到第一个。这两个屏幕的大小完全不同,信息也不同 所以我想出了这个代码: Form1 := TForm1.Create(SharedData); Form2 := TForm2.Create(SharedData); repeat ModalRe
Form1 := TForm1.Create(SharedData);
Form2 := TForm2.Create(SharedData);
repeat
ModalResult := Form1.ShowModal;
if (ModalResult = mrOK) then ModalResult := Form2.ShowModal;
until (ModalResult <> mrRetry);
Form1.Release;
Form2.Release;
Form1:=TForm1.Create(SharedData);
Form2:=TForm2.Create(SharedData);
重复
ModalResult:=Form1.ShowModal;
如果(ModalResult=mrOK),则ModalResult:=Form2.showmodel;
直到(ModalResult mrRetry);
表1.释放;
表2.发布;
我已经测试了这段代码,它看起来像一个符咒。在这段代码中,SharedData是一个对象,它包含由两种表单操作的数据。我在创建这两个表单之前创建了这个对象,当ModalResult==mrOK时,我只是将数据写回数据库
问题是,虽然我认为这是一个干净的解决方案来处理两个窗体之间的翻转,但我不记得以前见过这样的构造。当然,我是个天才。(至少,自我告诉我我是。)但是使用这段代码会有什么不好的地方吗?或者它只是好的吗?如果代码做了它应该做的,我认为它是好的。我以前也没见过类似的东西,但很明显它在做什么。。。在我的书中,这比盲目追随别人的工作要好得多。:-) 如果代码按照它应该做的做,我认为没问题。我以前也没见过类似的东西,但很明显它在做什么。。。在我的书中,这比盲目追随别人的工作要好得多。:-) 我看不出代码有什么问题。然而,我确实质疑将SharedData传递给这两种形式的构造函数。除非重写了构造函数(也使用reintroduce),否则TForm.Create()的参数接受所有者;该所有者负责释放其拥有的对象。因为你是自己释放它们的,所以没有必要指定一个所有者;只需将nil传递给Create()调用,以避免保存引用、释放对象以删除引用时访问所属对象列表等开销 此外,Release设计为从控件本身的事件处理程序中调用,例如在按钮单击事件中。它确保在实际释放控件之前处理所有挂起的消息,以避免AVs。再次使用它会增加不必要的开销,因为您没有在事件处理程序中使用它们。你可以安全地使用Form1.Free;相反 为了澄清Release的用法,它用于表单本身的代码中。例如,如果表单上有一个按钮,并且希望单击该按钮以释放表单,则可以使用Release:
procedure TForm1.Button1Click(Sender: TObject);
begin
Self.Release;
Close;
end;
这允许单击按钮释放表单,但确保先运行后续的关闭调用。如果您使用Free而不是上面的Release,您可能会在一个不存在的Form1上调用Close。(由于上面代码的愚蠢性,它很可能仍然可以使用;表单仍然会驻留在内存中。不过这仍然是个坏主意。)我看不出代码有任何问题。然而,我确实质疑将SharedData传递给这两种形式的构造函数。除非重写了构造函数(也使用reintroduce),否则TForm.Create()的参数接受所有者;该所有者负责释放其拥有的对象。因为你是自己释放它们的,所以没有必要指定一个所有者;只需将nil传递给Create()调用,以避免保存引用、释放对象以删除引用时访问所属对象列表等开销 此外,Release设计为从控件本身的事件处理程序中调用,例如在按钮单击事件中。它确保在实际释放控件之前处理所有挂起的消息,以避免AVs。再次使用它会增加不必要的开销,因为您没有在事件处理程序中使用它们。你可以安全地使用Form1.Free;相反 为了澄清Release的用法,它用于表单本身的代码中。例如,如果表单上有一个按钮,并且希望单击该按钮以释放表单,则可以使用Release:
procedure TForm1.Button1Click(Sender: TObject);
begin
Self.Release;
Close;
end;
这允许单击按钮释放表单,但确保先运行后续的关闭调用。如果您使用Free而不是上面的Release,您可能会在一个不存在的Form1上调用Close。(由于上面代码的愚蠢性,它可能仍然可以;表单仍然会驻留在内存中。不过这仍然是个坏主意。)基本上,这是最让我困扰的。代码看起来很简单,而大多数代码似乎使用了更复杂的技术。:-)基本上,这是最让我困扰的。代码看起来很简单,而大多数代码似乎使用了更复杂的技术。:-)SharedData属于TComponent类型。在表单中,它可以被再次输入到适当的TSharedData类中。我倾向于使用Release作为一种良好的编码实践。其他人有时会维护我的代码,我不希望他们在事件中复制Close()命令时出错。使用Release还会延迟free操作,直到messageloop在所有以前的消息之后再次激活。因此,如果这些表单在返回ModalResult(如计时器)后确实发送了一些消息,这些消息仍将首先处理。SharedData的类型为TComponent。在表单中,它可以被再次输入到适当的TSharedData类中。我倾向于使用Release作为一种良好的编码实践。其他人有时会维护我的代码,我不希望他们在复制代码中的Close()命令时出错