delphi程序如何从任务栏及时还原、显示窗体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi程序如何从任务栏及时还原、显示窗体?相关的知识,希望对你有一定的参考价值。

打开一个delphi写的MIS(EXE),然后转个报表,大约2分钟。此时,我点了windows的‘显示桌面’,然后在任务栏点击MIS的图标,窗体显示不出来(报表还没有制表完成)。
请问,在一个事件还没有完成的情况下,点击任务栏MIS图标,如何使窗体及时的显示?

多谢~~
点击任务栏的图标时,最先触发的是哪个事件?

这叫“假死”
你的MIS程序可能在忙着处理报表,所以不会响应windows的呼唤(消息)

* 你可能需要修改你的报表,在报表的循环中加入一行:
application.processmessages();

* 你也可以修改你的作业模型,让子任务在线程中执行。这样就不会阻塞(block)主线程。可以让主线程响应windows消息。追问

谢谢先。。。

你可能需要修改你的报表,在报表的循环中加入一行:
application.processmessages();
--------------------这个试过了,不行的。偶尔可以,大多时候不行。

除了线程,还有没有其他的方法呢?

追答

那就比较困难了。
其实主要还是要看你的报表是block在什么地方。 加在循环里之后,效果不好的原因,可能是
你的报表没有block在循环的地方。。。而可能是其它地方,如:读取数据库。
如果一个报表共要执行2分钟,其中执行一个复杂的SQL可能需要1分30秒,那么在这1分半钟里,是“假死”的。
也有可能你的报表不是读数据库,而是通过COM或其它方式读取其它的数据源。。。。那这些可能也不是Application.ProcessMessages可以解决的。

这样的情况下,又不想把这个报表(或引起block的部分)执行放在背景线程(background thread),那我可能暂时也想不出有什么好办法。

你可能需要分析一下,你的报表时间花在什么地方。

追问

是读取数据库比较耗时了,ADO,mssql。
大概循环10次,每次循环都会打开数据集,耗时10秒左右。这样总共差不多2分钟。

谢谢你,我再试试看。。。

追答

:-),10秒时间是比较长了。 可能你的SQL比较复杂。
可以想办法做SQL优化。

参考技术A 转报表使用的是当前线程,当前线程没处理完不会去处理窗体消息。新建一个线程去转报表,不要在当前线程中转。

Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法

 最近在Delphi开发中用到了无边框窗体显示时,无法在任务栏使用右键弹出菜单的情况,经过整理,通过以下方法可以使右键菜单出现:

procedure Tfrm_Base.InitSysMenu;
var
  WindowStyle: Integer;
begin
  WindowStyle := GetWindowLong(Handle, -16);
  WindowStyle := WindowStyle or WS_SYSMENU or WS_MINIMIZEBOX;
  WindowStyle:=WindowStyle xor WS_CAPTION;
  SetWindowLong(Handle, -16, WindowStyle);
end;

 

http://www.cnblogs.com/gxch/archive/2011/04/22/2024846.html

以上是关于delphi程序如何从任务栏及时还原、显示窗体?的主要内容,如果未能解决你的问题,请参考以下文章

WPF中窗体最大化问题处理

Delphi 让子窗体显示在任务栏上的几种方法

Delphi 新建窗口在任务栏不显示

Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法

在Delphi 2010 版本中怎样把程序隐藏,不在任务栏处显示?

delphi 托盘图标 主窗体就隐藏,跳出一个窗体就缩小的