2012-07-04 12 views
7

Sto creando un'applicazione MS Access (2010) e stamperò etichette con codici a barre da questa applicazione. Ci sono una varietà di altri report e moduli che verranno anche stampati, usando le impostazioni standard della stampante, ma con i codici a barre di cui ho bisogno per stampare su una stampante specifica, e devo impostarlo per usare una dimensione di pagina speciale.Accesso MS: formato carta personalizzato

Nella mia ricerca ho found the printer object's property "Papersize" che di per sé ha alcune opzioni predefinite "standard" tra cui acPRPSLetter per la lettera standard USA a 8.5 "x 11" e acPRPSA4 per il formato carta A4. Nessuna delle dimensioni preimpostate funzionerà per il mio uso. C'è una preimpostazione che rappresenta una dimensione personalizzata dell'utente, acPRPSUser, ma non ho trovato alcun modo per programmare impostato la dimensione personalizzata.

Ho letto su come ci sono le proprietà '.height' e '.width' della stampante, ma non sembra che esistano nel VB utilizzato per Access 2010 (credo che sia basato su VB6) .

Qualcuno può aiutarmi a impostare un formato carta personalizzato utilizzando il codice VB in Access 2010?

+0

Come su http://msdn.microsoft.com/en-us/library/ff836635.aspx? – Fionnuala

+0

L'ho visto e intendevo includerlo nel mio post. Grazie per averlo trovato. Questo mostra la proprietà '.papersize' utilizzata, che nell'esempio sta usando acPRPSLetter come menzionato sopra. Questo è quello che sto chiamando, per mancanza di un termine migliore, un preset. Ho bisogno di usare una dimensione personalizzata. – CertifiedKennedy

+0

L'ultimo dell'elenco è acPRPSUser (http://msdn.microsoft.com/en-us/library/ff845524.aspx) – Fionnuala

risposta

2

Non è necessario VBA. È possibile impostare tutte le impostazioni della pagina per margini, orientamento, carta, stampante e colonne utilizzando il comando di impostazioni della pagina dal menu: Strumenti per progetti di report> Impostazioni pagina> Impostazioni pagina> Pagina> Carta> Dimensione o > Pagina> Printer for ReportName> Usa stampante specifica> Stampante> Proprietà. Queste impostazioni vengono salvate per ogni rapporto induviduale.

Screenshot

+3

Questo è più vicino a quello che sto cercando, ma non proprio. Questo file verrà utilizzato su computer diversi, pertanto l'impostazione del formato carta deve essere configurata utilizzando il file di accesso in quanto non è pratico dal punto di vista del supporto configurare manualmente la stampante su ciascuna macchina separatamente. Mi piacerebbe configurarlo programmaticamente, se possibile, in questo modo ogni computer che esegue questo file saprà esattamente come gestire le etichette. – CertifiedKennedy

0

sembra che tu abbia bisogno di guardare fuori per .DefaultSize - se è vero, allora le vostre ItemSizeHeight & ItemSizeWidth impostazioni vengono ignorate

C'è molto maggiori informazioni su MSDN e alcuni esempi

1

ho avuto lo stesso problema. Ho risolto il problema utilizzando How to: Programmatically Retrieve Printer Capabilities

Ho creato un modulo con una stampa della procedura. Con la funzione Printerselection potrei chiamare una stampante usando una parte specifica del printername. La funzione PaperSelection è stata utilizzata per specificare la carta utilizzando una parte specifica del nome della carta.

Prima ho dovuto usare la dichiarazione per la funzione API chiamata DeviceCapabilities

' Declaration for the DeviceCapabilities function API call. 
Private Declare Function DeviceCapabilities Lib "winspool.drv" _ 
    Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _ 
    ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _ 
    ByVal lpDevMode As Long) As Long 

