Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Erro intermitente com QuickReport


K!ko

Pergunta

Bom dia Senhores!

Bom, eu possuo um relatório de Ordens de serviço fechadas desenvelvido em QuickReport e Delphi 5.

O problema é que esse relatório em especial apresenta um erro intermitente, ou seja, às vezes ele funciona e às vezes ocorre o erro... o erro ocorre na tela de Preview do QuickReport, não mostra nada no preview e quando ele é fechado aparece um erro +/- assim: Win32 Error 1400...

Eu já revi a programação diversas vezes passando linha a linha, no entanto não identifiquei o erro na mesma... ele passa por todas as linhas e atribui todos os valores corretamente aos campos das query's que são usados nos selects, tanto quanto o erro ocorre quanto não.

Alguém sabe oque pode ser?

Agradecido desde já.

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

Kiko estou tendo o mesmo problema, só que no momento de imprimir, gera o relatório normalmente e as vezes na hora de imprimir dá esse erro Win32 Error 1400, notei, que se fechar o relatório e gerar novamente o erro não persiste, quando ele resolve aparecer é claro, caso você consiga resolver, poste aí, confesso até hj não consegui definir porque isso acontece!

Link para o comentário
Compartilhar em outros sites

  • 0
o erro ocorre na tela de Preview do QuickReport, não mostra nada no preview e quando ele é fechado aparece um erro +/- assim: Win32 Error 1400

Win32 Error code 1400

O identificador de janela é invalido.

Este erro ocorre se por algum motivo o objeto deixou de existir antes de finalizar o codigo, ou foi perdido o ponteiro da enumeração da janela.

veja os eventos onclose, close , ondestroy

OBS: os eventos PreviewModeless e PreviewModal podem gerar este tipo de erro, pois a execução dos comandos sobrepassa estes dois não aguardando a finalização da execução

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Vlw Jhonas vo da uma olhada no que você mencionou...

Qualquer coisa eu volto a postar...

só uma duvida... esses eventos que você mencionou são referentes a que?... ao componente do Quick, ao form onde está o componente do quick ou ao form que faz a chamada do componente do quick?

agradecido :D

Editado por K!ko
Link para o comentário
Compartilhar em outros sites

  • 0
só uma duvida... esses eventos que você mencionou são referentes a que?... ao componente do Quick, ao form onde está o componente do quick ou ao form que faz a chamada do componente do quick?

(ao form onde está o componente do quick) so se voce colocou um componente QR dentro de um form ... pode ser tambem

(ou ao form que faz a chamada do componente do quick) imagine que voce fez uma chamada ao QR mas usou

os eventos PreviewModeless ou PreviewModal, e logo apos este comando exista um comando para fechar a janela ou destrui-la ou ainda de libera-la da memoria, então é uma das possibilidades de ocorrer este erro.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
(ou ao form que faz a chamada do componente do quick) imagine que voce fez uma chamada ao QR mas usou

os eventos PreviewModeless ou PreviewModal, e logo apos este comando exista um comando para fechar a janela ou destrui-la ou ainda de libera-la da memoria, então é uma das possibilidades de ocorrer este erro.

Este é o código que faz a chamada do QR, que está em um form diferente.

procedure TFrmos.Sada1Click(Sender: TObject);
begin
     frmrlos1:= tfrmrlos1.create(self);

     {Selects usados para trazer os dados no QR, que esta no form Frmrlos1}

     frmrlos1.QuickRep1.Previewmodal;
     frmrlos1.QrOs.close;
     frmrlos1.free;
end;

você acha que este Free precedido do Preview modal está gerando o erro?

Caso sim, como posso resolver isso?

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Estive conversando com um desenvolvedor que trabalha aqui a mais tempo e ele me informou que os campos que estão no QR estão setados com a fonte Draft 12Cpi neste relatório, que é usada como padrão para impressoras do tipo LX 300 (matriciais), por exemplo, ele me imformou também que isto era usado para que fosse possível visualizar o relatório no preview e além disso imprimi-lo de forma rápida nesses tipos de impressora, que é característica desse tipo de fonte.

