Filename in XbpPrintDialog() [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Filename in XbpPrintDialog() [erledigt]

Beitrag von Wolfgang_B »

Hallo,
kann mir jemand sagen, wie ich aus einem XbpPrintDialog() den Namen der Datei herausbekomme, welcher beim Drucken in eine Datei vergeben wurde?

Hintergrund ist, daß ich nach einem Druck in eine PDF-Datei mit "Windows Print to PDF" dem Anwender einen Hinweis geben will, welchen Namen er der Datei und wohin er diese geschrieben hat.

Besten Dank im Voraus!
Zuletzt geändert von Wolfgang_B am Mo, 04. Feb 2019 15:04, insgesamt 1-mal geändert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Filename in XbpPrintDialog()

Beitrag von AUGE_OHR »

moin,

ein fertige Lösung habe ich leider nicht aber paar Such Begriffe und Links

XbpPrinterDialog(), XbpFileDialog(), XbpFontDialog(), XbpColorDialog() gehören zu der Grupper von "Common Dialog"
https://docs.microsoft.com/en-us/window ... ox-library

Alaska hat die XbParts nun so gekapselt das es schwer (oder unmöglich) ist die aufzubohren.
wenn man das nun mit ot4xb machen würde sind das die Quellen

die PrintDlg function
https://msdn.microsoft.com/en-us/librar ... s.85).aspx

nutzt ja die Structure PRINTDLGA
https://docs.microsoft.com/de-de/window ... dlg-tagpda

wenn du aber irgendwo in einem Common Dialog ein Filenamen eingeben kannst ist es IMHO die "gewöhnliche" GetSaveFileNameA Function
https://docs.microsoft.com/de-de/window ... lg-tagofna

wenn du nun nach einem File Namen suchst müsste der in der OPENFILENAMEA Structure stehen
Type: LPTSTR

The file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary. When the GetOpenFileName or GetSaveFileName function returns successfully, this buffer contains the drive designator, path, file name, and extension of the selected file.
das wären wohl die benötigten Bausteine für das Puzzle.

have fun
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Filename in XbpPrintDialog()

Beitrag von Tom »

Ich glaube nicht, dass der Dateiauswahldialog oder die Dateispeicherung noch irgendwas mit dem Printerdialog zu tun haben. Das ist eher eine Sache des Treibers.
Herzlich,
Tom
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Filename in XbpPrintDialog()

Beitrag von ramses »

Oder das ganze umgekehrt angehen.

PDF-Creator oder Win2pdf installieren denen kann man den Filenamen zum speichern vorgeben. Also den FileDialog in Xbase öffnen. Dann kennst du den Filenamen und der Treiber speichert das PDF ohne weitere Nachfragen.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Filename in XbpPrintDialog()

Beitrag von Tom »

Oder mit L&L, da geht das auch.
Herzlich,
Tom
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Filename in XbpPrintDialog()

Beitrag von ramses »

L&L wäre auch meine Wahl. Aber dazu musst du natürlich die ganze Druckausgabe komplett umbauen. Das Speichern einer "normalen" Druckausgabe aus Xbase-Parts über PDF-Creator benötigt nur einige zusätliche Zeilen Code für das Abfragen und setzten des Filenamens. Die Druckausgabe selbst kann bleiben wie Sie ist.....

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Filename in XbpPrintDialog()

Beitrag von Tom »

Kann Huberts Klasse das nicht auch?
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Filename in XbpPrintDialog()

Beitrag von brandelh »

Hallo Tom,

Die HBPrintPDF (benötigt QuickPDF) nutzt den übergebenen Dateinamen, aber eben nicht die Druckausgaben von XbPrinter(), da muss wie in L&L eine eigene Syntax genutzt werden.
Meine Druckerklasse HBPrinter() benötigt für PDF Erzeugung einen PDF Druckertreiber.
PDF-Creator oder Win2pdf installieren denen kann man den Filenamen zum speichern vorgeben.
wie sieht da die Syntax aus ?
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Filename in XbpPrintDialog()

Beitrag von ramses »

Da gibt es 2 Möglichkeiten. Steuerung über Registry-Einträge oder bei PDF-Creator über Active-X.

Da aber beides nur als ABSOLUTE Single-User Lösung fünktioniert verwende ich beides nicht mehr. Single-User heisst: auf einem PC kann gleichzeitig global nur 1 Job gedruckt werden.


Der Code für Active-X sah etwa wie folgt aus. KEINE FUNKTIONSGARANTIE! Ich habe die Logfunktionen aus dem Code entfernt, keine Ahnung ob ich dabei dabei nicht zuviel oder zuwenig rausgeschnitten habe. Ich habe den so geänderten Code nicht compiliert oder getestet.

Code: Alles auswählen

#include "DLL.CH"

#pragma Library( "ascom10.lib" )

// Funktion für Autosave Druckausgabe als PDF File 

// Aufruf vor Druckausgabe:   win2pdfCreator( 1, "E:\pdf-out\Ausgabe.pdf" )   

// Aufruf nach Druckausgabe:  win2pdfCreator( 0 )

// Ausgabefilename darf nur 1 Punkt enthalten --> überzählige Punkte werden durch X ersetzt. 
// 



function win2pdfCreator( xwas, pdffile )  // 1 = Open  0 = CLose,   Filename 
local regvarname := ""
local  a, dn, fn, oPdf, ii
local  bAlterFehlerblock := ErrorBlock()

   static pdf_creator_fname
   static pdf_creator_obj

    ErrorBlock({|oError|pdfcreator(oError)})
    begin sequence
  
    if xWas = 1   // Open

          pdf_creator_fname := pdfFile  // Filename

          // Filename darf nur 1 Punkt enthalten, für PDFCreator mit X ersetzten
          ii := 0
          for a = 1 to len(pdfFile)-4
              if substr(pdfFile,a,1) = "."
                 ii ++
                 pdfFile := stuff(pdfFile,a,1,"X")
              endif
          next
          if ii != 0
              filedelete( pdfFile )
          endif

          //  ----------------------------------


          a := rat("\" , pdfFile )
          if a != 0
              dn := left( pdfFile, a-1 )
              if !substr(dn,2,1) == ":" .and. len(dn) > 2
                   dn := diskname()+":" + dn
              endif
              fn := right( pdfFile, len(pdfFile)-a )    // Filename
          endif

          a := 0
          do while file( pdfFile ) .and. a < 20 // Filename löschen
              filedelete( pdfFile )
              sleep(20)
              a++
          enddo
          if a > 19
             msgbox( "Fehler: Vorhandenes File: "+pdfFile+"; kann vor dem neu erstellen nicht gelöscht werden. Prfen Sie das PDF-File.")
          endif
          
          pdf_creator_fname  := pdfFile   // Filename
     
         
          if pdf_creator_obj = NIL

                oPdf := CreateObject( "PDFCreator.clsPDFCreator" )
                if oPdf == NIL
                    msgbox("Fataler-Fehler: PDFCreator ist nicht installiert oder ActiveX ist dektiviert oder gesperrt.")
                    quit
                endif
          endif

          ** oPdf:cwindowstate := 1   // Fenster anzeigen = 0

          if !oPdf:cStart( "/NoProcessingAtStartup" )
                opdf:cClearCache()
                if  DllCall("Shell32.dll", DLL_STDCALL, "ShellExecuteA", AppDesktop():GetHWnd(), "open", "taskkill.exe", "/f /im PDFCreator.exe", nil, 1) < 32
                    msgbox("Fataler-Fehler beim löschen des PDF-Tasks, Fehlende Rechte. Programm wird beendet.")
                    quit
                endif
                oPdf:Destroy()
                sleep(200)
                oPdf := CreateObject( "PDFCreator.clsPDFCreator" )
                if !oPdf:cStart( "/NoProcessingAtStartup" )
                    oPdf:Destroy()
                    msgbox("Fataler-Fehler: PDFCreator kann nicht initialisiert werden oder ActiveX ist dektiviert oder gesperrt.")
                    quit
                endif
          endif

          opdf:setproperty( 'cOption', 'UseAutosave', 1 )
          opdf:setproperty( 'cOption', 'UseAutosaveDirectory', 1 )
          opdf:setproperty( 'cOption', 'AutosaveFormat', 0 )
          ** opdf:setproperty( 'cDefaultprinter', 'PDFCreator' )
          opdf:setproperty( 'cPrinterStop', .t. )
          opdf:cClearCache()
          opdf:setproperty( 'cOption', 'AutosaveDirectory', dn )
          opdf:setproperty( 'cOption', 'AutosaveFilename' , fn )
          opdf:setproperty( 'cOption',"AutosaveStartStandardProgram",  0 )
          oPdf:setproperty( "cOption","SendEmailAfterAutoSaving", 0 )

          *opdf:cSaveOptions()

          pdf_creator_obj := oPdf

    else

          oPdf := pdf_creator_obj

          if oPdf != NIL
 

                //  'Wait until the print job has entered the print queue
                a := 0
                do while  oPdf:cCountOfPrintjobs < 1
                    sleep(10)
                    a++
                    if a > 20
                      msgbox("Fehler: Druckjob wird nicht sichtbar! Haben Sie PDFCreator Version 1.7.0 oder höher installiert?")
                      a := 0
                    endif
                enddo

                opdf:setproperty( 'cPrinterStop', .f. )

                //  'Wait until PDF creator is finished then release the objects
                a := 0
                do while  oPdf:cCountOfPrintjobs != 0
                    sleep(10)
                    a++
                    if a > 20
                      msgbox("Fehler: Druckjob wird nicht abgearbeitet! Haben Sie PDFCreator Version 1.7.0 oder höher installiert?")
                      a := 0
                    endif
                enddo

                if pdf_creator_fname  != NIL
                // Test ist file vorhanden
                 if !file(pdf_creator_fname)
                     msgbox(  "Das Pdf-File wurde/konnte nicht erstellt werden!;"+pdf_creator_fname,"Fehler")
                  endif
                endif
                // Autosave ausschalten
                opdf:setproperty( 'cOption', 'UseAutosave', 0 )

                // Close                         
                oPdf:cClose()
                oPdf:Destroy()
                pdf_creator_obj := nil 

          endif
	 endif


    end sequence

    ErrorBlock(bAlterFehlerblock)

return(.t.)

static function pdfcreator(oError)
      msgbox("Im PDF-Creator: " + oError:description + " Bei der Ausführung von: " + oError:operation + " Programm wird beendet." )
      quit
      ** break()
    return(NIL)
Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Filename in XbpPrintDialog()

Beitrag von brandelh »

AHA immer genau 1 Name für alles was gedruckt wird ... und danach umbenennen ... nicht schön
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Filename in XbpPrintDialog()

Beitrag von ramses »

Es haben nur Namen wie Ausdruck.pdf nicht aber Ausdruck-12.12.12.pdf funktioniert. Ob dies nun immer noch so ist weiss ich nicht. Für mich war viel schlimmer dass pro PC gleichzeitig nur 1 Audruck möglich ist und vorallem das Active-X für Web-App nicht gangbar und viel zu langsam ist auch daher weil man auf "ich habe fertig" des Creator's warten muss.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Filename in XbpPrintDialog()

Beitrag von Koverhage »

Ich mache das indem ich bei PDF Creator / PDF24, etc. Autospeicherung auf J setze
und dementsprechend einen Ordner dafür vorgebe.
Der Dateiname wird ja von den Programmen automatisch gebildet,
z.B. Dokumententitle plus wählbare Attribute. etc. Die Attribute wie Datum, Uhrzeit, etc. werden
dem Dateinamen hinzugefügt. Ich habe noch keine Probleme mit damit gehabt das gleichzeitig
PDF Dateien erstellt werden soll.

Leider speichert Microsoft Print to PDF den Pfad nirgends (zumindest habe ich es nicht gefunden) wohin die PDF gespeichert wird.
An die Qualität der PDF Datei von Microsoft kommen zumindest die oben genannten Programme nicht heran.
Gruß
Klaus
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Filename in XbpPrintDialog()

Beitrag von ramses »

Hallo Klaus

das mit dem Auto-Speichern löst ja auch das ursprüngliche Problem von Wolfgang nicht, dass das Xbase Programm nach einer Filenamenzuordnung den Filenamen kennt. PDF-Creator einach so zu nutzen wie du schreibst läuft problemlos, sobald du aber den Filenamen vorgeben willst/musst oder dies sogar aus mehreren Threads machen musst beginnen die Probleme. Dies war damals einer der Gründe für mich auf L&L zu wechseln.....

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Filename in XbpPrintDialog()

Beitrag von Wolfgang_B »

Hallo,
erst mal vielen Dank für Eure Überlegungen. In Anbetracht der Komplexität der Sache werde ich auf die Anzeige des Dateinamens verzichten. Wäre ja auch nur ein kleines 'Zuckerl" für meine Kunden gewesen. :D

Betrachte die Sache erst mal als erledigt.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Antworten