gpt4 book ai didi

Delphi:在 FormShow 中重新绘制表单

转载 作者:行者123 更新时间:2023-12-02 02:45:10 26 4
gpt4 key购买 nike

我在 FormMain 中打开 Form2.ShowModal。我希望应用程序在进行一些数据库访问时完整地显示 Form2(这与要显示的新数据无关)。然而,当执行FormShow时,只显示外边框和一些损坏的部分,而FormMain的一些损坏的部分会显示出来。太丑了。

我还没有找到一种方法让 Delphi 立即重新绘制表单,然后执行耗时的 MyOpenData 过程。结束 MyOpenData 后一切都很好。

procedure TForm2.FormShow(Sender: TObject);
begin
Invalidate;
Refresh;
MyOpenData; { needs some seconds of database accesses }
end;

替代方案:

procedure TForm2.FormShow(Sender: TObject);
begin
Invalidate;
Refresh;
SendMessage(Handle, wm_paint, 0, 0);
PostMessage(Handle, wm_OpenMyData, 0, 0); { executes well, but no solution)
end;

这也行不通。我认为 SendMessage() 等待消息完成。但在 MyOpenData 之前没有进行 Paint。在程序完成之前,表格看起来总是破损的。除此之外,例程执行得很好。我组合或单独尝试了所有这些命令。

我错过了什么?提前致谢!

如何启动打开表单时需要运行的耗时例程?

(Windows 7 64 位上的 Delphi XE7)

最佳答案

uses
WinApi.Windows;

const
WM_AFTER_SHOW = WM_USER + 1; // custom message
WM_AFTER_CREATE = WM_USER + 2; // custom message

private

procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;


procedure TForm1.WmAfterCreate(var Msg: TMessage);
begin
DoSomeThingAfterCreate();
ShowMessage('WM_AFTER_CREATE received!');
end;

procedure TForm1.WmAfterShow(var Msg: TMessage);
begin
DoSomeThingAfterShow();
ShowMessage('WM_AFTER_SHOW received!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// Some code...
PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
// Some Code...
PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;

关于Delphi:在 FormShow 中重新绘制表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com