Settings aus PrinterSetupDialog oder PrintDialog abspeichern.
-
Ich muss Euch nochmal nerven.
Ich suche nun schon seit 1 Woche eine Lösung für ein Problem das imho bei einigen Programm anliegen sollte.
Ich möchte Druckereinstellungen aus PrinterSetupDialog oder PrintDialog in irgend einer Form abspeichern und neu Einladen. So das diese nach dem Programmstart zur Verfügung stehen.
Nach der ganzen Sucherei habe ich 3 Möglichkeiten gefunden.
Das erste ist ein Tip von MS mit der WindowsAPI :
http://support.microsoft.com/kb/140285/de
Hier habe ich das Problem das ich ja nicht einzelne sondern alle Settings speichern und laden möchte.
Ich habe hier versucht die PRINTER_INFO_2 Struktur mit einem FileStream zu sichern und neu zu laden, was aber leider fehlgeschlagen ist.Der 2. Lösungsansatz - via ShellExecute und rundll32
http://www.gruppenrichtlinien.de/index.html?/HowTo/rundll32_printui.htmHier habe ich die rundll32 genutzt um zu speichern und zu laden.
Das gibt zumindestens keine Fehler und eine .dat Datei wird auch geschrieben - Im Programm ändert sich aber nichts.Der 3. Lösungsansatz ist komplett Delphi und daher für mich schwer nachvollziehbar :
http://www.swissdelphicenter.ch/de/showcode.php?id=1571
Nun die Frage - wie macht Ihr das - bzw. habt Ihr sowas schonmal gemacht ?
Ich kann mir vorstellen das man soetwas häufiger benötigt.
Desto verwunderter war ich über die wenigen Infos darüber im Netz.Wenn Ihr also eine Lösung habt - lasst mich teilhaben, oder wir versuchen eine der Ansätze mal aufzugreifen in in c++ umzusetzen. Ich habe auch zu den ersten beiden Lösungen schon Ansätze die ich bei Bedarf gererne posten kann.
Cu
T
-
Hallo,
Im Delphi-Beispiel ist doch geschrieben wie es geht. Du brauchst daraus eigentlich nur die beiden Methoden GetPrinter und SetPrinter von TPrinter. Die darin befindlichen Parameter stellen die Druckereinstellungen dar. Wie du die dann speicherst ist dann deine Sache.
-
Ich kenne Delphi nicht - und habe daher so meine Probleme bei der Umsetzung in C++ - aber ich arbeite daran.
CU
T
-
Ich habe jetzt mal mit dem Microsoft Beispiel angefangen.
Habe eine Form aufgemacht mit einem Button für einen PrinterSetupDialog.
Und einen Button um die Folgende Funktion aufzrufen.
Bei der Funktion lese ich Daten aus dem DEVMODE aus und schreibe Sie in ein Memo Feld.Das Problem -> Es ändert sich nicht so wie ich will.
LPTSTR pPrinterName = Printer()->Printers->Strings[Printer()->PrinterIndex].c_str(); HANDLE hPrinter = NULL; DWORD dwNeeded = 0; DEVMODE *pDevMode = NULL; PRINTER_DEFAULTS pd; BOOL bFlag; LONG lFlag; // Open printer handle (on Windows NT, you need full-access because you // will eventually use SetPrinter)... ZeroMemory(&pd, sizeof(pd)); pd.DesiredAccess = PRINTER_ALL_ACCESS; bFlag = OpenPrinter(pPrinterName, &hPrinter, &pd); if (!bFlag || (hPrinter == NULL)) return; dwNeeded = DocumentProperties(NULL, hPrinter,pPrinterName,NULL, NULL, 0); if (dwNeeded <= 0) { ClosePrinter(hPrinter); return; } pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded); if (pDevMode == NULL) { ClosePrinter(hPrinter); return; } lFlag = DocumentProperties(NULL, hPrinter,pPrinterName,pDevMode, NULL,DM_OUT_BUFFER); if (lFlag != IDOK || pDevMode == NULL) { GlobalFree(pDevMode); ClosePrinter(hPrinter); return; } AnsiString Druckername = (char * )pDevMode->dmDeviceName; AnsiString FormName = (char * )pDevMode->dmFormName; Memo1->Lines->Add("Drucker " +Druckername+ " im Speicher"); Memo1->Lines->Add("Form " +FormName); Memo1->Lines->Add("Papierweite " +AnsiString(pDevMode->dmPaperWidth)); Memo1->Lines->Add("Kopien " +AnsiString(pDevMode->dmCopies)); // Clean up... if (hPrinter) ClosePrinter(hPrinter); if (pDevMode) GlobalFree(pDevMode);
pDevMode->dmDeviceName ist immer der Richtige Druckername wie im Dialog ausgewählt.
pDevMode->dmFormName ist immer A4 egal was ich einstelle.
pDevMode->dmPaperWidth ist solange 0 bis ich den Drucker im Dialog wechsel.
pDevMode->dmCopies ist immer 1 egal was ich einstelle.
Die Frage ist was mach ich Falsch ? Muss ich irgendwas aktualisieren oder ändern.
ICh brauche ja nicht versuchen Die DEVMODE Struktur zu speichern wenn diese nicht die aktuellen Werte enthält.
CU
Torsten
-
Scheint zwar keinen so richtig zu interessiern aber ich schreib meine Erkenntnisse mal weiter - evtl. findet sich ja einer der was dazu sagen kann.
Also das Problem mit den sich nicht verändernden Werten kommt von :
OpenPrinter(pPrinterName, &hPrinter, &pd);
Der öffnet nämlich den Defaultprinter aus dem System.
Folglich enthält die DEVMODE Struktur auch die Standardeinstellungen des Druckers.Und nicht die Einstellungen innerhalb der Anwendung.
Nun stellt sich natürlich die Frage - wie komme ich an die Druckerinstanz der Anwendungen ?
Mein erster Gedanke : Printer()->Handle
geht aber irgendwie nicht.
DocumentProperties(NULL, Printer()->Handle ,pPrinterName,NULL, NULL, 0);
Meldet eine 4 GB große DEVMODE Struktur
Das geht ja nu nich.Und was nu ?
CU
Torsten