PDF-Druck und Pfad der PDF

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

PDF-Druck und Pfad der PDF

Beitragvon Werner_Bayern » Do, 26. Sep 2013 20:34

Servus,

hatte gerade das Problem, dass bei einem PDF-Druck (also über einen PDF-Drucker) ich zwar bei :startdoc() den Namen der PDF vorgeben kann, jedoch nicht den Pfad. Da wird i. d. R. ja je nach PDF-Drucker der zuletzt verwendete Pfad hergenommen oder auch schon mal Dokumente.
Übergibt man an :startdoc() den kompletten Pfad inkl. Dateiname, wird der Pfad ignoriert.

Die Lösung war:
Code: Alles auswählen
oDrucker:setPrintFile(cPfad + cPFD)
oDrucker:startDoc()

Dann kommt nicht mal mehr die Abfrage nach dem Dateinamen, man kann sich deshalb darauf verlassen, wo die PDF mit welchem Namen landet.

Falls es jemand interessiert...
es grüßt euch

Werner
Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1211
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: PDF-Druck und Pfad der PDF

Beitragvon MichaMB » Fr, 25. Mär 2016 18:35

Hallo Werner und die lieben anderen Spezialisten,

nach 3 Tagen vergeblicher Suche...
zur Info: Nachdem ich mal alle Druckerfeatures von Hubert installiert hatte, funktionierte mein Anliegen für den Test-Druck, allerdings meine ganzen bisherigen Druck-Ausgaben nicht mehr, da ich noch die Programme von DBASE III und Clipper übernommen habe. ALso muss es eine Lösung für das bisherige Migrate (dort sind die Druckroutinen hinterlegt) geben. Vermutlich wird aber gerade dort die gesuchte Kombination ausgeschlossen.
Ich nutze die Druckerauswahl und den Druck mit @ say und auch Grafik bisher ohne den Befehl startDoc endDoc, obwohl diese Befehle vorhanden sind.
alles funktioniert bisher reibungslos, ob set Printer to (File) für *.TXT in einem bestimmten Verzeichnis oder eben verschiedene Drucker über das Auswahlfenster.

Nun wollte ich den PDF_Druck noch komfortabler gestalten um z.B. einen Druck in eine *. PDF in einem festen Verzeichnis umzuleiten..... (wie gesagt mit *.TXT geht das schon aber ohne Logos etc.)
Statt der Auswahl im Druckerfenster von Windows wollte ich einen PDF-Drucker z.B. den WINDOWS 10 Drucker "Microsoft Print to PDF" im Programm vorgeben, das habe ich auch noch hinbekommen, ohne dass der Drucker gesucht wird, aber es geht zum PDF-Druck immer ein Fenster auf und ich muss entweder einen vorhandenen File-Namen anklicken und überschreiben oder den Namen der Datei selbst in das Browserfenster eingeben.... oder schlimmstenfalls das Verzeichnis neu auswählen...
Code: Alles auswählen
         if upper(PDFDRU1) = "J"
  Local   XbpPrinter, xPrinter, cPfad, cPFD, oPrinter, MyPrinter2, oDrucker   
 
          #define GRAPHICS_PRINTER
            #include "migrate.ch"
            #PRAGMA LIBRARY( "XPPUI2.LIB" )
            oDlg := XbpPrintDialog():new()
            oDlg:create()
            oPrt := &PDF_DRUCKER    // PDF Druckername "Microsoft Print to PDF" in Datei mit '"' gespeichert
            IF oPrt == NIL
              MsgBox( "No printer selected" )
              return
            ENDIF

            SET DEVICE TO PRINTER
            SET PRINTER TO OBJECT oPrt
          else
            #define GRAPHICS_PRINTER
            #include "migrate.ch"

            #PRAGMA LIBRARY( "XPPUI2.LIB" )
            // Select printer to send output to
            oDlg := XbpPrintDialog():New():Create()
            oPrt := oDlg:Display()
            IF oPrt == NIL
              MsgBox( "No printer selected" )
              return
            ENDIF
            SET DEVICE TO PRINTER
            SET PRINTER TO OBJECT oPrt
          endif

          oPrt := oPrinter  // habe ich mal zusätzlich versucht

          cPfad := "c:\PDF\VM_INTERNET\"

          cPFD  := "Einzel_" + ConvToAnsiCP(rtrim(Kuntext1)) + ".pdf"

          oPrinter:setprintfile(CPfad + cPFD)
          oPrinter:startDoc(kuntext1) // müsste doch wenigsten den File-Namen übergeben?

