|
Postada em 19/07/2006 19:50 hs
Olá. Em tempo de projeto, meu sistema roda legal. Na saída de uma textbox (lostfocus), associei a impressão de um recibo via objeto Printer. O recibo é impresso tal qual projetado, e os dados ficam gravados em disco. Contudo, pelo executável (que fica na mesma pasta do project), o programa, além de não imprimir o recibo, exibe a msgbox "Run-time error '5' - Invalid procedure call or argument", e fecha o aplicativo. Contudo, salva os dados. Daí, carrego novamente o programa (executável), peço a reimpressão do recibo (não pela saída da textbox, e sim por um botão de reimpressão), e sai tudo OK. O problema é que, quando instalo no cliente, o que roda é o executável (mais as dll's, reports e data base), gerando esse erro sempre que tabulo fora da textbox com a rotina de impressão. Como eu poderia resolver essa parada? Eis o código de impressão, acessado pelo lostfocus da textbox: Private Sub txtGarantia_LostFocus() Dim Mindate As Date, Temp As Date Dim IntervalType As String, X As String Dim Number As Integer Dim Resultado IntervalType = "d" frmDimEletronica.Text15 = Data1.Recordset.Fields("DataDeSaída") frmDimEletronica.Text16 = txtGarantia Data1.Refresh R = MsgBox("Imprime o recibo de venda?", vbQuestion + vbYesNo, "Rotina de impressão") If R = vbNo Then Me.Hide frmDimEletronica.Show Exit Sub Else MsgBox "Adicione papel na impressora...", vbOKOnly, "Impressão da ficha de venda" Number = Data1.Recordset.Fields("Garantia") Mindate = Data1.Recordset.Fields("DataDeSaída") Tempo = DateAdd(IntervalType, Number, Mindate) Tempo = Format(Tempo, "dd/mm/yyyy") Resultado = "( Até " & (Tempo) & "." & ")" Printer.FontName = "Arial" Printer.FontSize = 8 Printer.FontName = "Courier New" Printer.FontSize = 9 Printer.Print Tab(5); "DIM ELETRONICA"; Tab(80); "*** RECIBO VENDA CLIENTE ***" Printer.Print Tab(5); "Rua Carlos Varela, 210 - centro - CRUZEIRO - Telefone: 3144-1064" Printer.Print Tab(12); String(90, "-") Printer.Print Tab(12); "Ficha nº:"; Tab(28); Data1.Recordset.Fields("OrdemServiço") Printer.Print Tab(12); "Comprador:"; Tab(28); Data1.Recordset.Fields("NomeComprador") Printer.Print Tab(12); "Endereço:"; Tab(28); Data1.Recordset.Fields("EndComprador"); Spc(2); "Nº:"; Spc(2); Data1.Recordset.Fields("N_Comprador"); Spc(2); "Tel.: "; Data1.Recordset.Fields("TelComprador") Printer.Print Tab(12); String(90, "-") Printer.Print Tab(12); "Aparelho:"; Tab(28); Data1.Recordset.Fields("Tipo") Printer.Print Tab(12); "Marca:"; Tab(28); Data1.Recordset.Fields("Marca") Printer.Print Tab(12); "Modelo:"; Tab(28); Data1.Recordset.Fields("Modelo") Printer.Print Tab(12); "Série:"; Tab(28); Data1.Recordset.Fields("Série") Printer.Print Tab(12); "Valor pago:"; Tab(28); Format(Data1.Recordset.Fields("ValorVenda"), "R$ " & "###,###.00") Printer.Print Tab(12); "Saída:"; Tab(28); Data1.Recordset.Fields("DataDeSaída"); Spc(2); "Garantia:"; Spc(2); Data1.Recordset.Fields("Garantia") & " dias " & Resultado Printer.Print Tab(12); "Obs.:"; Tab(28); "Não tente remover o lacre, para não invalidar a garantia." Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print Tab(5); "DIM ELETRONICA"; Tab(80); "*** RECIBO VENDA LOJA ***" Printer.Print Tab(5); "Rua Carlos Varela, 210 - centro - CRUZEIRO - Telefone: 3144-1064" Printer.Print Tab(12); String(90, "-") Printer.Print Tab(12); "Ficha nº:"; Tab(28); Data1.Recordset.Fields("OrdemServiço") Printer.Print Tab(12); "Comprador:"; Tab(28); Data1.Recordset.Fields("NomeComprador") Printer.Print Tab(12); "Endereço:"; Tab(28); Data1.Recordset.Fields("EndComprador"); Spc(2); "Nº:"; Spc(2); Data1.Recordset.Fields("N_Comprador"); Spc(2); "Tel.: "; Data1.Recordset.Fields("TelComprador") Printer.Print Tab(12); String(90, "-") Printer.Print Tab(12); "Aparelho:"; Tab(28); Data1.Recordset.Fields("Tipo") Printer.Print Tab(12); "Marca:"; Tab(28); Data1.Recordset.Fields("Marca") Printer.Print Tab(12); "Modelo:"; Tab(28); Data1.Recordset.Fields("Modelo") Printer.Print Tab(12); "Série:"; Tab(28); Data1.Recordset.Fields("Série") Printer.Print Tab(12); "Valor pago:"; Tab(28); Format(Data1.Recordset.Fields("ValorVenda"), "R$ " & "###,###.00") Printer.Print Tab(12); "Saída:"; Tab(28); Data1.Recordset.Fields("DataDeSaída"); Spc(2); "Garantia:"; Spc(2); Data1.Recordset.Fields("Garantia") & " dias " & Resultado Data1.Refresh 'Atualiza o cadastro. Printer.EndDoc 'Encerra o trabalho de impressão End If Me.Hide 'Fecha este form frmDimEletronica.Show 'Exibe o form principal End Sub
|
|
|
|
|
Postada em 19/07/2006 20:17 hs
Olá, O problema pode não estar nessa rotina, mas em algum outro ponto do programa. Faça o seguinte: 1. coloque em cada evento desse form uma rotina para gravar um log dos eventos chamados. Você pode abrir um arquivo em disco para isso, e toda vez que você entrar num evento de um controle onde haja algum código, grave ali o nome do evento. Por exemplo, se entrou o evento LostFocus, grave no arquivo Text1_LostFocus, e assim por diante. Dessa forma você saberá exatamente em qual evento o problema se manifesta, pois como eu disse o problema pode estar em outro lugar, e você pensda que está no LostFocus desse textbox; 2. Depois de identificado o evento que gera o erro, use uma rotina simples de captura de erros, com o comando "On Error Goto" e use numeração de linhas (eu sei é um porre fazer isso...) e na subrotina de tratamento de erros, mande exibir a linha onde ocorre o erro com Erl: On Error Goto TrataErro 1: IntervalType = "d" 2: frmDimEletronica.Text15 = Data1.Recordset.Fields("DataDeSaída") 3: frmDimEletronica.Text16 = txtGarantia < restante do código com numeração das linhas > Exit Sub '<-- não esqueça disso, pois caso contrário você corre o risco de entrar no 'tratamento de erros sem ter havido um erro! TrataErro: Msgbox "Erro " & err.number & " na linha " & Erl Bom, eu sei que isso é muito chato, mas no caso de erros "fantasmas" devemos usar a força bruta mesmo. Provavelmente o erro está em algum ponto onde você menos espera (é sempre assim na informática...). um abraço, Sandro.
|
|
|
|