Не пойму как отправить печать на конкретный принтер?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Не пойму как отправить печать на конкретный принтер?

Сообщение kibernetics » 04.07.2007 (Ср) 17:39

Использую для показа диалога выбора принтера пару АПИ-шек.
Код: Выделить всё
Private Declare Function PrintDialog Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG_TYPE) As Long

и функцию:
Код: Выделить всё
Public Function ShowPrinter(frmOwner As Form, Optional PrintFlags As Long)
    '-> Code by Donald Grover
    Dim PrintDlg As PRINTDLG_TYPE
    Dim DevMode As DEVMODE_TYPE
    Dim DevName As DEVNAMES_TYPE

    Dim lpDevMode As Long, lpDevName As Long
    Dim bReturn As Integer
    Dim objPrinter As Printer, NewPrinterName As String

    ' Use PrintDialog to get the handle to a memory
    ' block with a DevMode and DevName structures

    PrintDlg.lStructSize = Len(PrintDlg)
    PrintDlg.hwndOwner = frmOwner.hwnd

    PrintDlg.Flags = PrintFlags
    On Error Resume Next
    'Set the current orientation and duplex setting
    DevMode.dmDeviceName = Printer.DeviceName
    DevMode.dmSize = Len(DevMode)
    DevMode.dmFields = DM_ORIENTATION Or DM_DUPLEX
    DevMode.dmPaperWidth = Printer.Width
    DevMode.dmOrientation = Printer.Orientation
    DevMode.dmPaperSize = Printer.PaperSize
    DevMode.dmDuplex = Printer.Duplex
    On Error GoTo 0

    'Allocate memory for the initialization hDevMode structure
    'and copy the settings gathered above into this memory
    PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevMode))
    lpDevMode = GlobalLock(PrintDlg.hDevMode)
    If lpDevMode > 0 Then
        CopyMemory ByVal lpDevMode, DevMode, Len(DevMode)
        bReturn = GlobalUnlock(PrintDlg.hDevMode)
    End If

    'Set the current driver, device, and port name strings
    With DevName
        .wDriverOffset = 8
        .wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
        .wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
        .wDefault = 0
    End With

    With Printer
        DevName.extra = .DriverName & Chr(0) & .DeviceName & Chr(0) & .Port & Chr(0)
    End With

    'Allocate memory for the initial hDevName structure
    'and copy the settings gathered above into this memory
    PrintDlg.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DevName))
    lpDevName = GlobalLock(PrintDlg.hDevNames)
    If lpDevName > 0 Then
        CopyMemory ByVal lpDevName, DevName, Len(DevName)
        bReturn = GlobalUnlock(lpDevName)
    End If

    'Call the print dialog up and let the user make changes
    If PrintDialog(PrintDlg) <> 0 Then

        'First get the DevName structure.
        lpDevName = GlobalLock(PrintDlg.hDevNames)
        CopyMemory DevName, ByVal lpDevName, 45
        bReturn = GlobalUnlock(lpDevName)
        GlobalFree PrintDlg.hDevNames

        'Next get the DevMode structure and set the printer
        'properties appropriately
        lpDevMode = GlobalLock(PrintDlg.hDevMode)
        CopyMemory DevMode, ByVal lpDevMode, Len(DevMode)
        bReturn = GlobalUnlock(PrintDlg.hDevMode)
        GlobalFree PrintDlg.hDevMode
        NewPrinterName = UCase$(Left(DevMode.dmDeviceName, InStr(DevMode.dmDeviceName, Chr$(0)) - 1))
        If Printer.DeviceName <> NewPrinterName Then
            For Each objPrinter In Printers
                If UCase$(objPrinter.DeviceName) = NewPrinterName Then
                    Set Printer = objPrinter
                    'set printer toolbar name at this point
                End If
            Next
        End If

        On Error Resume Next
        'Set printer object properties according to selections made
        'by user
        Printer.Copies = DevMode.dmCopies
        Printer.Duplex = DevMode.dmDuplex
        Printer.Orientation = DevMode.dmOrientation
        Printer.PaperSize = DevMode.dmPaperSize
        Printer.PrintQuality = DevMode.dmPrintQuality
        Printer.ColorMode = DevMode.dmColor
        Printer.PaperBin = DevMode.dmDefaultSource
        On Error GoTo 0
    End If