No entanto, notei que quando não existe nenhuma impressora deste tipo instalado na maquina esse tipo de fonte não aparece, ou seja, é como se a fonte só existisse se alguma impressora desse tipo estivesse instalada na porta LPT1 do micro. Sendo assim caso não exista a impressora na maquina o relatório não será mostrado pois a fonte no qual o mesmo é desenvolvido não existe.

Para confirmar isto instalei uma impressora do tipo LX 300 na porta LPT1 do meu micro e realmente as fontes Draft 12Cpi apareceram. Logo após removi todas as impressoras do meu micro e, para minha surpresa, o relatório funcionou normalmente, me deixando mais confuso do que estava...

Pode este fator ser considerado como uma possivel causa do erro?

abraço.

Link para o comentário
Compartilhar em outros sites

  • 0
Para confirmar isto instalei uma impressora do tipo LX 300 na porta LPT1 do meu micro e realmente as fontes Draft 12Cpi apareceram. Logo após removi todas as impressoras do meu micro e, para minha surpresa, o relatório funcionou normalmente, me deixando mais confuso do que estava...

Pode este fator ser considerado como uma possivel causa do erro?

Não... porque se não existir a fonte que voce usou no QR será assumida uma fonte padrão

procedure TFrmos.Sada1Click(Sender: TObject);
begin
     frmrlos1:= tfrmrlos1.create(self);

     {Selects usados para trazer os dados no QR, que esta no form Frmrlos1}

     frmrlos1.QuickRep1.Preview;
     frmrlos1.QrOs.close;
     frmrlos1.free;
end;

Usando somente o Preview, o comado close do QR só será excutado depois que voce fechar o QR

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
procedure TFrmos.Sada1Click(Sender: TObject);
begin
     frmrlos1:= tfrmrlos1.create(self);

     {Selects usados para trazer os dados no QR, que esta no form Frmrlos1}

     frmrlos1.QuickRep1.Preview;
     frmrlos1.QrOs.close;
     frmrlos1.free;
end;
Usando somente o Preview, o comado close do QR só será excutado depois que voce fechar o QR
Realmente isto resolve o problema... mas existe uma outra possibilidade que pode gerar erro... supomos que nosso usuário, que é perito em encontrar falhas, gere o preview do relatório e em seguida o minimize e acesse a tela onde existe o botão que gera o relatório (O preview possibilita isso, diferente do PreviewModal, que prende o usuárió na tela de preview e só o libera quando o relatório é fechado), após minizar clique no botão que gera o relatório outra vez... isso acarretaria em um erro pois o relatório já existe na memória. Por exemplo, eu fiz com que o sistema verificasse se o relatório já existe. Caso já exista mostrará uma mensagem relatando isto caso não mostraria o preview do relatório normalmente. No entanto isso só funciona na 1ª vez que gero o relatório ao fecha-lo não consigo libera-lo da memória. o código esta +/- assim
if frmrlos1 = nil then
begin
  frmrlos1:= tfrmrlos1.create(self);

  {Selects usados para trazer os dados no QR, que esta no form Frmrlos1}

  frmrlos1.QuickRep1.Preview;
  frmrlos1.QrOs.close;
  frmrlos1.free;
end
else
  messagedlg('Este relatório já esta sendo exibido', mtwarning, [mbok],0);

tentei também libera-lo ao fechar o form no qual o QR gera o preview (frmrlos1), mas não obtive sucesso.

Onde posso liberar o form da memória para que isto não ocorra?

Alguém pode me ajudar com isto?

abraço

Editado por K!ko
Link para o comentário
Compartilhar em outros sites

  • 0
K!ko, qual a versão do QuickReport que você está usando? Já está com a última versão?

Esta é a última:QuickReport 3.5.1 Standard for Delphi 5

Sim, É esta a versão que uso... QuickReport 3.5.1 Standard for Delphi 5.

você acha que o problema esta relacionado a algum bug do QR?

abraço.

Link para o comentário
Compartilhar em outros sites

  • 0
Sim, É esta a versão que uso... QuickReport 3.5.1 Standard for Delphi 5.

você acha que o problema esta relacionado a algum bug do QR?

Pouco provável e não li nada parecido ainda.

O que você falou sobre o uso do ShowPreview é correto, mesmo assim, eu conto com o bom senso do usuário (às minhas recomendações) e continuo usando ele (como sugeriu-lhe o Jhonas).

Mas já usei o ShowPreviewModal e não tive problema. Talvez tenha alguma relação com o tamanho do relatório..

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Sendo assim o problema está resolvido...

Se fosse possível, eu gostaria de saber como liberar o relatório da memória naquele código que comentei em outro post... onde eu verifico se ele está ou não na memória e caso estiver relato isto ao usuário dizendo que o relatório já esta sendo exibido.

Isto só funciona na 1ª vez que gero o relatório... ao fecha-lo e abri-lo novamente ele não é liberado da memória, por tanto a mensagem persiste em aparecer toda vez...

agradecido.

Link para o comentário
Compartilhar em outros sites

  • 0
Se fosse possível, eu gostaria de saber como liberar o relatório da memória naquele código que comentei em outro post... onde eu verifico se ele está ou não na memória e caso estiver relato isto ao usuário dizendo que o relatório já esta sendo exibido.
Ok K!ko, vamos gastar algum tempinho aqui...

Isto só funciona na 1ª vez que gero o relatório... ao fecha-lo e abri-lo novamente ele não é liberado da memória, por tanto a mensagem persiste em aparecer toda vez...
isso ocorre porque, ao chamar preview a execução no seu form é interrompida, ou seja, não são executadas estas linhas:

...
    frmrlos1.QrOs.close;
    frmrlos1.Free
e assim, seu preview fica na memória. Ele não é modal, logo é possível o usuário clicar de novo no botão para gerar o mesmo. Contudo, a sua variável frmrlos1 não estará igual a nil porque há uma instância alocada ainda, mas mesmo que não houvesse mais, ocorre que você não inicializa a variável após a sua liberação e ela continua com um valor que agora é lixo, mas impede que o teste funcione. Bom, vamos ajustar seu código para funcionar mais corretamente e incluir uma opção para restaurar a janela preview minimizada:
if frmrlos1 = nil then
begin
  frmrlos1 := tfrmrlos1.Create(self);
  try

    {Selects usados para trazer os dados no QR, que esta no form Frmrlos1}

    frmrlos1.QuickRep1.Preview;
    frmrlos1.QrOs.close;
  finally
    frmrlos1.Release;
    frmrlos1 := nil;
  end;
end else
begin
  MessageDlg('Este relatório já esta sendo exibido', mtwarning, [mbok],0);
  with frmrlos1.QuickRep1.QRPrinter.Client do
    ShowWindow(Parent.Handle, SW_SHOWMAXIMIZED);
end;

frmrlos1.QuickRep1.QRPrinter.Client equivale a: <nome form>.<nome QuickRep>.QRPrinter.Client

seguindo a lógica: acessamos o quickrep que está no seu form; depois acessamos o QRPrinter deste quickrep; depois acessamos o componente QRPreview (Client) que está vinculado ao QRPrinter; e por último acessamos o form QrPrintPreview que é o Parent do QRPreview. Pronto, estamos apontando para a janela de preview e para mostrá-la usamos a função da API ShowWindows com a opção maximizar.

Obs:

1) com forms, use Release e não Free;

2) é importante inicializar a variável do form com nil após o release, para não haver erro;

3) é recomendado o uso do try..finally;

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...