Мне трудно понять, как использовать Synchronize from a TWebActionItem
.
Мой веб-сервис - это визуальная программа с формой 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?