Delphi 一种在创建后可以是模态的表单

Delphi 一种在创建后可以是模态的表单,delphi,Delphi,我有一个PopForm,无论如何我都想留在MainForm上。 个案包括: PopForm.showmodel和PopForm.Show 虽然showmodel完全可以正常工作,但是需要使用Show方法与MainForm进行交互,以执行“拖放”操作 PopForm的主要职责是将一些文件中的数据导入MainForm上的数据集。有两种方法:拖放具体数据(在显示模式下选中的行)和从PopForm(在显示模式下)传输所有数据。PopForm中的所有数据都存储在类似于ClientDataSet的内容中。我

我有一个
PopForm
,无论如何我都想留在
MainForm
上。 个案包括:

PopForm.showmodel
PopForm.Show

虽然
showmodel
完全可以正常工作,但是需要使用
Show
方法与
MainForm
进行交互,以执行“拖放”操作

PopForm
的主要职责是将一些文件中的数据导入
MainForm
上的数据集。有两种方法:拖放具体数据(在显示模式下选中的行)和从
PopForm
(在显示模式下)传输所有数据。
PopForm
中的所有数据都存储在类似于
ClientDataSet
的内容中。我开发了类似于
ClientDataSet
的方法:First、Eof、FieldByName、Next等,并将它们实现到
PopForm

关闭
PopForm
后(设置ModalResult后),调用过程使用
而不是PopForm.eof do PopForm.Next…
将数据导入
MainForm的
数据集或任何用户编程方法

为了显示一些进度,我使用
Show
方法重新创建
PopForm
,并在调用过程中进行循环时在
PopForm
上方显示进度表。之后-
PopForm
关闭

这很好,但唯一的问题是关于
Show
方法-我需要
PopForm
始终处于
MainForm
之上。在大多数情况下是这样的,但也有一些应用程序不遵循这一规则。我曾尝试使用
popuparent&PopupMode
属性,但它们使
popForm
在任何赋值时都可以重新创建(正如我刚刚发现的那样,您需要在显示时赋值一个自定义表单,然后在关闭时将其置零,因为使用common
TForm.close
方法,它不会隐藏任何方法)

如果在FormClose方法上不需要Nil popupprent,那么这将不会有任何问题。另一个例行程序是分配

...FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  ...
end;
如果
Assigned(PopForm)
return
false
,它将工作,但返回
true


如果有任何情况可以发现表单是否被释放-这可能会有所帮助。您觉得怎么样?

如果您将表单样式设置为fsStayOnTop,则除非存在具有相同属性的其他表单,否则表单将始终保持在顶部。在这种情况下,它们中的活动一个将位于顶部

至于从用于导入数据的PopForm中移动数据,可以采用与创建自定义对话框类似的方法。 自定义对话框的设计通常如下所示: 您有一个dialog类,它包含拨号设置字段(更改对话框外观),甚至还有一个对话框输出字段(所选文件名等)。
在这个类中有一个对话框窗体类,本质上是一个模态窗体。此对话框窗体使用其OnClose事件在关闭前自动将必要的信息输入到对话框输出字段。

这已经被许多人讨论过很多次,答案是没有真正的100%方法保证它始终位于所有其他窗口之上。如果另一个应用程序也尝试相同的操作,该怎么办?谁说哪个应用程序应该优先?事实是,即使使用最好的方法保持领先,您仍然面临着与另一个应用程序发生冲突的机会。@Jerry-我认为在这个场景中没有stayontop表单。然而,我认为我不理解这个问题,也不理解这个问题。@Sertac事实上,这似乎是多个问题,这是一个突出的问题给我<代码>我需要PopForm一直在MainForm上。在大多数情况下是这样的,但也有一些应用程序不遵循这一规则@notricky-不如用一些复制问题的短代码,而不是我们试图从问题的描述中理解问题。检查它们是否都具有相同的mainformontaskbar设置。我对您的理解是否像您建议创建一个保存整个数据(对话框的数据集)的自定义类一样所有的fetchig步骤都会用到这个类,而Dialog类是这个自定义类中的一个属性?是的,我已经添加了fsStayOnTop,这似乎很有效。而且是这么早。首先我得到一个错误——我开始记得问题是什么——很难调试,因为顶部窗口是调试器的顶部;))