Объект VBPrnDlg неправильно отключает выбор страницы - PullRequest
1 голос
/ 04 февраля 2010

Я изменяю некоторый грубый старый код печати, чтобы использовать Visual Basic Print Dialog Control для передачи информации о принтере объекту CrystalReport. Он отлично работает, за исключением одной вещи - окно выбора страницы постоянно отключено, независимо от того, какие флаги я передаю объекту. Вот мой код:

Public Enum PrintDialogFlags
    NoFlag = 0
    DisablePagesButton = 1
    LoadIntoPrnObject = 2
    AutoStartPrint = 4
End Enum

Public Function ShowPrintDialogCR(ByVal hwnd As Long, ByRef cr As CrystalReport, _
        Optional PrintFlags As Long = 0) As Boolean

    //this function assumes cr is a valid report object
    On Error GoTo ShowPrintDialogCR_Error
    Dim PD As New vbprndlglib.PrinterDlg
    //load default settings
    PD.PrinterName = Printer.DeviceName
    PD.DriverName = Printer.DriverName
    PD.Port = Printer.Port
    PD.PaperBin = Printer.PaperBin
    PD.CancelError = True
    PD.flags = (vbprndlglib.cdlPDNoSelection Or vbprndlglib.cdlPDHidePrintToFile)
    // commented the line below out to see if it was something with my logic
    // Still disables page selection without this line
    //If PrintFlags And DisablePagesButton Then PD.flags = PD.flags Or vbprndlglib.cdlPDNoPageNums
    Printer.TrackDefault = False
    PD.ShowPrinter (hwnd)

    cr.PrinterPort = PD.Port
    cr.PrinterDriver = PD.DriverName
    cr.PrinterName = PD.PrinterName
    cr.CopiesToPrinter = PD.Copies
    If PD.flags And vbprndlglib.cdlPDPageNums Then
        cr.PrinterStartPage = PD.FromPage
        cr.PrinterStopPage = PD.ToPage
    End If
    If PrintFlags And PrintDialogFlags.LoadIntoPrnObject Then
        //copy these settings to the printer object
        Dim prn As Printer
        For Each prn In Printers
            If prn.DeviceName = PD.PrinterName Then
                Set Printer = prn
                Exit For
            End If
        Next prn
        Printer.PaperBin = PD.PaperBin
        Printer.PaperSize = PD.PaperSize
        Printer.Duplex = PD.Duplex
        Printer.Copies = PD.Copies
        Printer.ColorMode = PD.ColorMode
        Printer.Orientation = PD.Orientation
        Printer.PrintQuality = PD.PrintQuality
    End If
    Set PD = Nothing
    If PrintFlags And PrintDialogFlags.AutoStartPrint Then cr.Action = 1
    ShowPrintDialogCR = True
    Printer.TrackDefault = True
    Exit Function
ShowPrintDialogCR_Error:
    If Err.Number = 20545 Then //request cancelled by user
        MsgBox "The print request was cancelled after being submitted to the print spooler." & vbNewLine & _
            "If you cancelled a print to file dialog, this is a normal message. " & vbNewLine & _
            "Otherwise, this message could mean your printer is not accepting print requests from us at this time." _
            , vbOKOnly + vbExclamation, "Print Request Cancelled"
        ErrorLogger Err, "ShowPrintDialogCR"
    ElseIf Err.Number <> 32755 Then
        //something else besides clicking cancel, show the error
        MsgBox "Error " & Err.Number & " - " & Err.Description & vbNewLine & "Source: " & _
            Err.Source & vbNewLine & vbNewLine & "Document not printed.", vbOKOnly + vbCritical, "Print Failure"
        ErrorLogger Err, "ShowPrintDialogCR"
    End If
    Err.Clear
    ShowPrintDialogCR = False
    Printer.TrackDefault = False
End Function

Я не вижу, что я делаю здесь не так. Я пропустил несколько комбинаций несвязанных флагов только для того, чтобы увидеть, включится ли флажок без успеха. Я сталкивался с причудами VB6 раньше, и я действительно надеюсь, что это не один из них. Любая помощь очень ценится!

1 Ответ

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

Я нашел это в статье КБ , на которую вы ссылались:

Чтобы включить Выбрать страницы часть в диалоговом окне «Печать» необходимо установить Макс. на число, которое больше Мин .

Итак, по крайней мере, вам нужно установить свойства Min и Max объекта диалога печати на что-то разумное, прежде чем устанавливать флаги:

PD.CancelError = True

'Set Min and Max to enable page selection'
PD.Min = 1
PD.Max = 32767 'Or any large number really'

PD.flags = (vbprndlglib.cdlPDNoSelection Or vbprndlglib.cdlPDHidePrintToFile)

В своих экспериментах я также обнаружил следующие вещи:

  • Если вы просто установите Min и Max, при выборе страницы по умолчанию для полей «Кому» и «От» будет установлено значение 1.
  • Если вы установите Min на 1 и Max на -1, а также на FromPage на 1 и ToPage на -1, поле «От» будет иметь значение по умолчанию 1, а поле «Кому» будет быть пустым Интересно, что это работает, поскольку в документации указано, что Max должно быть больше, чем Min, но похоже, что -1 обрабатывается больше как «пустое» или «нулевое» значение.
  • Если вы установите флаг vbPrnDlg.cdlPageNums, для диалогового окна печати по умолчанию будет установлен переключатель Pages . Если вы опустите флаг vbPrnDlg.cdlPageNums, в диалоговом окне по умолчанию будет установлен переключатель Все .
...