【发布时间】:2016-07-04 18:53:39
【问题描述】:
我有一个Delphi单元,它需要保存应用程序的各种形式的指针,以便以后对它们进行操作。
为了执行这些操作,我需要将指针转换为表单类型,例如。
var
ptrFrmMain: Pointer;
CurrentFrmMain: TfrmMain;
begin
CurrentFrmMain := ptrFrmMain;
CurrentFrmMain.Close();
end;
问题是这个单元包含在应用程序的所有其他 Delphi 单元的使用中。因此,虽然我可以在接口部分声明一个简单的Pointer 类型,但我不能声明在其他单元中声明的类型(例如单元frmMain.pas 的TfrmMain)。
我可以通过在实现部分放置一个使用来解决这个问题,例如:
interface
type TMyThread = class(TThread)
Public
ptrFrmMain:Pointer
...
implementation
uses frmMain
var
CurrentFrmMain: TfrmMain;
但仍然存在一个问题:我需要该变量特定于我的类实例,用于多线程目的,而不是通用全局变量。
但是我不能把它放在我的TmyThread 类中,因为TfrmMain 没有在那里声明,我不能把它放在接口部分的用途中。
一个解决方案是将CurrentFrmMain作为一个局部变量放在所有使用它的程序中,然后每次都进行CurrentFrmMain := ptrFrmMain转换,但是您知道更好的解决方案吗?
非常感谢您。
【问题讨论】:
-
您可以就地类型转换您的指针,也可以声明为通用基础 TForm...
-
@FreeConsulting 我不能声明为通用基本 Tform,因为我需要调用特定于我的表单的函数,例如。 'CurrentFrmMain.MyFunction()'
-
将变量声明为 TForm,然后在实现部分使用
as将其转换为特定的表单类型。这不会“重新初始化”任何东西,它只是使用正确类型的引用来引用现有表单。 -
不,不会。
As检查表单是否真的是您指定的表单类型,如果不是则抛出异常。这是一个类型安全的演员表。您可以使用is检查之前的类型。另请注意,as和is仅适用于对象,不适用于无类型指针。 -
一般模式是:
if MyForm is TFormABCD then MyFormABCD := MyForm as TFormABCD; // now you can use MyFormABCD。