' DeviceCapabilities function constants. 
Private Const DC_PAPERNAMES = 16 
Private Const DC_PAPERS = 2 
Private Const DC_BINNAMES = 12 
Private Const DC_BINS = 6 
Private Const DEFAULT_VALUES = 0 

Private Type str_DEVMODE 
    RGB As String * 94 
End Type 

Private Type type_DEVMODE 
    strDeviceName As String * 32 
    intSpecVersion As Integer 
    intDriverVersion As Integer 
    intSize As Integer 
    intDriverExtra As Integer 
    lngFields As Long 
    intOrientation As Integer 
    intPaperSize As Integer 
    intPaperLength As Integer 
    intPaperWidth As Integer 
    intScale As Integer 
    intCopies As Integer 
    intDefaultSource As Integer 
    intPrintQuality As Integer 
    intColor As Integer 
    intDuplex As Integer 
    intResolution As Integer 
    intTTOption As Integer 
    intCollate As Integer 
    strFormName As String * 32 
    lngPad As Long 
    lngBits As Long 
    lngPW As Long 
    lngPH As Long 
    lngDFI As Long 
    lngDFr As Long 
End Type 

Private Cnt As Integer, PrinterSelect As Integer 

Public Sub PrintOut(ByVal rptName As String, Printer As String, Paper As String, BinName As String, Optional Landscape As Boolean, Optional WhereCond) 
Dim rpt As Report 
DoCmd.OpenReport rptName, acViewPreview, , WhereCond 
Set rpt = Reports(rptName) 
PrinterSelect = PrinterSelection(Printer) 
rpt.Printer = Application.Printers(PrinterSelect) 
rpt.Printer.PaperSize = PaperSelection(Paper, PrinterSelect) 
If Landscape Then 
    rpt.Printer.Orientation = acPRORLandscape 
Else 
    rpt.Printer.Orientation = acPRORPortrait 
End If 
rpt.Printer.PaperBin = BinSelection(BinName, PrinterSelect) 
End Sub 

Public Function PrinterSelection(Printer As String) As Integer 
For Cnt = 0 To Application.Printers.Count - 1 
    If InStr(1, Application.Printers(Cnt).DeviceName, Printer) > 0 Then 
     PrinterSelection = Cnt 
    End If 
Next Cnt 
End Function 

Public Function PaperSelection(Paper As String, Printer As Integer) As Integer 

    Dim lngPaperCount As Long 
    Dim lngCounter As Long 
    Dim hPrinter As Long 
    Dim strDeviceName As String 
    Dim strDevicePort As String 
    Dim strPaperNamesList As String 
    Dim strPaperName As String 
    Dim intLength As Integer 
    Dim strMsg As String 
    Dim aintNumPaper() As Integer 

    On Error GoTo GetPaperList_Err 

    ' Get the name and port of the selected printer. 
    strDeviceName = Application.Printers(Printer).DeviceName 
    strDevicePort = Application.Printers(Printer).Port 

    ' Get the count of paper names supported by the printer. 
    lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ 
     lpPort:=strDevicePort, _ 
     iIndex:=DC_PAPERNAMES, _ 
     lpOutput:=ByVal vbNullString, _ 
     lpDevMode:=DEFAULT_VALUES) 

    ' Re-dimension the array to the count of paper names. 
    ReDim aintNumPaper(1 To lngPaperCount) 

    ' Pad the variable to accept 64 bytes for each paper name. 
    strPaperNamesList = String(64 * lngPaperCount, 0) 

    ' Get the string buffer of all paper names supported by the printer. 
    lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ 
     lpPort:=strDevicePort, _ 
     iIndex:=DC_PAPERNAMES, _ 
     lpOutput:=ByVal strPaperNamesList, _ 
     lpDevMode:=DEFAULT_VALUES) 

    ' Get the array of all paper numbers supported by the printer. 
    lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ 
     lpPort:=strDevicePort, _ 
     iIndex:=DC_PAPERS, _ 
     lpOutput:=aintNumPaper(1), _ 
     lpDevMode:=DEFAULT_VALUES) 

    ' List the available paper names. 
    For lngCounter = 1 To lngPaperCount 

     ' Parse a paper name from the string buffer. 
     strPaperName = Mid(String:=strPaperNamesList, Start:=64 * (lngCounter - 1) + 1, Length:=64) 
     intLength = VBA.InStr(Start:=1, String1:=strPaperName, String2:=Chr(0)) - 1 
     strPaperName = Left(String:=strPaperName, Length:=intLength) 
     If InStr(1, strPaperName, Paper) > 0 Then 
     ' Select the a paper number corresponding to the paper name. 
      PaperSelection = aintNumPaper(lngCounter) 
     End If 
    Next lngCounter 