Fehler: setprintfile ist kein Objekt

Daten sind in der Datei, alles ok, bei einer anderen Methode wurde zwar die PDF im richtigen Verzeichnis angelegt mit dem richtigen Namen aber es waren keine Daten vorhanden.
Zuletzt geändert von MichaMB am Do, 31. Mär 2016 10:17, insgesamt 2-mal geändert.
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 56
Registriert: Fr, 26. Jul 2013 11:03

Re: PDF-Druck und Pfad der PDF

Beitragvon MichaMB » Fr, 25. Mär 2016 18:43

hier noch der Code von der Migrate.ch
Code: Alles auswählen
//////////////////////////////////////////////////////////////////////////
//
// Defines for the graphic mode report migrator.
//
// Copyright (c) 2014, Alaska Software. All rights reserved.
//
//////////////////////////////////////////////////////////////////////////
#ifndef __MIGRATE_CH__
#define __MIGRATE_CH__

// PreProcessor directives used to hook into
// EJECT @ , SAY commands
//
#ifdef GRAPHICS_PRINTER

#command  SET DEVICE TO SCREEN       =>  Set( _SET_DEVICE, "SCREEN" );;
                                         ResetGraphicsPrinter()

#command  SET DEVICE TO PRINTER      =>  Set( _SET_DEVICE, "PRINTER" );;
                                         SetGraphicsPrinter()

#command  SET PRINTER TO OBJECT <o> ;
      =>  IF IsPrinter();;
             GetPrinter():SetPrinter(<o>);;
          ELSE ;;
             Set( _SET_PRINTFILE, <o> );;
          ENDIF

#command  SET PRINTER TO PRESSPACE <o> ;
      =>  IF IsPrinter();;
             GetPrinter():SetPresSpace(<o>);;
          ENDIF

#command  RESET PRINTER <o> ;
      =>  IF IsPrinter();;
             GetPrinter():Reset(<o>);;
          ENDIF

#command  EJECT ;
      =>  IIF(IsPrinter(),GetPrinter():Eject(),_Eject())

#command  @ <nRow>, <nCol> SAY <say> [PICTURE <pic>] [COLOR <Color>] ;
      =>  IF IsPrinter();;
             GetPrinter():AtSayPict(<nRow>, <nCol>,<say>,<pic>);;
          ELSE ;;
             DevPos(<nRow>, <nCol>) ;;
             DevOutPict(<say>, <pic> [,<Color>]);;
          ENDIF
#command  @ <nRow>, <nCol> SAY <say> [COLOR <Color>] ;
      =>  IF IsPrinter();;
             GetPrinter():AtSay(<nRow>, <nCol>,<say>);;
          ELSE ;;
             DevPos(<nRow>, <nCol>) ;;
             DevOut(<say> [,<Color>]);;
          ENDIF

#command  ?  [<list,...>]  ;
      =>  IIF(IsPrinter(),GetPrinter():Qout( <list> ),QOUT( <list> ))
#command  ?? [<list,...>]  ;
      =>  IIF(IsPrinter(),GetPrinter():QQout( <list> ),QQOUT( <list> ))


#command  @ <nT>, <nL> IMAGE <cFile> ;
      =>  GetPrinter():DrawImage( <cFile>, <nT>, <nL> )
#command  @ <nT>, <nL>, <nB>, <nR> IMAGE <cFile> ;
      =>  GetPrinter():DrawImage( <cFile>, <nT>, <nL>, <nB>, <nR> )

#xtrans  MaxRow()   => IIF(IsPrinter(),GetPrinter():MaxRow,&("MaxRow()"))
#xtrans  MaxCol()   => IIF(IsPrinter(),GetPrinter():MaxRow,&("MaxCol()"))

#endif

#endif
und der Teil-code von der Migrate.prg
Code: Alles auswählen
//////////////////////////////////////////////////////////////////////////
//
// Classes and functions used to implement the graphic mode report
// migrator.
//
// Copyright (c) 2014, Alaska Software. All rights reserved.
//
//////////////////////////////////////////////////////////////////////////
#include "gra.ch"
#include "set.ch"
#include "xbp.ch"


//*#### ANSI .t. äöü ÄÖÜ ß !!!!

#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "XBPDEV.ch"




#define TEXT_DATA         1
#define IMAGE_DATA        2

#define  DRIVE_NOT_READY    21         // Fehlercode

STATIC GraphicPrinterObj := NIL

PROCEDURE MIGRATE
// Fehlende Prozeduren und Funktionen
// fehlende Prozeduren oder Funktionen werden als selbst. Prozeduren (*.prg) nachdem return eingefgt  und mssen somit nicht extra compiliert werden
// alle Functionen oder Prozeduren enden mit Return

RETURN


FUNCTION IsPrinter()

  IF GraphicPrinterObj == NIL
     IF "LPT" $ Set(_SET_PRINTFILE)   .AND.;
        Set(_SET_DEVICE) == "PRINTER" .AND.;
        GraphicPrinterObj== NIL
        MyPrinter2():RunReport()
     ENDIF
  ENDIF

RETURN (GraphicPrinterObj != NIL)

FUNCTION GetPrinter()
RETURN GraphicPrinterObj

FUNCTION SetGraphicsPrinter()
  IF(ValType(GraphicPrinterObj)=="O")
    RETURN(NIL)

  ENDIF
  MyPrinter2():RunReport()
RETURN(NIL)


FUNCTION ResetGraphicsPrinter()
  IF(ValType(GraphicPrinterObj)=="O")
    GraphicPrinterObj:Eject()
    GraphicPrinterObj:Destroy()
    GraphicPrinterObj := NIL
  ENDIF
RETURN(NIL)

#define PAGE_WIDTH       78
#define LINES_PER_PAGE   ZEILENDE  // ist Public-Variable "Zeilende" aus Programm Main Global
                                   // wird im Druckmenue aus Datenbank eingestellt

// This class is used to render our report for
// the graphic printer.
//
CLASS MyPrinter2
  CLASS VAR oPS
  CLASS VAR aData
  CLASS VAR oPrinter
  CLASS VAR aSize
  CLASS VAR nDX
  CLASS VAR nDY
  CLASS VAR lInternalPS
  CLASS VAR lInternalPrinter
  CLASS VAR IsOpenStartDoc       // .t. after Startdoc(), .f. after Enddoc()
  CLASS VAR cPrinterShowText     // Parameter merken von ::StartDoc(cText) - store cText parameter
 PROTECTED:
  CLASS METHOD PrintEsc()
 EXPORTED:
  CLASS VAR Header

  CLASS ACCESS METHOD GetMaxRow() VAR MaxRow
  CLASS ACCESS METHOD GetMaxCol() VAR MaxCol

  CLASS ACCESS METHOD GetFont()   VAR Font

  CLASS METHOD Init()
  CLASS METHOD AtSay()
  CLASS METHOD AtSayPict()
  CLASS METHOD Eject()
  CLASS METHOD SetFont()
  CLASS METHOD QOut()
  CLASS METHOD QQOut()
  CLASS METHOD startDoc()
  CLASS METHOD endDoc()
  CLASS METHOD newPage()

  CLASS METHOD DrawImage()

  CLASS METHOD RunReport()
  CLASS METHOD Destroy()

  CLASS METHOD SetPrinter()
  CLASS METHOD SetPrintFile()
  CLASS METHOD SetPresSpace()
  CLASS METHOD Reset()
ENDCLASS


CLASS METHOD MyPrinter2:Destroy()
  IF ::lInternalPrinter == .T. .AND. ValType(::oPrinter)=="O"
    ::oPrinter:Destroy()
    ::oPrinter := NIL
  ENDIF
  IF ::lInternalPS == .T. .AND. ValType(::oPS)=="O"
    ::oPS:Destroy()
    ::oPS := NIL
  ENDIF
RETURN

// initialize printer if name or object given
// dedicated printer is selected. MaxRow and
// MaxCol are used to determined space between
// lines and to calculate the position if
// @ row,col SAYs
//
CLASS METHOD MyPrinter2:Init(xPrinter,nMaxRow,nMaxCol)
  LOCAL aSize
  LOCAL cType := ValType( xPrinter )

  IF cType $ "CU"
     ::oPrinter := XbpPrinter():New()
     ::oPrinter:Create( xPrinter )
     ::lInternalPrinter := .T.
  ELSEIF cType == "O"
     ::oPrinter := xPrinter
     ::lInternalPrinter := .F.
  ENDIF

  IF ::oPS == NIL
  ::oPS := XbpPresSpace():New()
  ::lInternalPS := .T.
  ENDIF

  ::Reset()

  IF ::lInternalPS == .T.
  ::oPS:Create( ::oPrinter , ::aSize, GRA_PU_LOMETRIC )
  ENDIF

  ::aData := {}
RETURN(SELF)


// Change the associated printer to a
// printer selected by the application.
// All output using @..SAY directly goes
// to this printer from now on
CLASS METHOD MyPrinter2:SetPrinter( oPrt )
 LOCAL oFnt := ::oPS:SetFont()
   ::Destroy()
   ::Init( oPrt )
   IF ValType(oFnt) == "O"
      ::SetFont( LTrim(Str(oFnt:NominalPointSize)) + "." + oFnt:FamilyName )
   ENDIF
RETURN

//------------------------------------------------------------ // neu hinzugefügt, war nicht vorhanden
CLASS METHOD MyPrinter2:setPrintFile( cFileName )
       local uReturn := NIL, oDC, nBreite,nHoehe,aPaperSize

       if ::oPS:device():isDerivedFrom( "XbpPrinter" )
          oDC := ::oPS:device()       // xbpPrinter object
       elseif ::oPrinter:device():isDerivedFrom( "XbpPrinter" )
          oDC := ::oPrinter:device()
       endif

       if ! IsNil(oDC) .and. oDC:isDerivedFrom( "XbpPrinter" )

          if ::IsOpenStartDoc                       // ::StartDoc() ist aktiv / is active
             oDC:enddoc()                            // print
          endif
          uReturn := oDC:setPrintFile( cFileName )
          aPaperSize := oDC:PaperSize()               // hier kommen nur 6 Elemente
          nBreite := aPaperSize[5] - aPaperSize[3]    // laut DOKU sollten es 8 sein.
          nHoehe  := aPaperSize[6] - aPaperSize[4]
          ::oPS:Configure( oDC, {nBreite,nHoehe} , GRA_PU_LOMETRIC )
          ::SetInternalPageVars()
          if ::IsOpenStartDoc                       // neu öffnen - open again
             oDC:startdoc(::cPrinterShowText)
          endif
       endif

return uReturn
//-------------------------------------------------------------

// Associate an application-supplied
// Presentation Space with the line
// printer. All output using @..SAY
// goes to this PS now on
CLASS METHOD MyPrinter2:SetPresSpace( oPS )
 LOCAL oFnt := ::oPS:SetFont()

   IF oPS == ::oPS
      RETURN
   ENDIF

   ::Destroy()
   ::oPS := oPS
   ::lInternalPS := .F.

   IF ValType(oFnt) == "O"
      ::SetFont( LTrim(Str(oFnt:NominalPointSize)) + "." + oFnt:FamilyName )
   ENDIF
RETURN


// Reset the logicalcal page to cover
// the whole (possibly changed) print
// area. If <oPrt> is passed, this
// printer is set as the new output
// device.
CLASS METHOD MyPrinter2:Reset( oPrt )
  LOCAL aSize
  LOCAL nMaxRow
  LOCAL nMaxCol

  // Size of printable region on paper
  IF ValType(oPrt) == "O"
     ::SetPrinter( oPrt )
  ENDIF

//  aSize := ::oPrinter:paperSize()
    aSize := ::oPrinter:XbpPrinter:paperSize()
  ::aSize := { aSize[5] - aSize[3], ;
               aSize[6] - aSize[4]  }
  IF(nMaxRow==NIL)
    nMaxRow := LINES_PER_PAGE
  ENDIF
  IF(nMaxCol==NIL)
    nMaxcol := PAGE_WIDTH
  ENDIF

  ::nDX := Int( ::aSize[1] / nMaxCol )
  ::nDY := Int( ::aSize[2] / nMaxRow )
RETURN

// Simple Helper method used to specify Font
// for report
CLASS METHOD MyPrinter2:SetFont(cName)
  LOCAL oFont   := XbpFont():new(::oPS)

  oFont:Generic := .T.
  oFont:Vector  := .T.
  oFont:Fixed   := .T.
  oFont:FamilyName       := SubStr( cName, At(".",cName) +1 )
  oFont:nominalPointSize := Val( SubStr( cName,1, At(".",cName) -1 ) )
  oFont:Create()
  ::oPS:setFont(oFont)

  ::nDX := oFont:Width
  ::nDY := oFont:Height
RETURN


// Simply collect all output strings
CLASS METHOD MyPrinter2:AtSay(nR,nC,cText)

  // Numeric: also mit Str konvertieren damit tabellen decimals und length
  // benutzt werden
  IF(ValType(cText)=="N")
    cText := Str( cText )

  // Alle anderen nicht char typen mit Var2Char konvertieren
  // eventuell Var2LChar() dann wäre der text locale spezifisch.
  ELSEIF ValType(cText) != "C"
    cText := Var2Char( cText )
  ENDIF
  AAdd( ::aData , {TEXT_DATA, nR,nC, cText,NIL} )
RETURN


// Simply collect all output strings, include picture mask
CLASS METHOD MyPrinter2:AtSayPict(nR,nC,xExpr,cPict)
  AAdd( ::aData , {TEXT_DATA, nR,nC, Transform(xExpr,cPict)} )
RETURN

// now render the page and send it to the printer
CLASS METHOD MyPrinter2:Eject()
  LOCAL n,nMaxY, cTmp, nX, nY, nIndex

  IF(Len(::aData)==0)
    RETURN
  ENDIF

  nMaxY := ::aSize[2] - ::nDY

  // create new printer page
  IF ::lInternalPS == .T.
     ::oPS:device():startDoc()
  ENDIF
  IF(ValType(::Header)=="C")
    &(::Header)(::oPS)
  ENDIF
  FOR n:=1 TO Len(::aData)
      DO CASE
        CASE ::aData[n][1] == TEXT_DATA
          nX := ::aData[n][3]*::nDX
          nY := nMaxY - (::aData[n][2]*::nDY)
          DO WHILE .T.
             nIndex = At( Chr(27), ::aData[n][4] )
             IF nIndex > 0
                cTmp = SubStr( ::aData[n][4],1, nIndex -1 )
                ::PrintEsc( ::aData[n][4][nIndex+1] )

                // NOTE: We throw away anything right of the Escape code
                // so basically this only works if escape codes are send
                // seperately.
                // Original code was: ::aData[n][4] = SubStr( ::aData[n][4], nIndex +2 )
                ::aData[n][4] = ""
             ELSE
                cTmp := ::aData[n][4]
                ::aData[n][4] = ""
             ENDIF

             GraStringAt( ::oPS, {nX,nY}, cTmp )

             IF Len(::aData[n][4]) == 0
               EXIT
             ENDIF

             nX += Len(cTmp) * ::nDY
          ENDDO
        CASE ::aData[n][1] == IMAGE_DATA
           ::aData[n][3]:Draw( ::oPS, ::aData[n][2],,, GRA_BLT_BBO_IGNORE )
        ENDCASE
  NEXT n

  // close page and sent it to printer
  IF ::lInternalPS == .T.
     ::oPS:device():endDoc()
  ENDIF
  ::aData := {}
RETURN
//------------------------------------------------------------ // neu hinzugefügt, war nicht vorhanden
CLASS METHOD MYPrinter2:StartDoc(cText,nSetPageNo)
    local cAltDrive, cAltDir, cResetDir
    local uReturn := SELF
    aDATA := CText
    DEFAULT cText TO ::SpoolJobName
    DEFAULT nSetPageNo TO 1
    cAltDrive := curdrive()
    cAltDir   := curdir()
    ::nPageNo := nSetPageNo
    ::IsOpenStartDoc := .t.
   ::cPrinterShowText := cText


    if cAltDrive # curdrive() .or. cAltDir # curdir()
       cResetDir := cAltDrive +":\"+ cAltDir
       curdrive(cAltDrive)
       curdir(cResetDir)
    endif
