TUniGUIMainModule.EnableSynchronousOperations 属性

发布时间 2024-01-05 21:39:49作者: 月如无恨月常圆

TUniGUIMainModule.EnableSynchronousOperations 属性

与所有其他Web应用服务器类似,uniGUI框架采用异步操作模式。在此模式下,请求由服务器处理,响应处理完毕后立即发送回客户端。例如,当用户按下客户端屏幕上的按钮时,就会生成 Ajax 请求,服务器将处理关联的OnButtonClick()事件。一旦事件被处理,结果将被发送回客户端,客户端将其呈现在客户端屏幕上。

在这种情况下,不可能像我们在本机桌面应用程序中那样实现阻塞模式视图。在 VCL 中,我们可以阻止代码执行,直到用户通过按下按钮发送反馈。

// 在 VCL 应用程序中,代码执行将被阻止,直到用户按下按钮。    
if Form1.ShowModal = mrYes then  
begin   
   // 在这里执行一些代码  
end ;

该代码无法在经典的异步客户端/服务器操作模式下执行。话虽如此,uniGUI 为这个问题提供了一个解决方案,可以通过将 EnableSynchronousOperations 属性设置为 True 来启用该解决方案,但在我们讨论该主题之前,让我们看看如何在经典异步模式下解决这个问题。在异步模式下,服务器上的代码执行无法被阻塞,因为服务器需要在处理完请求后立即向客户端发送回复。为了解决这个问题uniGUI引入了Callback机制:

UniForm1.ShowModal( 
   procedure(Sender: TComponent; AResult: Integer) 
   begin 
     if AResult = mrYes then 
     begin 
       // 在此执行一些代码
     end; 
   end 
);

上面的示例消除了阻塞调用的需要,并在用户按下按钮时执行回调匿名方法。

uniGUI还支持同步操作。这种新模式是一个独特的功能,它使 uniGUI 进一步兼容标准 VCL 语法和预期行为。这将使将现有的旧 VCL 代码移植到 uniGUI 变得更加容易,因为您可以像在 VCL 中一样使用阻塞窗口和对话框。只需将EnableSynchronousOperations设置为 True 即可启用同步模式。之后,您可以在阻止模式下使用窗口和对话框:

if UniForm1.ShowModal = mrOK then 
begin 
  // 在这里执行一些代码
end;

或者

if MessageDlg ('Test', mtConfirmation , mbYesNoCancel ) = mrYes then
begin
    ShowMessage ('Yes'); 
end;

注意:请记住,不应在这些事件中调用阻塞模式窗口和对话框:

UniForm.OnCreate() UniForm.OnShow()

在这些事件中调用阻塞窗口可能会引发异常并产生不可预测的结果。