Usando FastReport desde IntraWeb
FastReport es un potente y popular librería de
componentes para crear informes.
Si programas en IntraWeb, quizás has pensado en poder obtener bonitos
informes pdf, reutilizando informes que tienes desarrollados para un programa
DeskTop.
Realmente no es muy complicado, pero si no tienes en cuenta algunos “trucos”,
te va a ser difícil alcanzar el resultado.
Veamos como se crearía un informe pdf en una aplicación
delphi normal:
var pdf: TfrxPDFExport;
frreport: TfrxReport; procedure CrearReport (const nam,resul:String); begin frReport.LoadFromFile(nam); pdf.ShowDialog:=false; //Turn off dialog pdf.FileName:=resul;
frReport.PrepareReport(true); frReport.export (pdf) end; |
El procedimiento CrearReport recibe como parámetro nam ( que es
el nombre de la plantilla fr que se quiere listar) y resul que es el nombre
del archivo resultado del listado.
Este procedimiento funcionaría perfectamente en un programa desktop
( Por supuesto si se han inicializado los componentes relacionados). Sin
embargo si queremos hacer lo mismo en un programa IntraWeb, intentando
crear el informe como respuesta a un comando solicitado desde el formulario
Web, posiblemente no te funcionara de primeras.
¿ Cual es la causa ? En una aplicación IntraWeb, la respuesta
a los comandos solicitados, se procesan en hilos (Threads). Es conocido
el problema que hay al generar un formulario, desde un hilo que no sea
el hilo principal. (Se produce una “inconsistencia” del formulario
generado).
. FastReport necesita crear unos formularios (aunque sean invisibles)
para crear los informes. Si nosotros usamos solo algo parecido al codigo1,
nuestra aplicación “petará” al intentar crear
el informe.
¿Cuál es la solución?
Generaremos un nuevo hilo ( thread), mediante el que sincronizaremos la
creación del informe con el hilo principal.
type
TIwFastResport = CLASS(TThread) protected procedure Execute; override; public na,resu:string;
constructor Create (const nas,resus:string); procedure crear; end;
constructor TIwFastResport.Create (const nas,resus:string); begin inherited create (true); freeonterminate:=false; na:=nas; resu:=resus; end;
procedure TIwFastResport.Execute;
begin synchronize (crear); end;
procedure TIwFastResport.crear; begin CrearReport (na,resu)
end;
|
¿Como se usa este componente?
procedure TFormSample.ExportGen_( na:string; resu:string); var th:TIwFastResport; begin th:=TIwFastResport.create(na,resu); th.resume; th.WaitFor; th.Free; WebApplication.SendFile(resu,True , 'application/binary', ''); end; |
|