такой обработчик ошибок почему-то работает несколько странно...
На компе друга (WinXP) при отсутствии принтера - был вызван МАСТЕР ОТПРАВКИ ФАКСОВ...
на моём - при отключенном принтере ничего не сообщает, но помещает задание в очередь на печать...
Друзья!
Как правильно обработать отсутствие принтера, или если можно - определить, включен или нет.
семейство printers имеет к этому отношение?
Спастбо!
Private Sub Form_Load()
On Error GoTo err1
Label1.Caption = Printer.DeviceName
Exit Sub
err1:
Label1.Caption = "Принтер в системе не установлен"
End Sub
Спасибо за помощь!
Первый вариант приводит к ошибке, видимо из за того, что нельзя прочитать имя несуществующего принтера...
вариант 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
Но так тоже обработчиком ошибок не обрабатывается... выдернул кабель принтера, а документ встал в очередь на печать и тишина!
А хочтеся так:
"Включите принтер!"
"Загрузите бумагу..."
и т.д.
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
код работает только если в системе не установлен принтер физически. Если же он установлен, но выключен - то никаких видимых проблем нет... а есть документ ожидающий очередь на печать. поэтому:
MsgBox "Ошибка № " & Err.Number & Err.Description
не происходит.
HACKER - может Вы знаете, как через API
Всё правильно, печатаешь не принтером же, а драйвером А драйвер всегда готов к работе, а отличии от принтера. От этого документы и складываются в очередь. Лезть надо глубже, в команды опроса принтера, или опросы порта к которому он подключен. Т.к. стандартных средств (win api например) вроде бы нету для проверки принтера на готовность. В любом случае накатывается масса проблем: если и есть апи от производителей принтера - получаем зависимость от модели принтера. Работать с портами на низком уровне в NT системах по нормальному не получится. Писать драйвер который будет работать в ring-0 с портами, тоже занятие не из приятных. Так что врядли оно того стоит. Единственное что приходит в голову, собразить что-то вроде таймаута печати. Менеджер печети в винде, сохраняет же дату+время помощение документа в очередь, от этого можно попробовать оттолкнуться. Например если документ висит в очереди больше минуты - таймаут, ругаемся, удаляем документ из очереди итп итд.. апи для работы с менеджером печати думаю найти можно в msdn.