Delphi里面有没有什么查找窗口的好方法??(急!等)

yyuj 2003-12-08 02:16:52
现在在Delphi里面,编写MDIForm时,碰到问题如下:
一个按钮,按一下窗口出现,然后关闭后,再按这个按钮又会出现,
如果一没有关闭窗口,再按那个按钮,不会重复开两个窗口??
不知道有什么好方法??

还有谁知道关闭窗口的参数??
action:=caFree
还有些什么属性呀??
求助!!
SOS
...全文
241 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
geoffrey9043 2003-12-09
  • 打赏
  • 举报
回复
findwindow应该不错啊,网上相关的代码也相当多的,随便找就有一大堆的
S.F. 2003-12-09
  • 打赏
  • 举报
回复
freeAndNil(YouForm);
pwzhu666 2003-12-09
  • 打赏
  • 举报
回复
FindWindow('TMainForm', ‘主窗口的Caption');
chenkandy 2003-12-09
  • 打赏
  • 举报
回复
up
eliphe 2003-12-09
  • 打赏
  • 举报
回复
Mf:=FindWindow('TMainForm', ‘主窗口的Caption');
yyuj 2003-12-08
  • 打赏
  • 举报
回复
回复人: MaxTung(随心所欲) ( ) 信誉:105 2003-12-08 14:48:00 得分:0


希望窗体关闭后自动释放资源就设 Action := caFree; 在窗体的Destory事件中将窗体变量设为Nil即可。


================================================================================

能不能给出代码??谢谢
jabmoon 2003-12-08
  • 打赏
  • 举报
回复
可以遍历一下,判断一下窗体是否已经创建了,如果没有创建,就创建它,如果创建了,就显示出来,要释放窗体,可以使用FreeAndNil函数
  • 打赏
  • 举报
回复
希望窗体关闭后自动释放资源就设 Action := caFree; 在窗体的Destory事件中将窗体变量设为Nil即可。
  • 打赏
  • 举报
回复
// 查找MDI子窗体
function ChildFormIsExist(aMDIForm: TForm; aChildFormCaption: String): Boolean;
var
I: Integer;
FormIsExist: Boolean;
begin
Result := False;

if not Assigned(aMDIForm) then Exit;

FormIsExist := False;
for I := 0 to aMDIForm.MDIChildCount - 1 do
begin
if Trim(aMDIForm.MDIChildren[I].Caption) = Trim(aChildFormCaption) then
FormIsExist := True;
end;

if FormIsExist then
Result := True;
end;

创建子窗体的时候首先调用方法ChildFormIsExist判断子窗体是否存在。
if not ChildFormIsExist(frmMain, '子窗体的Caption') then
begin
// 创建子窗体
end;
jxc163 2003-12-08
  • 打赏
  • 举报
回复
你按位CTRL键,再用鼠标单击caFree就知道有那些参数了。
hongqi162 2003-12-08
  • 打赏
  • 举报
回复
使用原子(atom)+互斥(Mutex)+FindWindow的方法可以是程序只运行一次,并且将应用程序调入前台。若您的应用程序注册为缺省打开为某种扩展名文件的程序,将打开您所双击的文件,并且前台运行。在我的一个MDI程序下通过了。

在dpr文件中:
var
hMutex : Thandle;
WaitResult : word;
Mf : DWORD;
S:String;
begin
hMutex := createMutex(nil,false,pchar(utCommon.SysName));
WaitResult := WaitForSingleObject(hMutex,10);
if ( waitResult = WAIT_TIMEOUT ) then
begin
S:=ParamStr(1);//实际上是您所双击的文件名(含路径)
Mf:=FindWindow('TMainForm', ‘主窗口的Caption');
if (Mf<>0) and (GlobalFindAtom(PChar(S))=0) then
begin
SendMessage(Mf, WM_User+1, GlobalAddAtom(PChar(S)), Length(S)+1);
WaitForSingleObject(hMutex,10);
end;
SetForegroundWindow (Mf);
end
else
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
ReleaseMutex(hMutex);
end;
CloseHandle(hMutex); // close the mutex handle
end.

主窗口:
procedure TMainForm.WndProc(var Message: TMessage);
begin
if Message.Msg=WM_User+1 then
begin
FillChar(OpenFileName, Sizeof(OpenFileName),0);
GlobalGetAtomName(Message.WParam, @OpenFileName, Message.LParam);
Show;
WindowState := wsMaximized;
Application.BringToFront;
OpenTest(OpenFileName); //打开一个子窗口显示文件
GlobalDeleteAtom(Message.WParam);
end
else
Inherited WndProc(Message);
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