2016-12-27 22 views
0

我很难从包括TWebActionItem的同步包装我的头。从TWebAction中提取代码以便在主线程中同步()ing?

我的web服务是具有形式的视觉程序TFormWebServices

var FormWebServices: TFormWebServices; 

这具有一个属性FWebBrokerBridge: TIdHTTPWebBrokerBridge
FWebBrokerBridge寄存器TWebModuleWebServices作为类用于每个传入呼叫:

FWebBrokerBridge.RegisterWebModuleClass(TWebModuleWebServices); 

TWebActionItem这门课的作业读作TWebRequest并写作TWebResponse

有一个处理程序需要使用某些VCL可视化渲染(与另一个应用程序共享代码),我想将其与主线程(FormWebServices)同步。

存根:

TWebModuleWebServices = class(TWebModule) 
    procedure WebModuleWebServicesTTGetDynReportAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
    procedure WebModuleAfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
private 
    FResponse: TResBase;  // JSON response object 
end; 

procedure TWebModuleWebServices.WebModuleWebServicesTTGetDynReportAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
var 
    lFrmDynRapport : TFormDynRapport; // A form containing the common code, has VCL components 
begin 
    lResponse := (FResponse as TResGetDynReport); // TResGetDynReport = class(TResBase) 
    // ... 
    lFrmDynRapport := TFormDynRapport.Create(Self); 
    try 
    with lFrmDynRapport do 
    begin 
     // Do visual stuff with grids, read grid settings, fill lResponse with info specific for this webaction 
    end 
    finally 
    end 
    // ... 
end; 

procedure TWebModuleWebServices.WebModuleAfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
var lJSO: ISuperObject; // SuperObject library 
begin 
    lJSO := FResponse.ToJson; 
    // ... 
    Response.Content := lJSO.AsString; 
    Handled := true; 
end; 

现在,我怎么正确同步的try/finally块? 我可以在当前线程获取和不喜欢简单的东西:

lThread := TThread.CurrentThread; 
TThread.Synchronize(lThread,procedure 
    begin 
    FormWebServices.MmoLog.Lines.Add('Synchronize test'); 
    end); 

但对于什么更复杂的我卡住了。
定义本地程序并将它们送入Synchronize不起作用(E2555无法捕获符号)。
如何提取try/finally块,以便我可以在FormWebServices的上下文中正确执行它?

回答

0

诀窍是把整个块在匿名方法(感谢尖端,David):

if lFlexRapDM.DesignerCustomOpenDoc(lFlexRapDM.TimeTellReport) then 
    begin 
     ..... 
     lThread := TThread.CurrentThread; 
     TThread.Synchronize(lThread,procedure 
      var l,lIndex  : integer; 
      ... 
      begin 
       lFrmDynRapport := TFormDynRapport.Create(Self); 
       try 
        with lFrmDynRapport do 
        begin 
        ... 
        end; // with FrmDynReport 
       finally 
        lFrmDynRapport.Free; 
       end; 
      end); 
     ...   
    end // if lFlexRapDM.DesignerCustomOpenDoc