Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выбор принтера при печати формы

524
27 апреля 2004 года
BurAn
42 / / 20.05.2000
Привет всем...
Кто может помочь :???:

Задача: распечатать форму, предварительно выбрав принтер с помощю 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, хотя я выбрал другой :(
Заранее спасибо за все ответы :!!!:
266
27 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by BurAn
Привет всем...
Кто может помочь :???:

Задача: распечатать форму, предварительно выбрав принтер с помощю 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?

524
27 апреля 2004 года
BurAn
42 / / 20.05.2000
Цитата:
Originally posted by mhaturov

Изменяется притнтер пор умолчанию после указания его с CommonDialog?




Да, но распечатывается на принтере который был установлен "по умолчанию" до старта программы...

266
28 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by BurAn



Да, но распечатывается на принтере который был установлен "по умолчанию" до старта программы...


Если сменить вручную "умолчальный" принтер, то печатается на новый? Если нет, значит глюк "винды". Если да, то, скорее всего, перед печатью среда не успевает сменить принтер. Сделай задежку какую-нибудь, попробуй...

524
28 апреля 2004 года
BurAn
42 / / 20.05.2000
Цитата:
Originally posted by mhaturov

Если сменить вручную "умолчальный" принтер, то печатается на новый? Если нет, значит глюк "винды". Если да, то, скорее всего, перед печатью среда не успевает сменить принтер. Сделай задежку какую-нибудь, попробуй...



Да, если сменить в Винде принтер "по умолчанию", то печатается на новый принтер...
Сделал в программе задержку... Действительно, стало печатать на принтер, указанный в диалоге. Но возникает другая проблема: меняется принтер по умолчанию... Этого тоже не должно быть. Ведь если я печатаю из Word, например, на каком бы я принтере не распечатывал, принтер "по умолчанию" остается неизменным...

266
28 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by BurAn


Да, если сменить в Винде принтер "по умолчанию", то печатается на новый принтер...
Сделал в программе задержку... Действительно, стало печатать на принтер, указанный в диалоге. Но возникает другая проблема: меняется принтер по умолчанию... Этого тоже не должно быть. Ведь если я печатаю из Word, например, на каком бы я принтере не распечатывал, принтер "по умолчанию" остается неизменным...


К сожалению, это стандартный недостаток C.D. Единственное, что могу посоветовать, спроси у SergeySV про API, при помощи которых можно возвращать принтер после печати в исходное, либо направлять данные на принтер не по умолчанию... К сожлению, я бы рад помочь, но не успеваю сейчас... К тому же мне копаться долго прийдётся самому - я в API, к сожалению, не силён....

524
28 апреля 2004 года
BurAn
42 / / 20.05.2000
Цитата:
Originally posted by mhaturov

К сожалению, это стандартный недостаток C.D. Единственное, что могу посоветовать, спроси у SergeySV про API, при помощи которых можно возвращать принтер после печати в исходное, либо направлять данные на принтер не по умолчанию... К сожлению, я бы рад помочь, но не успеваю сейчас... К тому же мне копаться долго прийдётся самому - я в API, к сожалению, не силён....



Ок. Спасибо за советы... Будем искать... (с)
Чесно говоря я думал что меня заклюют за ламерский вопрос. Не мог я представить что это проблема пока не столкнулся.

258
28 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by BurAn


Ок. Спасибо за советы... Будем искать... (с)
Чесно говоря я думал что меня заклюют за ламерский вопрос. Не мог я представить что это проблема пока не столкнулся.



Если решите менять (а также узнавать) принтер по умолч., то вот здесь описание 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

266
28 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by BurAn

Чесно говоря я думал что меня заклюют за ламерский вопрос.


Да ладно, шутишь, что ли? Если "клевать" за вопросы, то зачем вообще форум тогда? Тут, по-моему, за впопросы никого никогда не высмеивают. Все сталкиваются когда-нибудь с такими ситуациями, что, вроде как всё просто, а на самом деле оказывается - о-го-го-го! Да и у всех бывают ситуации, когда на простых вещах "клинит" и без помощи не обойтись, хоть решение очевидно... Только моих постов тут такого типа - горы!:)

524
28 апреля 2004 года
BurAn
42 / / 20.05.2000
Спасибо всем за ответы и за поддержку...
Вот я чего нашел. Может кому нить пригодиться. (см. приаттачений файл)
524
07 мая 2004 года
BurAn
42 / / 20.05.2000
Всем привет.

