前往顾页

delphi实现子窗口只翻开一个实当代码

时候:2013-07-01 23:52来源:知行网www.zhixing123.cn 编辑:麦田守望者

在做查验科试剂办理体系的时候,我俄然发明一个问题。因为我是用菜单来节制服从窗口翻开的,如果用户点击两次,就翻开了两个窗口,若那边理这个问题?当改换了用户,用户权限转变了的时候,若何封闭本来的窗口?

这还不简朴,声明一个窗口的全局变量不就OK了么,要封闭就直接form.close就卡可以了嘛!

但是如果窗口是静态建立的呢?如果我不想弄玉成局变量,耗损年夜量内存呢?

起首想到法度只履行一个实例的体例,用互斥体?这将产生一个问题,你所有的窗口在加载之前都需求建立一个互斥变量,每个窗口你都去重载一次机关函数,你想累死我么?

既然不想保存类的变量,那么不如测验测验一下windows窗口的特有属性,HWND,即窗口的句柄。

那么若那边理句柄存在的问题,即经由过程句柄可以判定这个窗口是不是翻开呢?吵吵找了半天,找到一个API函数IsWindow。

因而全部流程可以以下运作:

经由过程保存的句柄判定窗口是不是存在->存期近不翻开新窗口,不存在就翻开新窗口并保存句柄。

封闭所有的窗口只需求向所有的句柄PostMessage WM_QUIT就好了。

我建立了一个类,代码和简朴,以下:

unit FMForm; interface uses Winapi.Windows, Winapi.Messages,Data.Win.ADODB, System.Classes,System.Variants,System.SysUtils,Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus,Vcl.Grids,Comobj, StdCtrls; type FormInfo=record Caption:string[20]; Handle:HWND; end; type TFMForm= class(TObject) public function FormExist(ACaption:string):Boolean; function CaptionExist(ACaption:string):Boolean; procedure AddForm(ACaption:string;AHandle:HWND); procedure SetCaptionHandle(ACaption:string;AHandle:HWND); procedure AddCaptionHandle(ACaption:string;AHandle:HWND); procedure CloseAllForms(); private FForms:array of FormInfo; end; implementation function TFMForm.CaptionExist(ACaption:string):Boolean; var i:Integer; begin result:=False; for i := 0 to Length(FForms)-1 do begin if FForms[i].Caption=ACaption then begin Result:=True; Exit; end; end; end; function TFMForm.FormExist(ACaption:string):Boolean; var i:Integer; begin result:=False; for i := 0 to Length(FForms)-1 do begin if FForms[i].Caption=ACaption then begin if isWindow(FForms[i].Handle)=true then begin Result:=True; Exit; end else begin result:=False; Exit; end; end; end; result:=False; end; procedure TFMForm.AddForm(ACaption:string;AHandle:HWND); begin if CaptionExist(ACaption)=True then begin SetCaptionHandle(ACaption,AHandle); end else begin AddCaptionHandle(ACaption,AHandle); end; end; procedure TFMForm.SetCaptionHandle(ACaption:string;AHandle:HWND); var i:Integer; begin for i := 0 to Length(FForms)-1 do begin if FForms[i].caption=ACaption then begin FForms[i].Handle:=AHandle; Exit; end; end; end; procedure TFMForm.AddCaptionHandle(ACaption:string;AHandle:HWND); begin setlength(FForms,Length(FForms)+1); FForms[Length(FForms)-1].Caption:=ACaption; FForms[Length(FForms)-1].Handle:=AHandle; end; procedure TFMForm.CloseAllForms(); var i:Integer; begin for i := 0 to Length(FForms)-1 do begin PostMessage(FForms[i].Handle,WM_CLOSE,0,0); end; end; end.
利用体例也很简朴:

if FFMForm.FormExist('利用记录')=false then //判定窗口是不是存在 begin frmUseRecord:= TfrmUseRecord.Create(self); frmUseRecord.Show; FFMForm.AddForm('利用记录',frmUseRecord.Handle); end;

------分开线----------------------------
标签(Tag):delphi delphi教程 delphi实例教程 delphi源代码
------分开线----------------------------
保举内容
猜你感兴趣