2016-12-27 12 views
0

TWebActionItemからの同期を使用して私の頭を包み込むのに苦労しています。メインスレッドのSynchronize()のためにTWebActionからコードを抽出していますか?

私の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 
関連する問題