Notas importantes sobre FastReport e segurança de threads

FastReport é uma ferramenta de relatório popular para Delphi e C++ Builder. Em um ambiente uniGUI multithread, é preciso tomar cuidados especiais para garantir que o FastReport seja executado em um modo compatível.

Evite usar a lista global de datasets do FastReport

O dataset global é uma coleção usada pelo FastReport em aplicações VCL. Essa coleção deve ser evitada no uniGUI porque seu uso pode levar a problemas graves, como estouro de pilha e crash imediato do servidor.

Garanta que a seguinte configuração seja aplicada para evitar o uso do dataset global:

Delphi
Report.EngineOptions.UseGlobalDataSetList := False; // Não mantenha uma lista global de datasets

Os desenvolvedores devem certificar-se de que essa configuração seja aplicada logo após o componente TfrxReport ser criado.

Aplique a configuração para componentes colocados em Forms ou DataModules

uniGUI fornece um gancho conveniente para configurar novos componentes. Adicione o código a seguir em MainModule no OnNewComponent evento:

Delphi
procedure TUniMainModule.UniGUIMainModuleNewComponent(AComponent: TComponent);
begin
  if AComponent is TfrxReport then
  begin
    (AComponent as TfrxReport).EngineOptions.UseGlobalDataSetList := False;
  end;
end;

Isto garante que cada nova instância de TfrxReport terá o UseGlobalDataSetList configurado corretamente.

Criando TfrxReport em código

Ao criar TfrxReport programaticamente, ajuste as opções imediatamente após a criação. Certifique-se de sempre fornecer um owner adequado (evite usar nil como owner).

Gerando relatórios usando componentes dinâmicos

Para economizar recursos do sistema e garantir segurança em threads, é recomendado usar componentes criados dinamicamente (por exemplo, um DataModule livre que contém TfrxReport e componentes relacionados).

Exemplos de demos (caminhos preservados):

  • ..\uniGUI\Demos\PublicDemos\Desktop\FastReport - Dynamic

  • ..\uniGUI\Demos\PublicDemos\Desktop\FastReport - MultiReport

Ao gerar um relatório, crie o DataModule livre, gere o relatório e então destrua o DataModule.

clip0102
1

Crie o DataModule

Crie um DataModule livre que contenha TfrxReport e outros componentes de relatório necessários:

  • Use um owner de nil ao criar o DataModule (assim ele é um módulo livre).

2

Gere o relatório

Crie, use e gere o relatório dentro da mesma thread/contexto. Exemplo:

3

Destrua o DataModule

Libere o DataModule imediatamente após a geração do relatório para liberar recursos e evitar vazamento de handles ou componentes que possam usar handles do Windows.

circle-exclamation