ERRO - Um componente chamado QRSTANDARDPREVIEW já existe

26/05/2003

1

Um componente chamado QRSTANDARDPREVIEW já existe, etsa mensagem tem apresentado na impressão de um relatório (QuickReport)o mais impressionante que não é sempre quando a máquina esta com poucos recurso de memória a presenta. Um colega do forum me mandou o seguinte código

var nIdx:Integer;
begin
for nIdx:=(Screen.FormCount-1) downTo 0 do
with Screen.Forms[nIdx] do
if ClassName = ´TQRStandardPreview´ then
Close;

So que utilizo e ainda continua acontecendo este erro e não é sempre tem hora que funciona e tem hora que não funciona. O que pode estar acontecendo?

Bom antes de dar um previewModal, executa a procedure QrDestroi acima descrita e depois envio o previewModal;

O formulario esta no auto-create e não esta sendo desalocado da memória, isto acontece mesmo sendo criado na mão e desalocado.

Optei por este processo pelo fato de velocidade na carga do relatório pois sendo criado na mão demora pelo fato do relatório ser contrato e ter vários componentes.

Já separei os relatórios em formulários para aliviar e não resolveu, um formulário com vários relatórios tinha cerca de 410 k e agora este tem 300k.

Bom falei tudo para facilitar a vcs.

Obrigado,

Hamilton Dias


Responder

Posts

26/05/2003

Aroldo Zanela

Colega,

Veja uma solução apresentada num NEWS da Borland que além do código que você está utilizando, possui mais algumas rotinas:

´I can´t explain all my reasons or we will be here forever but here is
my current strategy.

(A) In the FormClose event of all my report forms, I place the line:
Action := caFree;
This ensures that the free doesn´t happen unless and until the form is
closed but it *does* always happen when the form is closed.

(B) In the FormDestroy event of all my report forms, I have code
similar to this (changed in accord with the name of the form):
if assigned(MyReportForm) then MyReportForm := Nil;

(C) If calling reports from a modal form, I allow printing but never
allow previewing.

(D) When creating any report, I use code similar to this. Note that
because of the above steps, I no longer need Try, Finally or ´free´ in
the calling procedure. The end result of all this is that there can
never be more that one report form and one preview in existence in my
applications. It may not be perfect but it is working for me.

Regards,
Colin Acheson

** EXAMPLE CODE **

CloseQuickReportPreview; {see procedure below}
if not assigned(MyReportForm) then
MyReportForm := TMyReportForm.Create(nil);
with MyReportForm do
begin
MyReport.PrinterSettings.PrinterIndex := Printer.PrinterIndex;
MyReport.Preview; {or MyReport.Print}
end;
if assigned(MyReportForm) then MyReportForm.Close;

procedure TMainDataModule.CloseQuickReportPreview;
{Note: this procedure only closes the first report
preview it finds in the screen list. However if
it is called religiously on EVERY occasion before
previewing or printing a report, it will ensure
there is never more than one preview in existence}
var
i: Integer;
begin
for i := 0 to Screen.FormCount - 1 do
begin
if Screen.Forms[i].ClassName = ´TQRStandardPreview´ then
begin
Screen.Forms[i].Close;
break;
end;
end;
end;
´


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira