PrintingLibEx - Library für ertweiterte druckausgaben

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Hi Fraiser,

du hast in der zwischenzeit ein update deiner Lib gemacht :allright:
habs gemerkt und auch schon getestet, aber leider hab Ich noch ein Problem mit einem Farbdrucker gefunden :
KONICA MINOLTA magicolor 2430DL
beim öffnen gibt es eine Fehlermeldung :

Code: Alles auswählen

If InitPrintingPageEx(#DMPAPER_A4, #DMORIENT_PORTRAIT, #DMCOLOR_COLOR) = 0
  MessageRequester("FEHLER", "Init PrintingPageEx")
  End
EndIf
an den Parametern kanns nicht liegen habe mal ein paar Drucker ausprobiert :
Kyocera Mita FS-3800 KX
Kyocera Mita FS-1010
DYMO LabelWriter 320
FreePDF
Kyocera FS-1200
Kyocera FS-1550+
Kyocera Mita FS-1020D
Microsoft Office Document Image Writer
TEC B-572
TEC B-SX5
alle mit erfolg :allright:

Klaus
Benutzeravatar
Fraiser
Beiträge: 14
Registriert: 11.05.2005 16:47
Wohnort: Kiel
Kontaktdaten:

Beitrag von Fraiser »

Hi,

funktionieren denn die anderen Funktionen? Wenn nicht würde
das bedeuten das der Drucken nicht Initialisiert werden kann.
Die Info würde mir helfen den Fehler einzugrenzen.

Gruß

Fraiser
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Hi Fraiser,
GetPrintingFontMetricEx(#PL_Font_Ascent)
GetPrintingFontMetricEx(#PL_Font_Descent)
GetPrintingFontMetricEx(#PL_Font_Height)
GetPrintingTextHeightEx(Text$)
GetPrintingTextWidthEx(text$)
PrintingBoxEx()
PrintingTextEx()
funktionieren alle bestens :allright:
(Screenshot von PrintBarcode lib : http://www.purebasicpower.de/?download= ... Sample.TIF)

Der Fehler kann also nur noch in dem Befehl InitPrintingPageEx() liegen, benutze ihn wie in deiner Demo ohne den Druckerdialog vorher aufzurufen.
Per API habe Ich keine Probleme den Drucker zu öffnen :

Code: Alles auswählen

Procedure.l P_OpenPrinter(PrinterName$,Orientation$,Paper$)
  If OpenPrinter_(PrinterName$,@PrinterHandle,0)
    Buffersize.l=DocumentProperties_(0,PrinterHandle,PrinterName$,0,0,0)
    *DevBufferIn=AllocateMemory(Buffersize)
    *DevBufferOut=AllocateMemory(Buffersize)
    DocumentProperties_(0,PrinterHandle,PrinterName$,*DevBufferIn,*DevBufferOut,#DM_OUT_BUFFER|#DM_IN_BUFFER)
    *PrinterParameters.DEVMODE=*DevBufferIn
    ClosePrinter_(PrinterHandle)
    *PrinterParameters\dmFields=#DM_ORIENTATION|#DM_PAPERSIZE
    
    Select UCase(Paper$)
      Case "A3"
        *PrinterParameters\dmPapersize=#DMPAPER_A3
      Case "A4"
        *PrinterParameters\dmPapersize=#DMPAPER_A4
      Case "A5"
        *PrinterParameters\dmPapersize=#DMPAPER_A5
      Case "A6"
        ;*PrinterParameters\dmPapersize=#DMPAPER_A6
      Case "B5"
        *PrinterParameters\dmPapersize=#DMPAPER_B5
      Case "B6"
        ;*PrinterParameters\dmPapersize=#DMPAPER_B6_JIS
      Case "LETTER"
        *PrinterParameters\dmPapersize=#DMPAPER_LETTER
      Case "LEGAL"
        *PrinterParameters\dmPapersize=#DMPAPER_LEGAL
    EndSelect
    
    Select UCase(Orientation$)
      Case "P"
        *PrinterParameters\dmOrientation=#DMORIENT_PORTRAIT
      Case "L"
        *PrinterParameters\dmOrientation=#DMORIENT_LANDSCAPE
    EndSelect
    
    If GetVersion_()&$FF0000 ; Windows NT/XP
      lpszDriver.s = "WINSPOOL"
    Else ; Win 9x/Me
      lpszDriver = ""
    EndIf
    PrinterDC=CreateDC_(@lpszDriver,PrinterName$,0,*PrinterParameters)
    FreeMemory(*DevBufferIn)
    FreeMemory(*DevBufferOut)
    ProcedureReturn PrinterDC
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.l P_StartPrinting(PrinterDC,Jobname$)
  DocInf.DOCINFO
  DocInf\cbSize=SizeOf(DOCINFO)
  DocInf\lpszDocName=@Jobname$
  DocInf\lpszOutput=#Null
  DocInf\lpszDatatype=0
  DocInf\fwType=0
  If StartDoc_(PrinterDC,@DocInf)<>0
    If StartPage_(PrinterDC)<>0
      ProcedureReturn 1
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure P_StopPrinting(PrinterDC)
  EndPage_(PrinterDC)
  EndDoc_(PrinterDC)
EndProcedure

PrinterName$="KONICA MINOLTA magicolor 2430DL"
Orientation$="P"
Paper$="A4"
PrinterDC=P_OpenPrinter(PrinterName$,Orientation$,Paper$)
If PrinterDC<>0
  Debug PrinterName$
Else
  MessageRequester("FEHLER","P_OpenPrinter()"+Chr(13)+Printername$,0)
  End
EndIf

Jobname$="TEST"
If P_StartPrinting(PrinterDC,Jobname$)<>0
  Debug "PrinterDC="+Str(PrinterDC)
  ;P_StopPrinting(PrinterDC)
Else
  MessageRequester("FEHLER","Print_StartPrinting()",0)
  End
EndIf
Debug Output :
KONICA MINOLTA magicolor 2430DL
PrinterDC=153160665
MfG Klaus
Benutzeravatar
Fraiser
Beiträge: 14
Registriert: 11.05.2005 16:47
Wohnort: Kiel
Kontaktdaten:

Beitrag von Fraiser »

Hi,

habe mir gerade mal den Treiber vom 2430DL installiert. Bei der ersten Initialisierung
gibt es keinen Fehler, auch bei mehrmaligem aufruf nicht. Sobald ich aber
einmal den Printer Setup Dialog aufgerufen habe gibt InitPritingPageEx()
immer einen Fehler zurück. Ich benutze den API Befehl ResetDC um
die neuen Werte dem Printer DC zuzuordnern. Ich denke dort muss der
Fehler liegen. Werde aber erst zum Wochenende dazu kommen das
ganze näher auszutesten.

Gruß

Fraiser
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

hmm hab nur eine erklärung dafür, dein Standarddrucker ist nicht der Konica-Minolta :o
Wenn ich nur diesen Befehl schicke und der Konica der Standarddrucker ist bekomme ich immer eine Fehlermeldung (und das auf zwei rechnern mit Win XPSP2) :

Code: Alles auswählen

;*** page setting
If InitPrintingPageEx(#DMPAPER_A4, #DMORIENT_PORTRAIT, #DMCOLOR_COLOR) = 0
  MessageRequester("FEHLER", "Init PrintingPagebEx")
  End
EndIf
Bild
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Hi,

kann den Fehler mit ResetDC nicht nachvollziehen 8)

Code: Alles auswählen

Global PrintLib_PN.s
Global PrintLib_DC.l
Global PrintLib_PH.l

ProcedureDLL Print_ConvertOptions(Option$,*PrinterParameters.DEVMODE)
  cnt=CountString(Option$,",")
  For i=0 To cnt
    part$=StringField(Option$,i+1,",")
    opt$=StringField(part$,1,"=")
    value=Val(StringField(part$,2,"="))
    Select LCase(opt$)
      Case "orientation"
        *PrinterParameters\dmFields|#DM_ORIENTATION
        *PrinterParameters\dmOrientation=value
      Case "papersize"
        *PrinterParameters\dmFields|#DM_PAPERSIZE
        *PrinterParameters\dmPapersize=value
      Case "paperlength"
        *PrinterParameters\dmFields|#DM_PAPERLENGTH
        *PrinterParameters\dmPaperlength=value
      Case "paperwidth"
        *PrinterParameters\dmFields|#DM_PAPERWIDTH
        *PrinterParameters\dmPaperwidth=value
      Case "scale"
        *PrinterParameters\dmFields|#DM_SCALE
        *PrinterParameters\dmScale=value
      Case "copies"
        *PrinterParameters\dmFields|#DM_COPIES
        *PrinterParameters\dmCopies=value
      Case "defaultsource"
        *PrinterParameters\dmFields|#DM_DEFAULTSOURCE
        *PrinterParameters\dmDefaultsource=value
      Case "printquality"
        *PrinterParameters\dmFields|#DM_PRINTQUALITY
        *PrinterParameters\dmPrintquality=value
      Case "color"
        *PrinterParameters\dmFields|#DM_COLOR
        *PrinterParameters\dmColor=value
      Case "duplex"
        *PrinterParameters\dmFields|#DM_DUPLEX
        *PrinterParameters\dmDuplex=value
      Case "yresolution"
        *PrinterParameters\dmFields|#DM_YRESOLUTION
        *PrinterParameters\dmYResolution=value
      Case "ttoption"
        *PrinterParameters\dmFields|#DM_TTOPTION
        *PrinterParameters\dmTTOption=value
      Case "collate"
        *PrinterParameters\dmFields|#DM_COLLATE
        *PrinterParameters\dmCollate=value
    EndSelect
  Next
EndProcedure

ProcedureDLL.l Print_OpenPrinter(PrinterName$,Option$)
  If PrintLib_PN=""
    PrintLib_PN=Print_GetDefaultPrinter()
  Else
    PrintLib_PN=PrinterName$
  EndIf
  
  res=OpenPrinter_(PrintLib_PN,@PrintLib_PH,0)
  If res
    Buffersize.l=DocumentProperties_(0,PrintLib_PH,PrintLib_PN,0,0,0)
    If Buffersize=<0
      ProcedureReturn 0
    EndIf
    *DevBufferIn=AllocateMemory(Buffersize)
    *DevBufferOut=AllocateMemory(Buffersize)
    DocumentProperties_(0,PrintLib_PH,PrintLib_PN,*DevBufferIn,*DevBufferOut,#DM_OUT_BUFFER|#DM_IN_BUFFER)
    *PrinterParameters.DEVMODE=*DevBufferIn
    
    Fields=Print_ConvertOptions(Option$,*PrinterParameters.DEVMODE)
    
    If GetVersion_()&$FF0000 ; Windows NT/XP
      lpszDriver.s = "WINSPOOL"
    Else ; Win 9x/Me
      lpszDriver = ""
    EndIf
    PrintLib_DC=CreateDC_(@lpszDriver,PrintLib_PN,0,*PrinterParameters)
    FreeMemory(*DevBufferIn)
    FreeMemory(*DevBufferOut)
    ProcedureReturn PrintLib_DC
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

ProcedureDLL.l Print_ResetDC(Option$)
  If PrintLib_DC<>0 And Option$<>"" And PrintLib_PN<>""
    Buffersize.l=DocumentProperties_(0,PrintLib_PH,PrintLib_PN,0,0,0)
    If Buffersize=<0
      ProcedureReturn 0
    EndIf
    *DevBufferIn=AllocateMemory(Buffersize)
    *DevBufferOut=AllocateMemory(Buffersize)
    DocumentProperties_(0,PrintLib_PH,PrintLib_PN,*DevBufferIn,*DevBufferOut,#DM_OUT_BUFFER|#DM_IN_BUFFER)
    *PrinterParameters.DEVMODE=*DevBufferIn
    
    Print_ConvertOptions(Option$,*PrinterParameters.DEVMODE)
    
    PrintLib_DC=ResetDC_(PrintLib_DC,*PrinterParameters)
    
    FreeMemory(*DevBufferIn)
    FreeMemory(*DevBufferOut)
  EndIf
  
  ProcedureReturn PrintLib_DC
EndProcedure

ProcedureDLL.s Print_GetDefaultPrinter()
  PrintLib_PN=""
  If OSVersion()<#PB_OS_Windows_2000
    Len=260
    PrintLib_PN=Space(Len)
    GetPrivateProfileString_("WINDOWS","DEVICE","",@PrintLib_PN,Len,"Win.Ini")
    PrintLib_PN=StringField(PrintLib_PN,1,",")
  Else
    winspool=OpenLibrary(#PB_Any,"WINSPOOL.DRV")
    If winspool
      Len=260
      PrintLib_PN=Space(260)
      CallFunction(winspool,"GetDefaultPrinterA",@PrintLib_PN,@Len)
      If GetLastError_()=#ERROR_FILE_NOT_FOUND
        PrintLib_PN=""
      EndIf
      CloseLibrary(winspool)
    EndIf
  EndIf
  ProcedureReturn PrintLib_PN
EndProcedure
und ein beispiel zum öffnen eines drucker :

Code: Alles auswählen

Option$="Orientation="+Str(#DMORIENT_LANDSCAPE)+","
Option$+"Papersize="+Str(#DMPAPER_A4)

PrinterDC=Print_OpenPrinter("",Option$)

Option$="Orientation="+Str(#DMORIENT_PORTRAIT)+","
Option$+"Papersize="+Str(#DMPAPER_LETTER)

PrinterDC=Print_ResetDC(Option$)
achtung obiger code ist nur ein auszug aus meiner printer lib und dient nur zum vergleichen deiner funktionen :allright:
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Hallo,
Wer könnte mir mal eine kleine Hilfestellung geben ?
Kenne mich mit Druckseiten bzw. DPI nicht so aus.
Ich möchte mit der PrinterLibEx ein neunspaltiges ListIcon
ausdrucken (am besten mit PrintingTextboxEx() ).

Da muß ich ja die Spaltenbreiten des ListIcon mit der
Breite der Druckerseite in Beziehung setzen.

Soll nichts großartiges sein, nur daß ich einen halbwegs
vernünftigen Ausdruck erhalte. Font usw. brauche ich nicht.
Benutzeravatar
Fraiser
Beiträge: 14
Registriert: 11.05.2005 16:47
Wohnort: Kiel
Kontaktdaten:

Beitrag von Fraiser »

Hallo,

dazu ist nur etwas Rechenarbeit notwendig :)
Also die Breite von ListIcon ist 100%. Die einzelnen
Spalten rechnerst Du in das entsprechenden verhätnis um
(z.B.: 8x 10% 1x20%). Mittels GetPrintingCapsEx(#PL_PageSize_X)
bekommst Du die Breite Deiner Seite. Nun setzt Du die gewünschte
Breite Deiner Tabelle wieder als 100%, ich wähle mal eine DIN A4 Seite
und sage die Tabelle soll 200mm Breit werden, und schon hast Du die einzelnen
Breiten, in mm, Deiner zu druckenden Tabelle. In meinem Bsp. wären das dann
8x 20mm und 1x 40mm bzw. für den PrintingTextBoxEx()
befehl in 1/10mm = 8x 200 und 1x 400. Dabei solltest Du natürlich beachten
das Du die Breiten etwas kleiner wählst damit Du noch die Linien, wenn gewünscht,
zeichnen kannst.
Ich hoffe das Dir das etwas geholfen hat.

Gruß

Fraiser
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Danke für den Tipp.
Wichtig war für mich, zu wissen wie breit eine Seite ist.
Ich brauch auch nicht alle Columns zu drucken (ist ne
Adressverwaltung eines Vereins oder Clubs). Da reichen
z.B. Name, Vorname, Straße, Wohnort und Telefon.

Ich habe nur ein Problem : Mein Programm schmiert mir
beim Druckvorgang ab. Der Debugger bleibt bei PrintingDlgEx()
hängen. Wenns denn mal geht, kommen nur Hyroglyhen.
Habe 2 Drucker drann : 1 x Paralell HP Laserjet 4P und 1 x USB
Lexmark X5150.

Debugger bringt invalid memory access !
Der Fehler kommt übrigens bei PrinterSetupEx() bei
spätestens 3maligem Drucken hintereinander auch.

Vielleicht mach ich was falsch :

Code: Alles auswählen

Procedure PrintListIcon(GadgetID.l)
Protected spalte.s
Protected k.l, i.l, lc.l, y.l, x.l, x2.l, y2.l
y = 100
y2 = 100
maxW = 0
lc = CountGadgetItems(GadgetID)
PrintingDlgEx(WindowID(#MyWindow))
If StartPrintingEx("Test Seite")
      For i = 1 To lc
       sp1 = GetGadgetItemText(GadgetID, i, 0)
       sp2 = GetGadgetItemText(GadgetID, i, 1)
       sp3 = GetGadgetItemText(GadgetID, i, 2)
       sp4 = GetGadgetItemText(GadgetID, i, 3)
       sp5 = GetGadgetItemText(GadgetID, i, 4)
       sp6 = GetGadgetItemText(GadgetID, i, 5)
       sp7 = GetGadgetItemText(GadgetID, i, 6)
       sp8 = GetGadgetItemText(GadgetID, i, 7)
       sp9 = GetGadgetItemText(GadgetID, i, 8)
       PrintingTextBoxEx("Adressenliste", 20, 20, 800, 200, RGB(0, 0, 0), #DT_VCENTER)
       PrintingTextBoxEx(sp1, 100,  y, 400, y2, RGB(0, 0, 0), #DT_LEFT)
       PrintingTextBoxEx(sp2, 500,  y, 200, y2, RGB(0, 0, 0), #DT_LEFT)
       PrintingTextBoxEx(sp3, 900,  y, 300, y2, RGB(0, 0, 0), #DT_LEFT)
       PrintingTextBoxEx(sp5, 1200, y, 400, y2, RGB(0, 0, 0), #DT_LEFT)
       PrintingTextBoxEx(sp6, 1600, y, 300, y2, RGB(0, 0, 0), #DT_LEFT)
       y = y + 100
       y2 = y2 + 90
   Next i    
EndIf
StopPrintingEx() 
EndProcedure
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Ich weiß zwar nicht ob es noch aktuell ist, aber zumindest eine Antwort für @H.Brill

So geht es:

Code: Alles auswählen

Enumeration
#ListIcon
#ListIconvorschau
EndEnumeration

Procedure PrintListIcon(GadgetID.l, vorschau.l)
  Protected x.l,y.l,yh.l,sp1.s,sp2.s,sp3.s,i.l,druini.l
  If vorschau
    ListIconGadget(#ListIconvorschau, 20, 20, 540, 760, "", 0)
    ChangeListIconGadgetDisplay(#ListIconvorschau, #PB_ListIcon_LargeIcon)
    druini = StartPrintingPreviewEx(#ListIconvorschau, #True, 0)
    PrintingFontEx("Arial", 60, #True)
  Else
    druini= StartPrintingEx("Test Printing")
  EndIf
  
  x=120     ;1,2cm vom linken Seitenrand
  yh=0      ;Dummyvorbelegung
  y = 100   ;1 cm von oben anfangen zu drucken
  
  lc = CountGadgetItems(GadgetID)
  
  If druini
    ;PrintingFontEx("Arial", 60, #True)
    yh=GetPrintingFontMetricEx(#PL_Font_Height)         ;ermitteln der Texthöhe für den Zeilenvorschub
    
    PrintingTextEx("Adressenliste", x, y, RGB(0, 0, 0))
    y = y + yh ;Zeilenvorschub
    For i = 1 To lc
      sp1.s = GetGadgetItemText(GadgetID, i, 0)
      sp2.s = GetGadgetItemText(GadgetID, i, 1)
      sp3.s = GetGadgetItemText(GadgetID, i, 2)
 
      ;PrintingTextBoxEx("Adressenliste", 120, 120, 800, 200, RGB(0, 0, 0), #DT_VCENTER)
      ;PrintingTextBoxEx(sp1.s, 100,  y, 400, y2, RGB(0, 0, 0))
      ;PrintingTextBoxEx(sp2.s, 500,  y, 200, y2, RGB(0, 0, 0))
      ;PrintingTextBoxEx(sp3.s, 900,  y, 300, y2, RGB(0, 0, 0))
      
      PrintingTextEx(sp1.s, x, y, RGB(0, 0, 0))
      PrintingTextEx(sp2.s, x+300, y, RGB(0, 0, 0))
      PrintingTextEx(sp3.s, x+500, y, RGB(0, 0, 0))
      
      ;als Alternative könnte man den String auch zusammensetzen
      ;PrintingTextEx(LSet(sp1,12)+LSet(sp2,7)+sp3, x, y, RGB(0, 0, 0))
      y = y + yh ;Zeilenvorschub
      
    Next i   
  EndIf
    If vorschau
      StopPrintingPreviewEx()
    Else
      StopPrintingEx()
    EndIf
EndProcedure

If OpenWindow(0,0,0,600,800, "Listicon sort test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    
    ListIconGadget(#ListIcon, 10, 10, 380, 280, "Column0", 100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
    ; Fullrowselect must be set, because otherwiese only the first
    ; column will be clickable
    
    AddGadgetColumn(#ListIcon, 1, "Column1", 100)
    AddGadgetColumn(#ListIcon, 1, "Column2", 100)
    For i=0 To 10
    AddGadgetItem(#ListIcon, -1, "Eintrag"+Str(i)+Chr(10)+Str(i)+"000"+Chr(10)+"DEF"+Str(i))
    Next
    HideGadget(#ListIcon,1)
    
    PrintListIcon(#ListIcon,#True)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
  EndIf
EndIf
End
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten