一种自动关闭对话框的简单方法

{******************************************************
{                                                                                                 
{       一种自动关闭对话框的简单方法                                                       
{                                                                                                  
{   使用方法:打开对话框前调用 SetDlgAutoClose                                      
{             参数1: 设定多长时间后关闭                                                   
{             参数2: 是否在对话框标题栏进行倒计时提示                                 
{             取消自动关闭调用 ResetDlgAutoClose                                       
{                                                                                                   
{       任何转载请保留此文件的完整,如果进行修改请                                     
{   通知作者,谢谢合作。                                                                      
{                                                                                                   
{   作者: lichaohui  2004-03-03                                                            
{   Email: mastercn@163.com                                                                                           
{                                                                                                           
{*******************************************************
 
unit TimerDlg;
 
interface
 
uses
   Windows, Messages, SysUtils, Classes, Forms, ExtCtrls;
 
 
// 如果指定的时间没有操作对话框,则自动关闭
procedure ResetDlgAutoClose;
procedure SetDlgAutoClose(nTime: Integer; ADoHint: Boolean = False);
   
implementation
 
 
{** 如果对话框被打开,则在指定时间后关闭,并在标题栏进行提示 }
var
   nWndCount:  Integer  0 ;
   SavWnds, SavWnds2:  array  of  THandle;
   hDlgWnd: THandle =  0 ;
   hTimerk:  Integer  0 ;
   nTimerTick:  Integer  0 ;
   nLastTrk:  Integer  0 ;
   nDoHint:  Integer  0 ;
   nCapCt:  Integer  0 ;
   nSavCapt:  String  '' ;
   fTimer1: TTimer =  nil ;
 
function  MyEnumProc(hWnd: THandle; lParam:  Integer ):  Boolean ; stdcall;
var
   n:  Integer ;
begin
   Result :=  True ;
   if  lParam =  0  then
   begin
     if  not  IsWindowEnabled(hWnd)  then  Exit;
     if  not  IsWindowVisible(hWnd)  then  Exit;
   end ;
   n := (nWndCount +  10 div  10  10 ;
   SetLength(SavWnds, n);
   SavWnds[nWndCount] := hWnd;
   Inc(nWndCount);
end ;
 
procedure  MyTimerProc(hWnd: THandle; uMsg:  Integer ;
   idEvent:  Integer ; dwTime:  Integer );
var
   i, t:  Integer ;
   function  FindInArray(ar:  array  of  THandle; hd: THandle):  Boolean ;
   var
     t:  Integer ;
   begin
     Result :=  False ;
     for  t := Low(ar)  to  High(ar)  do
     begin
       Result := ar[t] = hd;
       if  Result  then  Break;
     end ;
   end ;
begin
   if  (hDlgWnd =  0 and  (SavWnds =  nil and  (SavWnds2 <>  nil then
   begin
     nWndCount :=  0 ;
     EnumThreadWindows(GetCurrentThreadId, @MyEnumProc,  0 );
     SetLength(SavWnds, nWndCount);
     for  i := Low(SavWnds)  to  High(SavWnds)  do
     begin
       if  not  FindInArray(SavWnds2, SavWnds[i])  then
       begin
         if  SavWnds[i] = GetActiveWindow  then
         begin
           hDlgWnd := SavWnds[i];
         end ;
       end ;
     end ;
     if  hDlgWnd =  0  then  ResetDlgAutoClose;
     nLastTrk := GetTickCount;
     SetLength(nSavCapt,  500 );
     t := GetWindowText(hDlgWnd,  PChar (nSavCapt),  500 );
     SetLength(nSavCapt, t);
     nCapCt :=  0 ;
   end
   else
   if  (hDlgWnd <>  0 then
   begin
     if  not  IsWindow(hDlgWnd)  or
       not  IsWindowVisible(hDlgWnd)  or
       not  IsWindowEnabled(hDlgWnd)  then
     begin
       ResetDlgAutoClose;
       Exit;
     end ;
     t := GetTickCount;
     t := (nTimerTick - (t - nLastTrk) -  1 );
     if  t <=  0  then
     begin
       // try to use SendMessge instead using PostMessage
       PostMessage(hDlgWnd, WM_SYSCOMMAND,SC_CLOSE,  0 );
//      SendMessage(hDlgWnd, WM_SYSCOMMAND,SC_CLOSE, 0);
     (* 2 lines added by jiatao
       SetForegroundWindow(hDlgWnd);
       PostMessage(hDlgWnd, WM_KEYDOWN,VK_RETURN,0);
     *)
       SetForegroundWindow(hDlgWnd);
       PostMessage(hDlgWnd, WM_KEYDOWN,VK_RETURN, 0 );
 
       ResetDlgAutoClose;
     end
     else
     if  (nDoHint >  0 then
     begin
       t := (t +  1000 div  1000 ;
       if  nCapCt <> t  then
       begin
         SetWindowText(hDlgWnd,
           PChar (Format( '(%d)%2s%s' , [t,  ' ' , nSavCapt])));
         nCapCt := t;
       end ;
     end ;
   end ;
end ;
 
procedure  TimerFunc(Sender: TObject);
begin
   MyTimerProc( 0 0 0 0 );
end ;
 
procedure  SetDlgAutoClose(nTime:  Integer ; ADoHint:  Boolean  False );
var
   FakeEvt: TNotifyEvent;
   Ptrs:  array [ 1..2 of  Pointer  absolute FakeEvt;
begin
   ResetDlgAutoClose;
   nWndCount :=  0 ;
   EnumThreadWindows(GetCurrentThreadId, @MyEnumProc,  1 );
   SetLength(SavWnds, nWndCount);
   SavWnds2 := SavWnds;
   SavWnds :=  nil ;
   if  not  Assigned(fTimer1)  then
   begin
     fTimer1 := TTimer . Create(Application);
     Ptrs[ 2 ] :=  nil ;
     Ptrs[ 1 ] := @TimerFunc;
     fTimer1 . OnTimer := FakeEvt;
     fTimer1 . Interval :=  100 ;
     fTimer1 . Enabled :=  True ;
   end ;
   nLastTrk := GetTickCount;
   nDoHint := Ord(ADoHint);
   nTimerTick := nTime;
end ;
 
procedure  ResetDlgAutoClose;
begin
   if  hDlgWnd <>  0  then
   begin
     SetWindowText(hDlgWnd,  PChar (nSavCapt));
   end ;
   if  Assigned(fTimer1)  then
     FreeAndNil(fTimer1);
   nWndCount :=  0 ;
   hDlgWnd :=  0 ;
   SavWnds :=  nil ;
   SavWnds2 :=  nil ;
   nTimerTick :=  0 ;
end ;
 
end .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在LabVIEW中,要实现对话框延时自动关闭,可以通过以下步骤进行操作: 1. 首先,进入LabVIEW,并创建一个新的VI。 2. 在Block Diagram面板上,拖放一个"Dialog"(对话框)的VI组件。 3. 连接该对话框组件的输出线到"Wait(ms)"(等待毫秒)的输入端。 4. 在"Wait(ms)"的输入端,设置一个适当的等待时间,即希望对话框显示的时间。 5. 连接"Wait(ms)"的输出线到"Dialog"组件的输入端。 6. 在"Dialog"组件的属性中,设置对话框的样式、标题、提示信息等等。 7. 连接"Dialog"组件的输出线到Block Diagram面板上的其他控件或处理结构,以定义对话框弹出后的操作或逻辑。 8. 编译并运行该VI。 通过以上步骤,LabVIEW中的对话框将会在指定的等待时间后自动关闭。这种方法可以在需要延时自动关闭对话框LabVIEW程序中使用,以改善用户界面和用户体验。 ### 回答2: 在LabVIEW中,可以使用以下步骤实现对话框的延时自动关闭: 1. 首先,创建一个VI(虚拟仪器)来实现这个功能。在VI中,将需要弹出对话框的代码放置在“While循环”中。 2. 在开始之前,我们需要定义一个记数器变量来计算延时时间。可以使用“计时器”或“循环计数”组件来实现该功能。 3. 在对话框弹出的前面,添加一个判断语句来检查记数器的值是否达到了预定的延时时间。 4. 如果记数器没有达到预设时间,就将记数器加一,然后继续循环。 5. 如果记数器达到了预定时间,就自动关闭对话框。可以使用“关闭VI”函数或“取消显示对话框”函数来关闭对话框。 6. 在循环结束之后,需要释放内存和关闭VI。 通过以上步骤,可以实现LabVIEW对话框延时自动关闭的功能。这样,在弹出对话框后,它将会自动关闭,而不需要用户手动关闭。这对于需要在一定时间后自动关闭对话框的应用场景非常有用。 ### 回答3: 在LabVIEW中,可以利用Timed Loop结构和Dialog Timeout Express VI实现对话框的延时自动关闭。 首先,将对话框控件放置在主VI的界面上。然后,在Timed Loop结构内部创建一个子VI,用于执行一个定时的延时操作。在子VI内部,使用Dialog Timeout Express VI来实现对话框自动关闭。这个VI的输入参数包括对话框及其ID、延时时间等。在子VI中,将延时时间作为输入传递给Dialog Timeout Express VI,并将对话框及其ID连接到该VI的相应输入终端。这样,当子VI被启动后,对话框会在指定的延时时间后自动关闭。 在主VI中,将子VI的输出结果与对话框控件的输入终端连接起来,以实现对话框的显示。通过控制子VI的启动和停止,可以控制对话框的出现和关闭。 需要注意的是,Timed Loop结构的定时器设置应与子VI的延时时间相同,以保证对话框在正确的时间后关闭。 以上是一种基于LabVIEW的实现方式,通过Timed Loop结构和Dialog Timeout Express VI可以实现对话框的延时自动关闭

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值