如何判断DLL中MDI窗口是否创建(200分)

  • 主题发起人 主题发起人 zhwwlp
  • 开始时间 开始时间
Z

zhwwlp

Unregistered / Unconfirmed
GUEST, unregistred user!
1.主窗体代码
TDLLCreateChild =function(app:TApplication;mainForm:TForm):Tform;stdcall ;
var
Form1: TForm1;
Moudle: THandle;
DLLCreateChild:TDLLCreateChild;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
f:TForm;
begin
Moudle := Loadlibrary('testdll.dll');
if Moudle <= 0 then
Application.Terminate;
DLLCreateChild := GetProcAddress(Moudle,'DLLCreateChild');
f:=DLLCreateChild(Application,Application.MainForm);
if f=nil then
exit;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Freelibrary(Moudle);
end;

2.DLL窗体源码
library testdll;

uses
SysUtils, Classes, forms, Messages, Dialogs,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function DLLCreateChild(app:TApplication;mainForm:TForm):Tform;stdcall
var
Form1: TForm1;
I:integer;
ptr:PLongInt;
begin
ptr:=@(Application.MainForm);
ptr^:=LongInt(mainForm);
for i:=app.MainForm.MDIChildCount-1 downto 0 do
begin
ShowMessage(app.MainForm.MDIChildren.Name);
if app.MainForm.MDIChildren= Form1 then
begin
Result:=nil;
break;
end;
Result:=nil;
end;
Form1:=TForm1.Create(MainForm);
result:=Form1;
end;
exports
DLLCreateChild ;
begin
end.

问题:小弟用if app.MainForm.MDIChildren= Form1 then 为什么从来就没有为真结果,那位大哥帮忙解决下这问题,我的目的主要是控制DLL中的MDI子窗口只能创建一个
 
可以自定义一个窗体是否存在的函数。
{ 用户自定义MDIChild子窗体存在判断函数 }
function Tfrmmain.CreateForm(CForm:TForm):boolean;
var
i :Integer;
FormExist :Boolean; //窗体存在标志
begin
FormExist :=False;
{10 判断CFrom是否为空}
if CForm = Nil then
begin
{10.1 函数返回值赋False}
CreateForm :=False;
{10.2 退出本函数}
Exit;
end;
{20 判断窗体是否已经建立起来}
for i :=0 to Screen.FormCount-1 do
begin
{20.1 判断窗体存在}
if Screen.Forms.ClassType = CForm.ClassType then
FormExist :=True;
end;
if FormExist = False then
begin
CreateForm :=False;
Exit;
end;
{30 判断窗体存在的状态}
if CForm.WindowState = wsMinimized then
{30.1 显示窗体}
ShowWindow(CForm.Handle,SW_SHOWNORMAL)
else
{30.2 显示窗体}
ShowWindow(CForm.Handle,SW_SHOWNA);
if not CForm.Visible then
CForm.Visible :=True;
{40 当前窗口显示在最前面}
CForm.BringToFront;
CForm.SetFocus;
CreateForm :=True;
end;

然后调用函数CreateForm,
CreateForm(frmmid) = True 则frmmid已经创建,
CreateForm(frmmid) = false 则frmmid未创建,
但我的这个函数不知道能否判断DLL中是否创建,你可以试一试,我的是在窗体中可以实现判断。希望对你有帮助。
 
procedure Plugin_MenuClick(); stdcall;
Procedure OpenMDIChild(TfrmMDIChild: TComponentClass; var frmMDIChild: TForm);
var
i : Integer;
begin
for i:=Application.MainForm.MDIChildCount-1 downto 0 do
if Application.MainForm.MDIChildren=frmMDIChild then begin
frmMDIChild.Show;
Exit;
end;
Application.CreateForm(TfrmMDIChild, frmMDIChild);
frmMDIChild.Show;
end;
begin
OpenMDIChild(TComponentClass(TForm1), TForm(Form1));
end;
 
这种会有很多问题
 
1. 在你的DLL子窗口中加一个消息响应函数. 返回一数字
2. 在主窗口中对每一个子窗口SendMessage, 如果返回的数字是你在子窗口里设置的, 那么说明该项子窗口存在.
 
if FormName=nil then
FormName:=TFormName.Create(application)
else
FormName.BringToFront;
 
后退
顶部