Проблема с размером страницы принтера - PullRequest
1 голос
/ 10 февраля 2010

Я пытаюсь установить пользовательский размер бумаги, выполнив:

Printer.Height = 2160
Printer.Width = 11900

Но это не имеет никакого эффекта. После настройки я запрашиваю эти значения и они возвращают значения по умолчанию. И это:

Printer.PaperSize = 256

Возвращает ошибку ...

Есть идеи ??

Ответы [ 5 ]

3 голосов
/ 10 февраля 2010

Либо ваш принтер не позволяет устанавливать эти свойства, либо вы превышаете максимально допустимые значения. Из Visual Basic Reference

Если вы установите Высота и Ширина свойства для драйвера принтера, который не позволяет эти свойства быть установить, ошибка не возникает и размер бумага остается прежней. если ты установить высоту и ширину для принтера драйвер, который допускает только определенные значения быть указано, ошибка не возникает и свойство установлено на все водитель позволяет. Например, вы могли бы установите Высота до 150, и водитель будет установите его на 144.

Я не знаю, почему вы получаете ошибку, когда устанавливаете свойство Papersize в 256. Это работает для меня. Кроме того, документация гласит: «Установка свойства принтера Высота или Ширина автоматически устанавливает для PaperSize значение vbPRPSUser.», Что равно 256.

2 голосов
/ 29 апреля 2010

Я на самом деле был связан с той же проблемой, но я просто нашел прорыв. Сначала вам нужно создать пользовательскую форму, которая определяет ваш собственный размер бумаги. Затем вам нужно обратитесь к Windows API, чтобы проверить имя формы, которую вы только что создали. Вы получите имя из массива, возвращенного функцией, и используйте индекс массива, в котором было найдено имя формы. Наконец, используйте его в качестве значения для printer.papersize

Пример ниже:

Public Type PRINTER_DEFAULTS
   pDatatype            As Long
   pDevMode             As Long
   DesiredAccess        As Long
End Type

Public Type FORM_INFO_1
        Flags As Long
        pName As Long   ' String
        Size As SIZEL
        ImageableArea As RECTL
End Type

Public Declare Function EnumForms Lib "winspool.drv" Alias "EnumFormsA" _
    (ByVal hPrinter As Long, ByVal Level As Long, ByRef pForm As Any, _
    ByVal cbBuf As Long, ByRef pcbNeeded As Long, _
    ByRef pcReturned As Long) As Long

Public Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
   (pDest As Any, pSource As Any, ByVal cbLength As Long)
Public Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)

Public Declare Function OpenPrinter Lib "winspool.drv" Alias _
   "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
   pDefault As PRINTER_DEFAULTS) As Long

Public Declare Function ClosePrinter Lib "winspool.drv" _
   (ByVal hPrinter As Long) As Long

Public Declare Function lstrcpy Lib "KERNEL32" Alias "lstrcpyA" _
    (ByVal lpString1 As String, ByRef lpString2 As Long) As Long

'UDF
Public Function PtrCtoVbString(ByVal Add As Long) As String
Dim sTemp As String * 512, x As Long

x = lstrcpy(sTemp, ByVal Add)
If (InStr(1, sTemp, Chr(0)) = 0) Then
     PtrCtoVbString = ""
Else
     PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
End If
End Function

Public Function IsFormExist(ByVal DeviceName As String, ByVal isFormName As String, ByVal PrinterHandle As Long) As Long
Dim NumForms As Long, i As Long
Dim FI1 As FORM_INFO_1
Dim pd As PRINTER_DEFAULTS
Dim aFI1() As FORM_INFO_1           ' Working FI1 array
Dim Temp() As Byte                  ' Temp FI1 array
Dim FormIndex As Integer
Dim BytesNeeded As Long
Dim RetVal As Long

On Error GoTo cleanup

FormIndex = 0
ReDim aFI1(1)
' First call retrieves the BytesNeeded.

RetVal = OpenPrinter(DeviceName, PrinterHandle, pd)
  If (RetVal = 0) Or (PrinterHandle = 0) Then
  'Can't access current printer. Bail out doing nothing
  Exit Function
End If

RetVal = EnumForms(PrinterHandle, 1, aFI1(0), 0&, BytesNeeded, NumForms)
ReDim Temp(BytesNeeded)
ReDim aFI1(BytesNeeded / Len(FI1))
' Second call actually enumerates the supported forms.
RetVal = EnumForms(PrinterHandle, 1, Temp(0), BytesNeeded, BytesNeeded, _
         NumForms)
Call CopyMemory(aFI1(0), Temp(0), BytesNeeded)
For i = 0 To NumForms - 1
    With aFI1(i)
        If isFormName = PtrCtoVbString(.pName) Then
           ' Found the desired form
            FormIndex = i + 1
            Exit For
        End If
    End With
Next i
IsFormExist = FormIndex ' Returns the number when form is found.

cleanup:
   'Release the printer handle
   If (PrinterHandle <> 0) Then Call ClosePrinter(PrinterHandle)
End Function


'Here We Go

dim papercode as long, printername as string, formname as string
printername=printer.Devicename 
formname = "myform"   

papercode=IsFormExist(printername, formname, Printer.hdc)

if papercode<>0 then
  printer.papersize=papercode
end if

Попробуй, удачи

1 голос
/ 10 февраля 2010

Вы уверены, что ошибка не связана с максимальной шириной печати самого принтера? Многие принтеры имеют максимальную ширину печати 8,25 "(11880), что позволяет использовать поля по 1/4" с каждой стороны бумаги шириной 8,5 ".

Самый быстрый способ проверить это - просто установить ширину печати на 11880 или ниже и посмотреть, работает ли она.

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

0 голосов
/ 02 июня 2010

Я тестирую этот код, но не вижу пользовательскую форму, созданную с помощью принтеров и сканеров, в панели управления Windows XP Professional SP3. Примечание. Я могу проверить в regedit, что эта форма существует и ее идентификатор 512 в строковом значении, и она содержит имя формы, созданной на панели управления принтерами.

Почему эта функция не возвращает мою пользовательскую форму, я использую HP Laserjet 1020.

0 голосов
/ 10 февраля 2010

Решение состоит в том, чтобы использовать Windows 98. Он не работает ни с win2k, ни с winXP. Тот же код, тот же принтер.

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...