Выбор принтера при печати формы
Кто может помочь :???:
Задача: распечатать форму, предварительно выбрав принтер с помощю CommandDialog (ShowPrinter)...
Private Sub cmdPrint_Click()
On Error GoTo Errorhandler
Printer.Orientation = cdlLandscape
frmGraphPrint.ScaleMode = 6
frmGraphPrint.ScaleLeft = 20
CommonDialog1.CancelError = True
MakePrintForm
CommonDialog1.ShowPrinter
<------ Здесь должно быть что то еще
frmForPrint.PrintForm
Exit Sub
Errorhandler:
If Err.Number = 32755 Then 'CANCEL Exit Sub
Else
MsgBox Err.Number & " " & err.Description
End If
End Sub
У меня форма распечативается на default-printer, хотя я выбрал другой :(
Заранее спасибо за все ответы :!!!:
Привет всем...
Кто может помочь :???:
Задача: распечатать форму, предварительно выбрав принтер с помощю CommandDialog (ShowPrinter)...
Private Sub cmdPrint_Click()
On Error GoTo Errorhandler
Printer.Orientation = cdlLandscape
frmGraphPrint.ScaleMode = 6
frmGraphPrint.ScaleLeft = 20
CommonDialog1.CancelError = True
MakePrintForm
CommonDialog1.ShowPrinter
<------ Здесь должно быть что то еще
frmForPrint.PrintForm
Exit Sub
Errorhandler:
If Err.Number = 32755 Then 'CANCEL Exit Sub
Else
MsgBox Err.Number & " " & err.Description
End If
End Sub
У меня форма распечативается на default-printer, хотя я выбрал другой :(
Заранее спасибо за все ответы :!!!:
Изменяется притнтер пор умолчанию после указания его с CommonDialog?
Изменяется притнтер пор умолчанию после указания его с CommonDialog?
Да, но распечатывается на принтере который был установлен "по умолчанию" до старта программы...
Да, но распечатывается на принтере который был установлен "по умолчанию" до старта программы...
Если сменить вручную "умолчальный" принтер, то печатается на новый? Если нет, значит глюк "винды". Если да, то, скорее всего, перед печатью среда не успевает сменить принтер. Сделай задежку какую-нибудь, попробуй...
Если сменить вручную "умолчальный" принтер, то печатается на новый? Если нет, значит глюк "винды". Если да, то, скорее всего, перед печатью среда не успевает сменить принтер. Сделай задежку какую-нибудь, попробуй...
Да, если сменить в Винде принтер "по умолчанию", то печатается на новый принтер...
Сделал в программе задержку... Действительно, стало печатать на принтер, указанный в диалоге. Но возникает другая проблема: меняется принтер по умолчанию... Этого тоже не должно быть. Ведь если я печатаю из Word, например, на каком бы я принтере не распечатывал, принтер "по умолчанию" остается неизменным...
Да, если сменить в Винде принтер "по умолчанию", то печатается на новый принтер...
Сделал в программе задержку... Действительно, стало печатать на принтер, указанный в диалоге. Но возникает другая проблема: меняется принтер по умолчанию... Этого тоже не должно быть. Ведь если я печатаю из Word, например, на каком бы я принтере не распечатывал, принтер "по умолчанию" остается неизменным...
К сожалению, это стандартный недостаток C.D. Единственное, что могу посоветовать, спроси у SergeySV про API, при помощи которых можно возвращать принтер после печати в исходное, либо направлять данные на принтер не по умолчанию... К сожлению, я бы рад помочь, но не успеваю сейчас... К тому же мне копаться долго прийдётся самому - я в API, к сожалению, не силён....
К сожалению, это стандартный недостаток C.D. Единственное, что могу посоветовать, спроси у SergeySV про API, при помощи которых можно возвращать принтер после печати в исходное, либо направлять данные на принтер не по умолчанию... К сожлению, я бы рад помочь, но не успеваю сейчас... К тому же мне копаться долго прийдётся самому - я в API, к сожалению, не силён....
Ок. Спасибо за советы... Будем искать... (с)
Чесно говоря я думал что меня заклюют за ламерский вопрос. Не мог я представить что это проблема пока не столкнулся.
Ок. Спасибо за советы... Будем искать... (с)
Чесно говоря я думал что меня заклюют за ламерский вопрос. Не мог я представить что это проблема пока не столкнулся.
Если решите менять (а также узнавать) принтер по умолч., то вот здесь описание API функции (SetDefaultPrinter): http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_027m.asp
единственно что нехорошо, появилась она токо с Win2000
А тут вариант универсальной функции из MSDN которую программисты microsoft накатали: http://support.microsoft.com/default.aspx?scid=kb;en-us;246772
Чесно говоря я думал что меня заклюют за ламерский вопрос.
Да ладно, шутишь, что ли? Если "клевать" за вопросы, то зачем вообще форум тогда? Тут, по-моему, за впопросы никого никогда не высмеивают. Все сталкиваются когда-нибудь с такими ситуациями, что, вроде как всё просто, а на самом деле оказывается - о-го-го-го! Да и у всех бывают ситуации, когда на простых вещах "клинит" и без помощи не обойтись, хоть решение очевидно... Только моих постов тут такого типа - горы!:)
Вот я чего нашел. Может кому нить пригодиться. (см. приаттачений файл)
Как оказалось это был не выход и моего заказчика такое решение не устраивает. Поэтому прошу помощи у всезнающего All.
Еще раз повторюсь: [COLOR=red]надо распечатать форму на выбранный в Command Dialog принтер.[/COLOR]
Похоже что это должно решаться с помощью флагов и свойства hDC . Вот что есть в MSDN (Flags Property (Print Dialog)):
[SIZE=3]cdlPDReturnDC [/SIZE] - Returns adevice context for the printer selection made in the dialog box. The device context is returned in the dialog box's hDC property.
или
[SIZE=3]cdlPDReturnIC [/SIZE] - Returns an information context for the printer selection made in the dialog box. An information context provides a fast way to get information about the device without creating a device context. The information context is returned in the dialog box's hDC property.
Но как это применить?
Всем привет.
Как оказалось это был не выход и моего заказчика такое решение не устраивает. Поэтому прошу помощи у всезнающего All.
Еще раз повторюсь: [COLOR=red]надо распечатать форму на выбранный в Command Dialog принтер.[/COLOR]
Похоже что это должно решаться с помощью флагов и свойства hDC . Вот что есть в MSDN (Flags Property (Print Dialog)):
[SIZE=3]cdlPDReturnDC [/SIZE] - Returns adevice context for the printer selection made in the dialog box. The device context is returned in the dialog box's hDC property.
или
[SIZE=3]cdlPDReturnIC [/SIZE] - Returns an information context for the printer selection made in the dialog box. An information context provides a fast way to get information about the device without creating a device context. The information context is returned in the dialog box's hDC property.
Но как это применить?
Пардон за сыроватый совет. PrintForm по хелпу печатает только на принтер по умолчанию.
Что если копировать форму в буфер (правда пока я не знаю как программно), а потом печатать с помощью Print Object.
У меня вот так проходило (с ручным копированием)
Printer.PaintPicture Clipboard.GetData, 0, 0
Пардон за сыроватый совет. PrintForm по хелпу печатает только на принтер по умолчанию.
Что если копировать форму в буфер (правда пока я не знаю как программно), а потом печатать с помощью Print Object.
У меня вот так проходило (с ручным копированием)
Printer.PaintPicture Clipboard.GetData, 0, 0
Тогда я так понимаю мы сосредотачиваемся на том, что бы запихнуть картинку с формы в буфер обмена? или этот вариант не устравивает?
Тогда я так понимаю мы сосредотачиваемся на том, что бы запихнуть картинку с формы в буфер обмена? или этот вариант не устравивает?
Я думаю, что такой вариант прокатит. Задача, в принципе, получить изображение формы на заданном в стандартном диалоге принтере. А как - это уже не важно...
Так что, есть у кого-нибудь скрипт, запихивающий изображение формы в буфер обмена и вывод его на печать с использованием CommandDialog? :)
ЗЫЖ А я и не знал что PrintForm работает только с принтером "по умолчанию". Спасибо, буду знать.
Надо посмотреть как работает Printer.PaintPicture может и без буфера обойдемся, а напрямую будем пихать картинку с формы.
Напрямую вряд ли. Как я понял так можно распечатать только картинку с формы.
Надо посмотреть как работает Printer.PaintPicture может и без буфера обойдемся, а напрямую будем пихать картинку с формы.
В принципе можно не засовывать форму в буфер функцией API, а сымитировать нажатие клавиш Alt+PrnScr
Всем привет.
Как оказалось это был не выход и моего заказчика такое решение не устраивает. Поэтому прошу помощи у всезнающего All.
Еще раз повторюсь: [COLOR=red]надо распечатать форму на выбранный в Command Dialog принтер.[/COLOR]
Похоже что это должно решаться с помощью флагов и свойства hDC . Вот что есть в MSDN (Flags Property (Print Dialog)):
[SIZE=3]cdlPDReturnDC [/SIZE] - Returns adevice context for the printer selection made in the dialog box. The device context is returned in the dialog box's hDC property.
или
[SIZE=3]cdlPDReturnIC [/SIZE] - Returns an information context for the printer selection made in the dialog box. An information context provides a fast way to get information about the device without creating a device context. The information context is returned in the dialog box's hDC property.
Но как это применить?
Не подскажешь, чем все закончилось? Столкнулся с аналогичной проблемой...
Не подскажешь, чем все закончилось? Столкнулся с аналогичной проблемой...
Сделал следующим способом:
MakePrintForm
defPrinter = GetDefaultPrinter
CommonDialog1.CancelError = True
CommonDialog1.ShowPrinter
Printer.Orientation = cdlLandscape
frmGraphPrint.PrintForm
SetDefaultPrinter (defPrinter)
Функции GetDefaultPrinter и SetDefaultPrinter написаны в отдельном модуле. См. приаттаченный файл.
http://www.vbrussian.com/Controls.asp?ID=19
Если использовать его, то код получается такой :
Dim CdlgEx1 As New CdlgEx ' описываем объект класса
'Сам процесс печати:
With CdlgEx1
.CancelError = True
.ShowPrinter
If Label3.Caption = 1 Then ' вот тут я не нашел как культурно сделать проверку на Cancel, сделал "костыль"
Form2.PrintForm
End If
End With
И что интересно - через этот класс форма печатается не на принтер по умолчанию и принтер по умолчанию не меняется... Да и лишнюю dll-ку не надо тащить...
Но за ответ спасибо, пригодится...
А я кстати нашел интересную вещь:
http://www.vbrussian.com/Controls.asp?ID=19
Если использовать его, то код получается такой :
Dim CdlgEx1 As New CdlgEx ' описываем объект класса
И что интересно - через этот класс форма печатается не на принтер по умолчанию и принтер по умолчанию не меняется... Да и лишнюю dll-ку не надо тащить...
Но за ответ спасибо, пригодится...
Протестировал. Да, действительно, работает идеально. Спасибо Аркадию Оловянникову и тебе за совет. Запомнил на будущее.
А по поводу отлова Cancel то возможно это можно сделать в Public Sub ShowPrinter с помощью переменной RetValue. Если нажата кнопка Cancel, то RetValue = 0, в другом случае 1.