我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".
但是,在(a)网络错误或(b)配置错误(无效的SQL服务器主机名/实例)的情况下,超时需要60秒.这不仅使应用程序无响应,而且在它冻结时几乎不可能显示任何错误或消息.我可以在开始连接之前弹出一条消息,但是当主线程阻塞60秒时,确实没有解决方案.
解决方案似乎是将连接移动到后台线程.这导致以下代码:
一个TThread类,它使后台连接,一些SyncObj就像一个TEvent,用于将信号发送回主线程.
使用此代码的主线程中的循环:
BackgroundThread.StartConnecting;
while not BackgroundThread.IsEventSignalled do begin
Application.ProcessMessages; // keep message pump alive.
end;
// continue startup (reports error if db connection failed)
Run Code Online (Sandbox Code Playgroud)这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:
答:我会调用Application.ProcessMessages,我认为这是极端的代码味道.(这可能是这个规则允许的例外)
B.我在应用程序启动时引入了线程,我担心引入错误.
如果任何人都有一个已知没有竞争条件的参考实现,那可以与ADO建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.
我有一个应用程序,它最初总是以最大化的方式启动。这包括推杆Self.WindowState := wsMaximized;
在OnCreate
主窗体的。
在此之前,如果用户要将窗口状态更改为wsNormal
.
所以,简而言之,主窗体的OnCreate
处理程序看起来像:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Width:= 1300;
Height:= 800;
WindowState:= wsMaximized;
end;
Run Code Online (Sandbox Code Playgroud)
从理论上讲,我可以在设计时分配这些维度,而这正是我所需要的。但是,由于我的屏幕和 IDE 的大小,如果不滚动,整个表单一目了然。在设计中,我保持表格尺寸小,所以我可以看到一切。但是在运行时,我需要分配这些默认尺寸,然后默认最大化。当用户将窗口状态更改为最大化时,我希望它会转到我动态分配的那些维度。
问题是它在最大化表单后似乎丢失了这些尺寸,并且它恢复到设计时的任何值。如果我注释掉该行,WindowState:= wsMaximized;
那么它会以所需的默认尺寸显示表单。但是,最大化它似乎会覆盖并忽略我刚刚在它之前分配的这些值。
如何创建和显示默认最大化的主窗体,同时动态分配默认大小,而不会丢失分配的值?