Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 翻两种形式_Delphi_Delphi 2007 - Fatal编程技术网

Delphi 翻两种形式

Delphi 翻两种形式,delphi,delphi-2007,Delphi,Delphi 2007,我只是想知道我是否在做一些可能不好的事情,尽管这对我来说似乎是一个非常实用的解决方案 我有两个表单,用户必须遍历它们。用户点击一个按钮,form1弹出。用户按下OK,第二个按钮弹出。用户再次单击OK,屏幕消失。或者用户单击重试,屏幕返回到第一个。这两个屏幕的大小完全不同,信息也不同 所以我想出了这个代码: Form1 := TForm1.Create(SharedData); Form2 := TForm2.Create(SharedData); repeat ModalRe

我只是想知道我是否在做一些可能不好的事情,尽管这对我来说似乎是一个非常实用的解决方案

我有两个表单,用户必须遍历它们。用户点击一个按钮,form1弹出。用户按下OK,第二个按钮弹出。用户再次单击OK,屏幕消失。或者用户单击重试,屏幕返回到第一个。这两个屏幕的大小完全不同,信息也不同

所以我想出了这个代码:

  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()命令时出错