End Function


так вот не могу понять, что она должна возвращать, чтоб я печать отправил именно на выбранный принтер?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.07.2007 (Ср) 18:37

Ничего не должна возвращать. Юзай объект Printer послы вызова этой функции. И переделай её обратно в Sub.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 04.07.2007 (Ср) 19:26

а, тоесть, это работает как принтерный переключатель чтоли?
типа, выбрался принтер, произвелась печать....

П.С. эта процедура не изменяет случайно дефолтный принтер? по выходу приложения, принтер так и останется который был по умолчанию, или нужно восстанавливать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.07.2007 (Ср) 19:33

Меняет, как раз:
Код: Выделить всё
                If UCase$(objPrinter.DeviceName) = NewPrinterName Then
                    Set Printer = objPrinter /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
                    'set printer toolbar name at this point
                End If
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.07.2007 (Чт) 12:05

Хакер, всё равно печатает на дефолтный принтер.
У меня в событии кнопки сделано так:
Код: Выделить всё
ShowPrinter Me
gPrintListView LvwName, "text"


т.е. я выбрал принтер, а потом вызываю печать:

Код: Выделить всё
Function gPrintListView(ByRef pobjListView As ListView, pstrHeading As String) As Boolean
    ...

    dblXScale = (Printer.Width * 0.9) / lngX
    dblYScale = Printer.Height / pobjListView.Height
   
    lngLeft = (Printer.Width - (Printer.Width * 0.95)) / 2
   
    sngFontSize = Printer.Font.Size
   
        Printer.Font.Size = 12
        Printer.CurrentX = (Printer.Width / 2) - (Printer.TextWidth(pstrHeading) / 2)
        Printer.Font.Underline = True
        Printer.Print pstrHeading
        Printer.Font.Underline = False
        Printer.Font.Size = sngFontSize
        lngTop = Printer.CurrentY + Printer.CurrentY

и т.д. так вот в этой функции всё равно печать идёт на дефолтный принтер. В каком же месте нужно вызывать gPrintListView чтобы печатать именно на выбранный принтер?

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 05.07.2007 (Чт) 14:12

Код: Выделить всё
If UCase$(objPrinter.DeviceName) = NewPrinterName Then ' поставь точку останова, и поймешь
Set Printer = objPrinter... ' что это присвоение не выполняется


возможно, строка DEVMODE.dmDeviceName содержит что-то не то.
Иначе, а я проверил пример, печать идет на нужный принтер.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.07.2007 (Чт) 14:14

да, есть такие проблемы. вот этот код попробуй:
Вложения
CODE_UPLOAD260212281999.zip
(5.86 Кб) Скачиваний: 109

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.07.2007 (Чт) 15:39

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

хрень какая-то...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 15:40

получается что, вначале нужно выставить выбранный принтер в дефолт, а потом только отправлять на печать???


Естественно, блин :x
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.07.2007 (Чт) 16:06

Хакер писал(а):
получается что, вначале нужно выставить выбранный принтер в дефолт, а потом только отправлять на печать???


Естественно, блин :x

Угу, и тот, кто в это время будет печатать из соседней проги, здорово удивится....
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 16:08

tyomitch
У тебя есть альтернатива для данного случая?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.07.2007 (Чт) 16:20

CreateDC с именем принтера и отрисовка туда.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 16:23

У тебя есть альтернатива для данного случая?

Можешь читать как "для данного кода".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.07.2007 (Чт) 16:28

Printers(1).Print "test"
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 16:40

Ещё один :)

