Настройка принтера

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

Настройка принтера

Сообщение Flo » 28.10.2004 (Чт) 17:44

Почему-то код
Код: Выделить всё
On Error GoTo CDERR
With CommonDialog1
    .CancelError = True

    .flags = cdlPDPrintSetup Or cdlPDReturnIC
     .PrinterDefault = True
    .ShowPrinter
     
End With

не меняет настройки дефолтного принтера, хотя вроде должен бы был или нет?? :shock:
если вызвать CommonDialog снова то в себе он сделанные настройки помнит, но объект Printer вызывает с дефолтными.. :(
Вопрос в том как то, что он помнит (размер бумаги, ориентация и т.п.) достать и на объект Printer послать?
Если возможно, подскажите, пожалуйста.

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 31.10.2004 (Вс) 21:23

И так никто ничего и не сказал. Хоть ткните меня во что-нибудь носом, где поискать подскажите, пожалуйста :(
Вопрос в том, как при помощи Common Dialog передать выбранные пользователем настройки принтера (формат бумаги, ориенацию и т.п.) на объект Printer.
Приблизительно представляю, что есть какое-то такое hWnd, а еще есть hDC, которое тоже что-то возвращает, но как-то подступиться ко всему этому не знаю с какой стороны. Может у кого-нибудь пример есть, или его кто-то где-то видел? :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.10.2004 (Вс) 21:41

printer.property1=commondialog.property1
printer.property2=commondialog.property2
printer.property3=commondialog.property3
et cetera...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 01.11.2004 (Пн) 16:12

Это все конечно так... Только вот у Сommon Dialog'a нет свойства отвечающего за размер бумаги... По крайней мере по моим данным. И что с этим можно поделать? :?

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 02.11.2004 (Вт) 18:09

Есть такая API - GetPrinter. Она может возвращать данные принтера.
Например такую структуру:
Код: Выделить всё
Private Type PRINTER_INFO_2
   pServerName As String
   pPrinterName As String
   pShareName As String
   pPortName As String
   pDriverName As String
   pComment As String
   pLocation As String
   pDevMode As Long
   pSepFile As String
   pPrintProcessor As String
   pDatatype As String
   pParameters As String
   pSecurityDescriptor As Long
   Attributes As Long
   Priority As Long
   DefaultPriority As Long
   StartTime As Long
   UntilTime As Long
   Status As Long
   JobsCount As Long
   AveragePPM As Long
End Type

В этой структуре есть переменная pDevMode - пойнтер на нужные мне данные принтера типа:
Код: Выделить всё
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 Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type

Вопрос в том как по этому самому пойнтеру до этих данных добраться.
Скажите, хотя бы, хоть в том направлении двигаюсь?
А то у меня ощущение, что я первый "космонавт" и до меня размер бумаги из СommonDialog'а вообще никто не настраивал. Может это проще можно сделать, подскажите! :shock:

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 03.11.2004 (Ср) 10:20

И тишина... НИкак не могу поверить, что никто этого не делал :cry:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.11.2004 (Ср) 12:01

А вот мне вполне верится. Пипл, который программит дома для себя, редко сталкивается с необходимостью (да что уж там говорить - с возможностью :) ) печати...

У меня, например, в соотв. диалоге вообще нельзя настроить размер бумаги. Другое дело, что это прекрасно настраивается в свойствах конкретного принтера. Ну а узнать установки по данному вопросу можно, пользуясь свойством Printer.PaperSize. Более того, его из кода еще и поменять можно...

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 03.11.2004 (Ср) 12:18

И на том спасибо, большое.. :(

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 03.11.2004 (Ср) 12:23

А если не
дома для себя
то как это "приличные программеры" делают? Пожалуйста... :roll:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.11.2004 (Ср) 12:59

Если ты работаешь программистом, то в конторах принтеры есть практ. всегда, и можно "на кошках попрактиковаться", что называется :). А дома... ну, конкретно у меня дома 3 компа и 2 принтера (лазерник и фотоструйник), но программить печать на VB... нет, никогда не сталкивался, ни дома, ни по работе. Даже с отчетами ни разу в жизни не работал :) .

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 03.11.2004 (Ср) 13:10

2Ennor:
Спасибо за ответ.

А те кто сталкивались - молчат. :wink:

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 03.11.2004 (Ср) 17:43

Возможно, кто-нибудь сможет подсказать при помощи чего можно получить список всех возможных форматов бумаги для конкретно выбранного принтера системы :?:
А то меня скоро наверно ... :shock:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.11.2004 (Чт) 0:59

А ты посмотри хелп в MSDN на тему свойства Printer.PaperSize - они там все константами зашиты... :)
Например:

Код: Выделить всё
vbPRPSLetter=1 Letter, 8 1/2 x 11 in.
...
vbPRPSA3=8 A3, 297 x 420 mm
vbPRPSA4=9 A4, 210 x 297 mm
...

И вот еще что, самое приятное:
MSDN писал(а):Setting a printer's Height or Width property automatically sets PaperSize to vbPRPSUser.

То есть всегда есть возможность выставить произвольный формат бумаги...

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 04.11.2004 (Чт) 12:54

Спасибо, Ennor.
К сожалению, это
То есть всегда есть возможность выставить произвольный формат бумаги...

не совсем так. Возможность выставления произвольного формата бумаги зависит от драйвера принтера, не все это позволяют. При попытке это сделать может выдаваться ошибка или же формат бумаги будет выставляться на ближайший стандартный.
Note The effect of the properties of the Printer object depends on the driver supplied by the printer manufacturer. Some property settings may have no effect, or several different property settings may all have the same effect. Settings outside the accepted range may or may not produce an error. For more information, see the manufacturer's documentation for the specific driver.

Это я "на кошках практиковалась" :wink:
А спрашивала я про форматы, доступные конкретному выбранному принтеру, а ему, как правило доступны не все.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 04.11.2004 (Чт) 19:58

Flo писал(а):...получить список всех возможных форматов бумаги для конкретно выбранного принтера...

Только что внимательно прочел, что именно тебе нужно. Боюсь, это действительно надо с их дровами напрямую контачить. Но тут есть одна юридическая тонкость:
1. Если у тебя программа специализированная (например, для продажи и печати билетов в кинотеатрах) - значит, вопрос о спецоборудовании даже не стоит, конкретно билетные принтеры - крайне специфичная вещь, и очень хорошо документированная. Я видел такие, когда моя прошлая контора такой софт писала. Так что тут можно и с производителем связаться, при необходимости.
2. Если у тебя прога широкого назначения, значит, ориентируйся на наиболее распространенные форматы бумаги - А4, А3, Legal, ну и может еще пару энвелопов, которые у вас в Эстонии общеприняты. Большинству этого хватит, а эти форматы поддерживают все принтеры моложе 10 лет :) .

Ну и, конечно, отлов ошибок в этом случае надо очень качественный организовать. Например, у тебя идет код установки нестандартных размеров бумаги - так сразу после него:
Код: Выделить всё
with Printer
  .Height = 1000
  .Width = 500
  ' Look here!
  DoEvents
  If .Height <> 1000 Or .Width <> 500 Then
  ... ' Пишешь пользователю, что его формат не катит, например
End With

Еще можно поставить On Error Resume Next и в следующей же строке проверять на Err.Number <> 0 . Есть способы, есть...

Flo
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 09.03.2004 (Вт) 16:43
Откуда: Таллинн, Эстония

Сообщение Flo » 08.11.2004 (Пн) 12:51

Спасибо большое за совет, только сегодня прочитала..


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

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

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

    TopList  
cron