GetPaperList_End: 
    Exit Function 

GetPaperList_Err: 
    MsgBox Prompt:=err.Description, Buttons:=vbCritical & vbOKOnly, _ 
     Title:="Error Number " & err.Number & " Occurred" 
    Resume GetPaperList_End 

End Function 

Public Function BinSelection(BIN As String, Printer As Integer) As Integer 
' Uses the DeviceCapabilities API function to choose the desired paper bin supported by the chosen printer 

    Dim lngBinCount As Long 
    Dim lngCounter As Long 
    Dim hPrinter As Long 
    Dim strDeviceName As String 
    Dim strDevicePort As String 
    Dim strBinNamesList As String 
    Dim strBinName As String 
    Dim intLength As Integer 
    Dim strMsg As String 
    Dim aintNumBin() As Integer 

    On Error GoTo GetBinList_Err 

    ' Get name and port of the default printer. 
    strDeviceName = Application.Printers(Printer).DeviceName 
    strDevicePort = Application.Printers(Printer).Port 

    ' Get count of paper bin names supported by the printer. 
    lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ 
     lpPort:=strDevicePort, _ 
     iIndex:=DC_BINNAMES, _ 
     lpOutput:=ByVal vbNullString, _ 
     lpDevMode:=DEFAULT_VALUES) 

    ' Re-dimension the array to count of paper bins. 
    ReDim aintNumBin(1 To lngBinCount) 

    ' Pad variable to accept 24 bytes for each bin name. 
    strBinNamesList = String(Number:=24 * lngBinCount, Character:=0) 

    ' Get string buffer of paper bin names supported by the printer. 
    lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ 
     lpPort:=strDevicePort, _ 
     iIndex:=DC_BINNAMES, _ 
     lpOutput:=ByVal strBinNamesList, _ 
     lpDevMode:=DEFAULT_VALUES) 

    ' Get array of paper bin numbers supported by the printer. 
    lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ 
     lpPort:=strDevicePort, _ 
     iIndex:=DC_BINS, _ 
     lpOutput:=aintNumBin(1), _ 
     lpDevMode:=0) 

    ' List available paper bin names. 
    strMsg = "Paper bins available for " & strDeviceName & vbCrLf 
    For lngCounter = 1 To lngBinCount 

     ' Parse a paper bin name from string buffer. 
     strBinName = Mid(String:=strBinNamesList, _ 
      Start:=24 * (lngCounter - 1) + 1, _ 
      Length:=24) 
     intLength = VBA.InStr(Start:=1, _ 
      String1:=strBinName, String2:=Chr(0)) - 1 
     strBinName = Left(String:=strBinName, _ 
       Length:=intLength) 

     If InStr(1, strBinName, BIN) > 0 Then 
     ' Select the bin number corresponding to the bin name. 
      BinSelection = aintNumBin(lngCounter) 
     End If 
    Next lngCounter 


GetBinList_End: 
    Exit Function 
GetBinList_Err: 
    MsgBox Prompt:=err.Description, Buttons:=vbCritical & vbOKOnly, _ 
     Title:="Error Number " & err.Number & " Occurred" 
    Resume GetBinList_End 
End Function 
Problemi correlati