Функцию ShowPrinter менять нельзя. Не потому что есть какие-то препядсвтия. Потому что она дана по условию, такой, какая-она есть.

Меня спросили, нужно ли вызывать ShowPrinter до вывода на печать. Я ответил - да, нужно. Разве я не прав в этом?

А то что сам способ печати неверный - это уже другой вопрос.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.07.2007 (Чт) 17:43

хорошо, а если у меня будет hDC выбранного принтера, могу я как-то адресовать печать именно принтеру по hDC?

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.07.2007 (Чт) 18:32

блин, пацаны, реально кто-нить сталкивался с этим вопросом?
как адресовать печать всё-таки?
или с моим этим долбанным кодом ничерта не выйдет?

можете разжевать более подробнее?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 18:44

Нет такого понятия "адресовать" печать. Есть понятие "печатать на определённом принтере". Бери и печатай. Что не выходит то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 18:47

tyomitch
Кстати, в MSDN написано, что Printer - дефолтный принтер не в системе а в приложении. Так что придирка необоснованная.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 05.07.2007 (Чт) 20:28

Твоя функция глючная, но рабочая, чего нервы себе трепать.
Вот в данный момент у меня в системе 3 принтера, правда все виртуальные, но какая разница.
Так, например, принтер "Microsoft Office Document Image Writer"
функция не выбирает, т.к. длина строки больше чем
Public Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
.....
Остальные выбираются как нужно.

Кстати, какие у тебя объявления типов?

P.S. Длина типов вычисляется через LenB.
Последний раз редактировалось EUGY 05.07.2007 (Чт) 20:39, всего редактировалось 1 раз.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.07.2007 (Чт) 20:34

Хакер писал(а):Бери и печатай

да я бы с удовольствием!

Хакер писал(а):Что не выходит то?

Не выходит печатать именно на выбранном в диалоге выбора принтере...

в каком месте следует вызывать gPrintListView, чтобы печать пошла именно на выбранный принтер, и при этом дефолтный принтер в системе не изменялся...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.07.2007 (Чт) 20:39

Этот код не меняет дефолтный принтер в системе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.07.2007 (Чт) 21:07

да я уже понял, что этот код вообще ничего не делает из того, что мне нужно ...
а мне нужно всего-то делов - отправить на печать в принтер, который выбран в диалоге выбора.

как же интересно говорить ребусами всё-таки...

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 05.07.2007 (Чт) 21:24

Похоже автор не читает, что написано другими.
Поэтому, наверное, можно здесь писать что угодно.

Set Printer = Printers(0)
Printer.Print "qwerty0"
Printer.EndDoc

Set Printer = Printers(1)
Printer.Print "qwerty1"
Printer.EndDoc

Set Printer = Printers(2)
Printer.Print "qwerty2"
Printer.EndDoc

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.07.2007 (Пт) 9:43

EUGY
дружище, ...
скажи, но где в твоём примере диалог выбора принтера?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.07.2007 (Пт) 9:58

kibernetics, а ты что, не можешь самостоятельно синтезировать решение из двух компонентов?
Код: Выделить всё
For Each objPrinter In Printers
  If objPrinter.DeviceName = "HP LJ 9999" Then Exit For
Next objPrinter
If Not (objPrinter Is Nothing) Then
  objPrinter.Print "test"
  objPrinter.EndDoc
End If
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.07.2007 (Пт) 10:23

alibek
так дело в том, что как только я в диалоге выбора выбираю принтер и нажимаю печать, то всё равно стоит "MICROSOFT OFFICE DOCUMENT IMAG в Set Printer = objPrinter...
хотя выбираю я совсем другой принтер - WORKCENTRE M123...

я бы хотел просто напечать на WORKCENTRE M123, но всегда печатается на MICROSOFT OFFICE DOCUMENT IMAGЕ

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 06.07.2007 (Пт) 21:24

По моему он издевается! Или таки да, не умеет читать. Печально!:(
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 88

    TopList