Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: вывод на печать, как проверить наличие принтера ? Добавлено: 30.07.07 20:29  

Автор вопроса:  DimDoc
Всем привет!
использую следующую процедуру:
Public Sub PrintMyDok()

On Error GoTo ErrorHandler

'текст

Printer.EndDoc
Printer.KillDoc ' нужна ли эта строка?
fMainForm.MousePointer = 0
fMainForm.CmdPrintPage2.SetFocus
Exit Sub

ErrorHandler:
Select Case Err.Number
            Case 482
            
            Beep
            MsgBox "Проверьте принтер!", vbCritical, "Ошибка"
            Printer.KillDoc
            fMainForm.MousePointer = 0
           Case 396
            
            Beep
            MsgBox "Нарушена связь с принтером!", vbCritical, "Ошибка"
            Printer.KillDoc
            fMainForm.MousePointer = 0
            Case Else
  
            MsgBox "Ошибка № " & Err.Number & Err.Description, vbCritical, "Ошибка"
            Printer.KillDoc
            fMainForm.MousePointer = 0

End Select
Exit Sub
End Sub

такой обработчик ошибок почему-то работает несколько странно...
На компе друга (WinXP) при отсутствии принтера - был вызван МАСТЕР ОТПРАВКИ ФАКСОВ...
на моём - при отключенном принтере ничего не сообщает, но помещает задание в очередь на печать...

Друзья!
Как правильно обработать отсутствие принтера, или если можно - определить, включен или нет.
семейство printers имеет к этому отношение?
Спастбо!

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 ua4ase



Вопросов: 5
Ответов: 19
 Профиль | | #1 Добавлено: 01.08.07 13:43
Private Sub Form_Load()
On Error GoTo err1
Label1.Caption = Printer.DeviceName
Exit Sub
err1:
Label1.Caption = "Принтер в системе не установлен"
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 02.08.07 16:24
Dim p As Printer
For Each p In Printers
    Debug.Print p.DeviceName
Next

Ответить

Номер ответа: 3
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #3 Добавлено: 03.08.07 15:23
Спасибо за помощь!
Первый вариант приводит к ошибке, видимо из за того, что нельзя прочитать имя несуществующего принтера...
вариант HACKERa к ошибке не приводит, но и обработчиком ошибок никак не обрабатывается...
может так:
Dim p As Printer
Dim mStr As String

For Each p In Printers
    mStr = mStr & p.DeviceName & vbCrLf
    Label1.Caption = mStr
Next

If mStr = "" Then
Label1.Caption = "Принтер в системе не установлен"
Else
Label1.Caption = "документ выводится на печать..."
End If

Но так тоже обработчиком ошибок не обрабатывается... выдернул кабель принтера, а документ встал в очередь на печать и тишина!

А хочтеся так:
"Включите принтер!"
"Загрузите бумагу..."
и т.д.

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 03.08.07 18:29
DimDoc, оба варианты рабочие.
Первый хоть и вызывает ошибку, но On Error GoTo err1 там не зря... А во втором можно перебрать все принтера, если ничего не перебралось - прийти к выводу что принтера нет.

Dim p As Printer, flag as Boolean
For Each p In Printers
    Debug.Print p.DeviceName
    flag = True
Next
if flag = False then
    msgbox "Включите принтер!"
end if


В случае с обработчиком ошибок, можно даже узнать почему неудается напечатать, достаточно узнать номер ошибки через err.number

Ответить

Номер ответа: 5
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #5 Добавлено: 04.08.07 00:18
код работает только если в системе не установлен принтер физически. Если же он установлен, но выключен - то никаких видимых проблем нет... а есть документ ожидающий очередь на печать. поэтому:
MsgBox "Ошибка № " & Err.Number & Err.Description

не происходит.
HACKER - может Вы знаете, как через API

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 04.08.07 03:24
Всё правильно, печатаешь не принтером же, а драйвером :) А драйвер всегда готов к работе, а отличии от принтера. От этого документы и складываются в очередь. Лезть надо глубже, в команды опроса принтера, или опросы порта к которому он подключен. Т.к. стандартных средств (win api например) вроде бы нету для проверки принтера на готовность. В любом случае накатывается масса проблем: если и есть апи от производителей принтера - получаем зависимость от модели принтера. Работать с портами на низком уровне в NT системах по нормальному не получится. Писать драйвер который будет работать в ring-0 с портами, тоже занятие не из приятных. Так что врядли оно того стоит. Единственное что приходит в голову, собразить что-то вроде таймаута печати. Менеджер печети в винде, сохраняет же дату+время помощение документа в очередь, от этого можно попробовать оттолкнуться. Например если документ висит в очереди больше минуты - таймаут, ругаемся, удаляем документ из очереди итп итд.. апи для работы с менеджером печати думаю найти можно в msdn.

Ответить

Номер ответа: 7
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #7 Добавлено: 06.08.07 02:07
Спасибо, HACKER, за обстоятельный ответ.
буду пробовать...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам