Выбор принтера?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alex_new_2030
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 20.02.2003 (Чт) 8:00
Откуда: Kazakhstan

Выбор принтера?

Сообщение Alex_new_2030 » 19.06.2003 (Чт) 6:05

У меня в сети есть несколько принтеров. Для печати я использую объект PRINTER. Он у меня использует только принетр по умолчанию. Как можно вывести список установленных принтеров и печатать через любого из них?

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 19.06.2003 (Чт) 8:22

Private Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, _
Source As Any, _
ByVal Length As Long)

Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" ( _
pPrintdlg As PrintDlg) As Long

Private Declare Function GlobalLock Lib "kernel32" ( _
ByVal hMem As Long) As Long

Private Declare Function GlobalAlloc Lib "kernel32" ( _
ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long

Private Declare Function GlobalUnlock Lib "kernel32" ( _
ByVal hMem As Long) As Long

Private Declare Function GlobalFree Lib "kernel32" ( _
ByVal hMem As Long) As Long

Private Type PrintDlg
lStructSize As Long
hwndOwner As Long
hDevMode As Long
hDevNames As Long
hdc As Long
flags As Long
nFromPage As Integer
nToPage As Integer
nMinPage As Integer
nMaxPage As Integer
nCopies As Integer
hInstance As Long
lCustData As Long
lpfnPrintHook As Long
lpfnSetupHook As Long
lpPrintTemplateName As String
lpSetupTemplateName As String
hPrintTemplate As Long
hSetupTemplate As Long
End Type

Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32

Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

Public PrinterhDC As Long
Public PrinterName As String
Public Copies As Integer
Public PageOrientation As Byte

Private Const PD_RETURNDC = &H100
Private Const PD_USEDEVMODECOPIESANDCOLLATE = &H40000
Private Const PD_DISABLEPRINTTOFILE = &H80000
Private Const PD_NOSELECTION = &H4
Private Const DM_COPIES = &H100&
Private Const DM_ORIENTATION = &H1&
Private Const GMEM_MOVEABLE = &H2

Public Function ShowDlgPrint() As Boolean
Dim lResult As Long
Dim PrintShow As PrintDlg
Dim PrinterMode As DEVMODE
Dim hPointer As Long
Dim p As Printer
Dim strTempPrinterName As String

PrintShow.lStructSize = Len(PrintShow)
PrintShow.hDevMode = GlobalAlloc(GMEM_MOVEABLE, _
Len(PrinterMode))

PrintShow.hDevNames = 0
PrintShow.nCopies = 1
PrintShow.flags = PD_RETURNDC Or PD_DISABLEPRINTTOFILE Or _
PD_NOSELECTION

PrinterMode.dmSize = Len(PrinterMode)
PrinterMode.dmFields = DM_COPIES Or DM_ORIENTATION

lResult = PrintDlg(PrintShow)

If lResult = 0 Then
ShowDlgPrint = False
Exit Function
End If

PrinterhDC = PrintShow.hdc

hPointer = GlobalLock(PrintShow.hDevMode)

CopyMemory PrinterMode, _
ByVal hPointer, ByVal Len(PrinterMode)

PrinterName = Left$(PrinterMode.dmDeviceName, _
InStr(PrinterMode.dmDeviceName, _
Chr$(0)) - 1)

Copies = PrinterMode.dmCopies

PageOrientation = PrinterMode.dmOrientation

Call GlobalUnlock(PrintShow.hDevMode)

Call GlobalFree(PrintShow.hDevMode)

For Each p In Printers
With p
strTempPrinterName = .DeviceName
If strTempPrinterName = PrinterName Then
Set Printer = p
Printer.ScaleMode = vbMillimeters
Printer.Orientation = PageOrientation
Printer.Copies = Copies
Exit For
End If
End With
Next

ShowDlgPrint = True
End Function

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 19.06.2003 (Чт) 8:41

Есть вариант по проще:
для получения списка принтеров:

Dim i As Printer
Dim k As String
Dim kk As Integer

k = Printer.DeviceName 'запомнить имя принтера по умолчанию
On Error GoTo ErPrint
For Each i In Printers
ListPrinter.AddItem i.DeviceName 'загнать все принтера в список
Next
On Error GoTo 0

'перебрать их еще раз и в списке установить принтер по умолчанию
For kk = 0 To ListPrinter.ListCount - 1
If ListPrinter.List(kk) = k Then
ListPrinter.Text = ListPrinter.List(kk)
Exit For
End If
Next

'=====================================
'перед печатью

Dim k As Printer

'Установить принтер из списка - текущим
For Each k In Printers
If k.DeviceName = ListPrinter.Text Then
Set Printer = k
Exit For
End If
Next
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 27.10.2005 (Чт) 19:41

Код: Выделить всё
k = Printer.DeviceName 'запомнить имя принтера по умолчанию


Ругается на "Printer", пишет: Invalid outside procedure.

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 28.10.2005 (Пт) 2:27

почитай если интерестно ето:
Вложения
API функция GetPrinter.rar
(6.74 Кб) Скачиваний: 55
API функция GetPrinter.rar
(6.74 Кб) Скачиваний: 50

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 28.10.2005 (Пт) 2:27

нечё шо так много получилось? 8)

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 30.10.2005 (Вс) 22:18

Как сделать, чтобы принтер по умолчанию попадал на первое место в списке?

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 31.10.2005 (Пн) 20:05

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

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

Сообщение alibek » 01.11.2005 (Вт) 9:20

А вопрос в чем?
Lasciate ogni speranza, voi ch'entrate.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 01.11.2005 (Вт) 15:30

Как сделать, чтобы принтер по умолчанию попадал на первое место в списке?


По коду от kif.

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

Сообщение alibek » 01.11.2005 (Вт) 15:33

Добавляешь принтер по умолчанию, затем добавляешь все остальные. Это помоему очевидно.
Lasciate ogni speranza, voi ch'entrate.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 02.11.2005 (Ср) 11:43

Если так сделать, то в списке появляется 3 одинаковых принтера.

Вот код:
Код: Выделить всё
Private Sub Form_Load()
k = Printer.DeviceName 'запомнить имя принтера по умолчанию
For Each i In Printers
Combo1.AddItem (k)
Combo1.AddItem i.DeviceName 'загнать все принтера в список
Next
On Error GoTo 0

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

Сообщение alibek » 02.11.2005 (Ср) 11:52

Код: Выделить всё
Private Sub Form_Load
...
DP = Printer.DeviceName
Combo1.AddItem DP
For Each prn In Printers
  If prn.DeviceName <> DP Then Combo1.AddItem prn.DeviceName
Next prn
End Sub
Lasciate ogni speranza, voi ch'entrate.

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 02.11.2005 (Ср) 15:53

Спасибо! :D

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 03.11.2005 (Чт) 19:46

Ошибка 76 при повторной печати, того же документа.

Вот код:

Код: Выделить всё
Private Sub Command1_Click()
'перед печатью
Dim k As Printer

'Установить принтер из списка - текущим
For Each k In Printers
If k.DeviceName = Combo1.Text Then
Set Printer = k
Exit For
End If
Next

AllText = ""
Open "Data\123.txt" For Input As #1
Do While Not EOF(1)
Input #1, st
AllText = AllText + st
Loop
Close #1

Printer.Print AllText
Printer.EndDoc

End Sub


Помогите!

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 04.11.2005 (Пт) 23:14

Как исправить ошибку "Run-time error '76': Path not found"? И почему она появляется?

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 04.11.2005 (Пт) 23:47

Неужели с английским настолько туго?
Ну переведи тогда на сайте www.translate.ru (к примеру, не реклама :)) фразу "path not found" и ты сразу же поймешь, почему она (ошибка) появляется.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 05.11.2005 (Сб) 0:57

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

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.11.2005 (Сб) 1:12

Rodos Ну если исходник небольшой - лепи, гляну. А если большой, то уже поздно и мне влом :) Потому что код
Код: Выделить всё
Private Sub Command1_Click()
    Dim AllText As String, st As String

    AllText = ""
    Open "C:\123.txt" For Input As #1
    Do While Not EOF(1)
        Input #1, st
        AllText = AllText + st
    Loop
    Close #1

    Printer.Print AllText
    Printer.EndDoc
End Sub
два раза отправляет на принтер документ без всяких ошибок.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 05.11.2005 (Сб) 1:24

Вот:
Код: Выделить всё
Option Explicit

Dim i As Printer
Dim k As String
Dim kk As Integer
Dim AllText As String
Dim st As String

Private Sub Form_Load()
k = Printer.DeviceName 'запомнить имя принтера по умолчанию
Combo1.AddItem k
For Each i In Printers
If i.DeviceName <> k Then Combo1.AddItem i.DeviceName 'загнать все принтера в список
Next
On Error GoTo 0

'перебрать их еще раз и в списке установить принтер по умолчанию
For kk = 0 To Combo1.ListCount - 1
If Combo1.List(kk) = k Then
Combo1.Text = Combo1.List(kk)
Exit For
End If
Next

Printer.FontName = "Times New Roman"
Printer.FontSize = 12
End Sub

Private Sub Command1_Click()
'перед печатью
Dim k As Printer

'Установить принтер из списка - текущим
For Each k In Printers
If k.DeviceName = Combo1.Text Then
Set Printer = k
Exit For
End If
Next

AllText = ""
Open "Data\123.txt" For Input As #1
Do While Not EOF(1)
Input #1, st
AllText = AllText + st
Printer.Print AllText
Printer.EndDoc
Loop
Close #1

End Sub

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.11.2005 (Сб) 1:37

Ну все работает. Аж три раза послал :). Может ты между первой и второй печатью удалил документ? Потому как ругаться он будет, если файл твой найти не может.
Последний раз редактировалось vvs_adm 05.11.2005 (Сб) 1:39, всего редактировалось 1 раз.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 05.11.2005 (Сб) 1:37

2 Rodos

Почему путь к файлу относительный, а рабочая папка не указана?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.11.2005 (Сб) 1:41

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

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 05.11.2005 (Сб) 1:52

Все, понял в чем дело. У меня тонер в принтере кончился и я все время посылал печать на виртуальный "Microsoft Office Document Image Writer" (думал он полностью заменяет физический), при повторной печати на него выдается эта ошибка. При печати на настоящий все нормально! Как же я сразу не догадался проверить :oops: .

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.11.2005 (Сб) 2:11

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

Rodos
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 10.10.2005 (Пн) 22:07
Откуда: Москва

Сообщение Rodos » 05.11.2005 (Сб) 2:59

Код: Выделить всё
Open "Data\123.txt" For Input As #1


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 153

    TopList