ShowModa窗体l如何一定要显示在前面

zuilu5339 2018-06-27 04:44:33
application.CreateForm(TFrm_editBom,Frm_editBom);
Frm_editBom.ShowModal;
Frm_editBom.Free;
正常来说都是显示在最前面,有时候我感觉是有点卡就显示不在最前面,然后只能退出,重来
...全文
639 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2018-07-28
  • 打赏
  • 举报
回复
DELPHI 自带的SHOW或者是SHOWMODE都是不能够在Windows下面确保在最前,想确定窗口一定在Windows下保持最前的,就只能用“BlueStorm"的方法吧
不值一提 2018-07-10
  • 打赏
  • 举报
回复
试试formStyle属性设置
BlueStorm 2018-07-09
  • 打赏
  • 举报
回复
SetForegroundWindow只是请求windows系统把该form显示最前面而已,windows让不让它显示在最前面,那还得看情况。
xiaocongzhi 2018-07-09
  • 打赏
  • 举报
回复
用WINAPI: SetForegroundWindow
BlueStorm 2018-06-28
  • 打赏
  • 举报
回复

示例
unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
WM_AFTER_SHOW = WM_USER + 1;

type
TFrm_editBom = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure WmAfterShow (var Msg: TMessage); message WM_AFTER_SHOW;
public
{ Public declarations }
end;

var
Frm_editBom: TFrm_editBom;

function ForceForegroundWindow(hWnd: THandle): Boolean;

implementation

{$R *.dfm}

procedure TFrm_editBom.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TFrm_editBom.WmAfterShow(var Msg: TMessage);
begin
Application.ProcessMessages;
ForceForegroundWindow(Handle);
end;

function ForceForegroundWindow(hWnd: THandle): Boolean;
var
HelpForm: TForm;
begin
HelpForm := TForm.Create(nil);
try
HelpForm.BorderStyle := bsNone;
HelpForm.SetBounds(0, 0, 1, 1);
HelpForm.FormStyle := fsStayOnTop;
HelpForm.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hWnd);
finally
HelpForm.Free;
end;
Result := True;
end;

end.

BlueStorm 2018-06-28
  • 打赏
  • 举报
回复

或者:
function ForceForegroundWindow(hWnd: THandle): Boolean;
var
HelpForm: TForm;
begin
HelpForm := TForm.Create(nil);
try
HelpForm.BorderStyle := bsNone;
HelpForm.SetBounds(0, 0, 1, 1);
HelpForm.FormStyle := fsStayOnTop;
HelpForm.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hWnd);
finally
HelpForm.Free;
end;
Result := True;
end;
BlueStorm 2018-06-28
  • 打赏
  • 举报
回复
function ForceForegroundWindow(hWnd: THandle): Boolean;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
ForegroundThreadID: DWORD;
ThisThreadID: DWORD;
timeout: DWORD;
begin
if GetForegroundWindow = hWnd then
Result := True
else
begin
Result := False;
ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
ThisThreadID := GetWindowThreadPRocessId(hWnd, nil);
if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
begin
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
Result := (GetForegroundWindow = hWnd);
end;
if not Result then
begin
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
SPIF_SENDCHANGE);
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
end;
Result := (GetForegroundWindow = hWnd);
end;
end;
zuilu5339 2018-06-28
  • 打赏
  • 举报
回复
还有没有办法
BlueStorm 2018-06-28
  • 打赏
  • 举报
回复
我试过了,是可以的。

最好用第一个function ForceForegroundWindow(hWnd: THandle): Boolean; 第二个ForceForegroundWindow不太完善。
代码是加在被showModal出来的form里面,因此show和ShowModal都工作正常。

你觉得太复杂,那我就没办法了,我找不到其他可靠又更简单的方法。
zuilu5339 2018-06-28
  • 打赏
  • 举报
回复
引用 6 楼 BlueStorm 的回复:

示例
unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

const
WM_AFTER_SHOW = WM_USER + 1;

type
TFrm_editBom = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure WmAfterShow (var Msg: TMessage); message WM_AFTER_SHOW;
public
{ Public declarations }
end;

var
Frm_editBom: TFrm_editBom;

function ForceForegroundWindow(hWnd: THandle): Boolean;

implementation

{$R *.dfm}

procedure TFrm_editBom.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_AFTER_SHOW, 0, 0);
end;

procedure TFrm_editBom.WmAfterShow(var Msg: TMessage);
begin
Application.ProcessMessages;
ForceForegroundWindow(Handle);
end;

function ForceForegroundWindow(hWnd: THandle): Boolean;
var
HelpForm: TForm;
begin
HelpForm := TForm.Create(nil);
try
HelpForm.BorderStyle := bsNone;
HelpForm.SetBounds(0, 0, 1, 1);
HelpForm.FormStyle := fsStayOnTop;
HelpForm.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hWnd);
finally
HelpForm.Free;
end;
Result := True;
end;

end.




你的太复杂了
而且我是ShowModal, 不是show,光加fsStayOnTop;好像没用
  • 打赏
  • 举报
回复
不先AttachThreadInput在win10上调用SetForegroundWindow会失败
zuilu5339 2018-06-27
  • 打赏
  • 举报
回复
引用 1 楼 BlueStorm 的回复:

//这样不是更好吗:
with TFrm_editBom.Create(nil) do
begin
ShowModal;
Free;
end;


好是好,但好像没解决问题,只是代码省略了
BlueStorm 2018-06-27
  • 打赏
  • 举报
回复

//这样不是更好吗:
with TFrm_editBom.Create(nil) do
begin
ShowModal;
Free;
end;
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 【运算单元构造实验报告】运算单元是计算机硬件系统中的关键构成部分,主要承担执行算术运算和逻辑运算的任务。在本次实验中,我们着重探讨了带有累加器的运算单元的设计,涵盖了溢出识别、有符号数值与无符号数值运算的差异性,以及采用补码方式进行的加法与减法运算的实现机制。 一、实验目标 1. 掌握运算单元的基本构造,理解带有累加器的运算单元的具体实现途径。 2. 学习并领会溢出检测的机制,能够设计并构建溢出检测电路,用以判定运算结果是否超出了数据类型的表示范畴。 3. 明辨有符号数值和无符号数值运算的不同特性,把握它们在运算过程中各自的处理方法。 4. 熟练掌握基于补码方式的加法与减法运算的执行,理解补码形式下的溢出判定准则。 5. 熟悉运算单元内部的数据传输路线,明晰数据在运算过程中的流转路径。 6. 设计一个能够支持有符号数值与无符号数值运算、补码加法/减法运算以及有符号数值溢出检测的运算单元电路。 二、实验仪器 采用JZYL—Ⅱ型计算机组成原理实验装置,配备2片74181运算单元芯片作为算术逻辑单元(ALU),2片74LS373用作八位D型锁存器,并辅以一些基础门电路和多路选择器来完成电路设计。 三、实验内容 1. 运用片74181构建一个8位运算单元,负责处理数据的高4位与低4位。 2. 设计并实现溢出检测电路,确保在有符号数值与无符号数值的加法运算中均能准确识别溢出状况。 3. 通过74LS373增加累加器功能,使运算结果得以保存。 4. 将所有设计整合,利用多路选择器来支持有符号数值与无符号数值的加法/减法运算。 四、实验电路 1. 8位运算单元由2片74181构成,通过控制...

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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