【问题标题】:Display a form in two different ways以两种不同的方式显示表单
【发布时间】:2015-04-01 01:26:07
【问题描述】:

我以两种不同的方式显示表单。第一个作为页面控件标签表的子项,如下所示:

myform := Tmyform.Create(<tab sheet of page control>);
myform.Parent := <tab sheet of page control>;
myform.Align := alClient;
myform.BorderStyle := bsNone;

myform.Visible := true;

此标签始终可见。

我第二次将它显示为这样的普通形式:

myform := Tmyform.Create(nil);
myform.ShowModal;

我这样做是因为我需要显示相同的表单,其中一些可视控件可见并且第二次隐藏。

我的问题我现在注意到,每次使用第二种方法打开表单时,应用程序都会消耗更多内存,如果我在关闭事件中使用action := cafree,当我在标签页打开时尝试关闭应用程序时会遇到访问冲突打开所以我应该如何在不使用具有相同控件的两个表单的情况下解决这个问题?

我用的是 Delphi XE5

【问题讨论】:

  • 您应该能够在创建之前执行SavemyForm := myForm;,然后在模态表单被释放后执行myForm := SavemyForm;
  • 或者停止使用全局 myForm 指针开头。
  • 这里的信息很难诊断出问题所在。就目前而言,我认为我们能做的最好的事情就是猜测。

标签: delphi


【解决方案1】:

TForm 从未打算或设计为嵌入到其他控件中。请改用TFrame,它是专门为此目的而设计的。

var
  frame: TMyFrame;
begin
  frame := TMyFrame.Create(TheTabSheet);
  frame.Parent := TheTabSheet;
  frame.Align := alClient;
  frame.Visible := true;
end;

var
  form: TForm;
  frame: TMyFrame;
begin
  form := TForm.CreateNew(nil); // yes, a blank TForm
  try
    form.Width := ...;
    form.Height := ...;
    form.Caption := ...;
    frame := TMyFrame.Create(form);
    frame.Parent := form;
    frame.Align := alClient;
    frame.Visible := true;
    form.ShowModal;
  finally
    form.Free;
  end;
end;

【讨论】:

  • 我不确定这是否正确。可停靠表单呢?
  • @DavidHeffernan:这与通过设置Parent 属性来简单地嵌入TForm 完全不同。实现对接支持涉及一个完整的框架。
  • 从根本上说,尽管它围绕着做你所说的从未打算做的事情。我通常将表单嵌入为其他窗口控件的子项。它确实有效,而且它旨在发挥作用。你回答的第一句话是错误的。框架肯定是一个不错的选择,但我不同意您在文本中提出的主张,甚至不同意对问题的诊断。我通常会毫无问题地做问题中描述的事情。
  • @DavidHeffernan:对你有好处。欢迎分享您的经验。
  • 这是一种软弱的态度。我已经以建设性的方式分享了我的经验。随时更正您的答案。也许认识到我的投入并非一文不值。不需要这么轻蔑的评论。
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多