Как оказалось это был не выход и моего заказчика такое решение не устраивает. Поэтому прошу помощи у всезнающего 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.

Но как это применить?
459
07 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by BurAn
Всем привет.

Как оказалось это был не выход и моего заказчика такое решение не устраивает. Поэтому прошу помощи у всезнающего 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

258
07 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by gacol


Пардон за сыроватый совет. PrintForm по хелпу печатает только на принтер по умолчанию.
Что если копировать форму в буфер (правда пока я не знаю как программно), а потом печатать с помощью Print Object.
У меня вот так проходило (с ручным копированием)
Printer.PaintPicture Clipboard.GetData, 0, 0



Тогда я так понимаю мы сосредотачиваемся на том, что бы запихнуть картинку с формы в буфер обмена? или этот вариант не устравивает?

524
08 мая 2004 года
BurAn
42 / / 20.05.2000
Цитата:
Originally posted by SergeySV


Тогда я так понимаю мы сосредотачиваемся на том, что бы запихнуть картинку с формы в буфер обмена? или этот вариант не устравивает?


Я думаю, что такой вариант прокатит. Задача, в принципе, получить изображение формы на заданном в стандартном диалоге принтере. А как - это уже не важно...
Так что, есть у кого-нибудь скрипт, запихивающий изображение формы в буфер обмена и вывод его на печать с использованием CommandDialog? :)

ЗЫЖ А я и не знал что PrintForm работает только с принтером "по умолчанию". Спасибо, буду знать.

258
08 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Надо посмотреть как работает Printer.PaintPicture может и без буфера обойдемся, а напрямую будем пихать картинку с формы.
459
11 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV
Надо посмотреть как работает Printer.PaintPicture может и без буфера обойдемся, а напрямую будем пихать картинку с формы.



Напрямую вряд ли. Как я понял так можно распечатать только картинку с формы.

459
11 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV
Надо посмотреть как работает Printer.PaintPicture может и без буфера обойдемся, а напрямую будем пихать картинку с формы.



В принципе можно не засовывать форму в буфер функцией API, а сымитировать нажатие клавиш Alt+PrnScr

12K
29 мая 2005 года
kvv77
2 / / 29.05.2005
Цитата:
Originally posted by BurAn
Всем привет.

Как оказалось это был не выход и моего заказчика такое решение не устраивает. Поэтому прошу помощи у всезнающего 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.

Но как это применить?



Не подскажешь, чем все закончилось? Столкнулся с аналогичной проблемой...

524
30 мая 2005 года
BurAn
42 / / 20.05.2000
Цитата:
Originally posted by kvv77
Не подскажешь, чем все закончилось? Столкнулся с аналогичной проблемой...



Сделал следующим способом:

MakePrintForm
defPrinter = GetDefaultPrinter
CommonDialog1.CancelError = True
CommonDialog1.ShowPrinter
Printer.Orientation = cdlLandscape
frmGraphPrint.PrintForm
SetDefaultPrinter (defPrinter)

Функции GetDefaultPrinter и SetDefaultPrinter написаны в отдельном модуле. См. приаттаченный файл.

12K
30 мая 2005 года
kvv77
2 / / 29.05.2005
А я кстати нашел интересную вещь:
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-ку не надо тащить...

Но за ответ спасибо, пригодится...
524
30 мая 2005 года
BurAn
42 / / 20.05.2000
Цитата:
Originally posted by kvv77
А я кстати нашел интересную вещь:
http://www.vbrussian.com/Controls.asp?ID=19

Если использовать его, то код получается такой :
Dim CdlgEx1 As New CdlgEx ' описываем объект класса

И что интересно - через этот класс форма печатается не на принтер по умолчанию и принтер по умолчанию не меняется... Да и лишнюю dll-ку не надо тащить...

Но за ответ спасибо, пригодится...




Протестировал. Да, действительно, работает идеально. Спасибо Аркадию Оловянникову и тебе за совет. Запомнил на будущее.
А по поводу отлова Cancel то возможно это можно сделать в Public Sub ShowPrinter с помощью переменной RetValue. Если нажата кнопка Cancel, то RetValue = 0, в другом случае 1.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог