我有一个主窗体(MainForm)和一个MDI子窗口(TFormChild)。 我想创建多个TFormChild表单,但第一个必须以某种方式运行,所以我需要检测TFormChild窗口是否已经存在。
我使用此代码但它不起作用:
function FindChildWindowByClass(CONST aParent: HWnd; CONST aClass: string): THandle;
begin
Result:= FindWindowEx(aParent, 0, PChar(aClass), NIL);
end;
我称之为:
Found:= FindChildWindowByClass(MainForm.Handle, 'TFormChild')> 0;
答案 0 :(得分:13)
在表单中,您可以参考MDIChildCount和MDIChildren属性。
例如:
var
i: integer;
begin
for i:= 0 to MainForm.MDIChildCount-1 do
begin
if MainForm.MDIChildren[i] is TFormChild then
...
end;
...
end;
答案 1 :(得分:7)
称之为
Found:= FindChildWindowByClass(MainForm.ClientHandle, 'TFormChild')> 0;
MDI子窗口是TCustomFrom的'MDICLIENT',ClientHandle
属性的子窗口。
答案 2 :(得分:3)
实现此目的的最佳方法是让您要打开的表单实际检查以确定它是否已存在。为此,您的表单必须声明一个类过程。声明为类过程,无论表单是否存在,都可以调用proc。
添加到表单的公开部分
class procedure OpenCheck;
然后程序看起来像这样
Class procedure TForm1.OpenCheck;
var
f: TForm1;
N: Integer;
begin
F := Nil;
With Application.MainForm do
begin
For N := 0 to MDIChildCount - 1 do
begin
If MDIChildren[N] is TForm1 then
F := MDIChildren[N] as TForm1;
end;
end;
if F = Nil then //we know the form doesn't exist
//open the form as the 1st instance/add a new constructor to open as 1st
else
//open form as subsequent instance/add new constructor to open as subsqt instance
end;
将Form1的单位添加到mdiframe的uses子句中。
要打开表单,请调用类过程,然后调用表单的构造函数。
TForm1.OpenCheck;
使用类过程的一个警告词,不要访问表单的任何组件/属性。由于表单实际上不必实例化,因此访问它们会产生访问冲突/直到您知道F不是nil。然后,您可以使用F.访问表单组件/属性。