return uReturn
//------------------------------------------------------------ // neu hinzugefügt, war nicht vorhanden
CLASS METHOD MyPrinter2:EndDoc()
    local uReturn := SELF
    ::IsOpenStartDoc := .f.
    if IsMethod(::oPS:device(),"EndDoc")
       uReturn := ::oPS:device():EndDoc()
    endif
return uReturn
//-------------------------------------------------------------
// now render the page and send it to the printer
CLASS METHOD MyPrinter2:newPage()
  LOCAL n,nMaxY, cTmp, nX, nY, nIndex

  IF(Len(::aData)==0)
    RETURN
  ENDIF

  nMaxY := ::aSize[2] - ::nDY

  // create new printer page
  IF ::lInternalPS == .T.
     ::oPS:device():startDoc()
  ENDIF
  IF(ValType(::Header)=="C")
    &(::Header)(::oPS)
  ENDIF
  FOR n:=1 TO Len(::aData)
      DO CASE
        CASE ::aData[n][1] == TEXT_DATA
          nX := ::aData[n][3]*::nDX
          nY := nMaxY - (::aData[n][2]*::nDY)
          DO WHILE .T.
             nIndex = At( Chr(27), ::aData[n][4] )
             IF nIndex > 0
                cTmp = SubStr( ::aData[n][4],1, nIndex -1 )
                ::PrintEsc( ::aData[n][4][nIndex+1] )

                // NOTE: We throw away anything right of the Escape code
                // so basically this only works if escape codes are send
                // seperately.
                // Original code was: ::aData[n][4] = SubStr( ::aData[n][4], nIndex +2 )
                ::aData[n][4] = ""
             ELSE
                cTmp := ::aData[n][4]
                ::aData[n][4] = ""
             ENDIF

             GraStringAt( ::oPS, {nX,nY}, cTmp )

             IF Len(::aData[n][4]) == 0
               EXIT
             ENDIF

             nX += Len(cTmp) * ::nDY
          ENDDO
        CASE ::aData[n][1] == IMAGE_DATA
           ::aData[n][3]:Draw( ::oPS, ::aData[n][2],,, GRA_BLT_BBO_IGNORE )
        ENDCASE
  NEXT n

  // close page and sent it to printer
  IF ::lInternalPS == .T.
     ::oPS:device():endDoc()
  ENDIF
  ::aData := {}
RETURN

usw...
//
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 56
Registriert: Fr, 26. Jul 2013 11:03

Re: PDF-Druck und Pfad der PDF

Beitragvon Werner_Bayern » Sa, 26. Mär 2016 14:50

Servus Micha,

woher kommt
SetfilePrinter
?

Kann ich in Deinem Code nicht finden.
es grüßt euch

Werner
Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1211
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: PDF-Druck und Pfad der PDF

Beitragvon MichaMB » Do, 31. Mär 2016 10:24

Sorry Werner,
das war natürlich ein Schreibfehler in der Fehlermeldung! (habe es in der Originalanfrage geändert)
Fehlermeldung kommt:
Fehler Base/2266
Beschreibung:Empfänger der Nachrichten ist kein Objekt
Operation: setprintfile
Thread ID 1:
aufgerufen von dem Programm in der Zeile 433:
store cPfad + cPFD to wohin

//433/ oPrinter:setprintfile(wohin)
oPrinter:startDoc(kuntext1)

lg
Micha
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 56
Registriert: Fr, 26. Jul 2013 11:03

Re: PDF-Druck und Pfad der PDF

Beitragvon Werner_Bayern » Sa, 02. Apr 2016 14:44

Servus Micha,

komische Fehlermeldung. Entweder müsste es heißen, dass setprintfile keine Methode oder oPrinter kein Objekt ist.

Ich würde sagen, dass oPrinter kein Objekt zu dem Zeitpunkt ist. Was sagt der Debugger?
es grüßt euch

Werner
Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1211
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern


Zurück zu Drucken und Export

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron