• 0
Sign in to follow this  
rodrigotnoma

Enumjob

Question

Estava lendo esse post e fiquei com uma duvida.

http://scriptbrasil.com.br/forum/index.php...pressora+padrão

Devo implementar essa parte:

Dim impressora As Printer

For Each impressora In Printers

Debug.Print impressora.DeviceName

Next

Nesta:

Private Sub Form_Load()

Dim hPrinter As Long, lNeeded As Long, lReturned As Long

Dim lJobCount As Long

OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&

EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned

If lNeeded > 0 Then

ReDim byteJobsBuffer(lNeeded - 1) As Byte

EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned

If lReturned > 0 Then

lJobCount = lReturned

Else

lJobCount = 0

End If

Else

lJobCount = 0

End If

ClosePrinter hPrinter

End Sub

Como o Graymalkin disse, onde implemento essa parte?

Obrigado

Rodrigo

Share this post


Link to post
Share on other sites

17 answers to this question

Recommended Posts

  • 0

O meu segundo post daquele tópico explica onde deve ser mudado. Só que, é claro, depende do que você quer exatamente.

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
  • 0

Minha duvida é o seguinte:

Coloquei num Timer isso:

Private Sub Timer1_Timer()

Dim hPrinter As Long, lNeeded As Long, lReturned As Long

Dim lJobCount As Long

OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&

EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned

If lNeeded > 0 Then

ReDim byteJobsBuffer(lNeeded - 1) As Byte

EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned

If lReturned > 0 Then

lJobCount = lReturned

Else

lJobCount = 0

End If

Else

lJobCount = 0

End If

ClosePrinter hPrinter

Text1.Text = CStr(lJobCount)

If Text1.Text = 1 Then

Form2.Show

End If

End Sub

quando mando imprimir pela impressora default o form2 é mostrado, mas quando escolho outra impressora no momento de imprimir o form2 não é chamado.Sei que é por causa do Printer.DeviceName, mas tem como fazer com que o Form2 seja chamado quando qualquer impressora for utilizada?

Obrigado

Share this post


Link to post
Share on other sites
  • 0

Dentro do timer, faça um loop percorrendo todas as impressoras e usando o código acima para cada uma delas.

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
  • 0

Obrigado...

Posso fazer isso com

For Each impressora in Printer

Debug.Print impressora.DeviceName

Next

????

Sim, pode. A cada iteração o objeto "impressora" estaria apontando para uma impressora do sistema. Bastaria então passá-lo para OpenPrinter e usar todo aquele código para enumerar os trabalhos de impressão.

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
  • 0

você pode me dizer se assim da?

For Each impressora In Printer

OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&

EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned

If lNeeded > 0 Then

ReDim byteJobsBuffer(lNeeded - 1) As Byte

EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned

If lReturned > 0 Then

lJobCount = lReturned

Else

lJobCount = 0

End If

Else

lJobCount = 0

End If

ClosePrinter hPrinter

Text1.Text = CStr(lJobCount)

If Text1.Text = 1 Then

Form2.Show

Text1.Text = 0

End If

Next

Ou devo altera mais alguma coisa...

Desculpe a "encheção de saco".

Obrigado

Share this post


Link to post
Share on other sites
  • 0

Só falta alterar uma coisa aí e eu disse o que é na última frase do meu post anterior. Leia novamente. Ah, e é Printers (no plural) na linha do For Each.

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
  • 0

Até tinha feito isso, mas deu esse erro e pensei que estivesse errado:

"Object doesn't support this property or method"

??????

Você corrigiu aquele "Printer" para "Printers"? De qualquer maneira, poste aqui o código todo para eu dar uma olhada.

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
  • 0

Graymalkin e amigos....

No form2 que eu chamo na hora de imprimir tem um botao e 3 campos text.

No botao coloquei esse codigo:

Set Cn = New ADODB.Connection

connstring = "provider=microsoft.jet.oledb.4.0;data source=\\192.168.0.120\impressao\impressao.mdb;"

Cn.Open connstring

If (Combo1.Text = "" Or Combo2.Text = "" Or Text1.Text = "") Then

msgbox("Preencher todos os campos")

Combo1.SetFocus

Else

If Combo2.Text = "Monocromatica" Then

impressora = Printer.DeviceName

hora = Hour(Time) & ":" & Minute(Time) & ":" & Second(Time)

cliente = Combo1.Text

paginas = Text1.Text

ip = GetIPAddress()

tipo = "m"

Data = Day(Date) & "/" & Month(Date) & "/" & Year(Date)

Set rs = Cn.Execute("insert into tb_impressao(nome,hora,data,cliente,paginas,ip,tipo) values('" & impressora & "','" & hora & "','" & Data & "','" & cliente & "','" & paginas & "','" & ip & "','" & tipo & "')")

MsgBox ("Impressão Cadastrada")

Else

impressora = Printer.DeviceName

hora = Hour(Time) & ":" & Minute(Time) & ":" & Second(Time)

cliente = Combo1.Text

paginas = Text1.Text

ip = GetIPAddress()

tipo = "c"

Data = Day(Date) & "/" & Month(Date) & "/" & Year(Date)

Set rs = Cn.Execute("insert into tb_impressao(nome,hora,data,cliente,paginas,ip,tipo) values('" & impressora & "','" & hora & "','" & Data & "','" & cliente & "','" & paginas & "','" & ip & "','" & tipo & "')")

MsgBox ("Impressão Cadastrada")

End If

End If

ReadyToClose = True

Unload Me

Para mim capturar a impressora que vou utilizar e não a padrão, posso fazer do mesmo jeito acima, ou tem outra forma melhor?

E gostaria de obrigar o usuario a preencher todos os campos, caso fosse deixado em branco,o form voltaria a aparecer ou a impressão não seria realizada.Tentei fazer o que esta de vermelho mas não consegui pois assim que dou um OK no botao o programa é encerrado.....

alguém poderia me ajudar?

Obrigado

Share this post


Link to post
Share on other sites
  • 0

Tanto no If quanto no Else você está pegando a mesma impressora, ou seja, a impressora padrão do sistema (Printer):

impressora = Printer.DeviceName

O usuário não deveria escolher a impressora?

E, quanto ao programa sair, você está mandando ele fazer isso na linha "Unload Me". Esta linha deveria estar dentro da(s) condição(ões) em que o programa deve realmente sair.

Abraços,

Graymalkin

Share this post


Link to post
Share on other sites
  • 0
Guest Visitante

Graymalkin

Não estou escolhendo a impressora, coloquei o seguinte codigo em um Timer com Interval=1000:

For Each impressora In Printer

OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&

EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned

If lNeeded > 0 Then

ReDim byteJobsBuffer(lNeeded - 1) As Byte

EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned

If lReturned > 0 Then

lJobCount = lReturned

Else

lJobCount = 0

End If

Else

lJobCount = 0

End If

ClosePrinter hPrinter

Text1.Text = CStr(lJobCount)

If Text1.Text = 1 Then

Form2.Show

Text1.Text = 0

End If

Next

Assim quando uma impressão é solicitada e o valor de lJobCount for igual a 1 o form2 é chamado.

Será que tem jeito de pegar a impressora utilizada e não a padrão, pois esta pegando apenas a padrão.

quanto o UnloadMe eu entendi sim, mas quando chamo o Form2, a impressão já foi, penso eu que devo controlar isso no codigo que eu coloquei acima, mas não faço ideia onde posso controlar isso.Não sei se da pra fazer isso:

quando solicitar a impressão, antes de iniciar essa impressão,o form2 é chamado e se não for preenchido,ou deixado em branco, a impressão é cancelada, sera que da?

Vlw,obrigadão pela ajuda...

Rodrigo

Obrigado

Share this post


Link to post
Share on other sites
  • 0

Cara, você ainda não entendeu que "Printer" é a impressora padrão e que o objeto "impressora" ali naquele For Each é que varia com as impressoras instaladas no sistema? Por que você continua usando "Printer" no lugar que deveria usar "impressora"?

É esse o problema.

Graymalkin

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this