Drucker über C-Builder XE Programm auswählen
-
Hallo,
über ein kleines Programm möchte ich vor dem Drucken den Drucker auswählen.
Dazu habe ich 10 Labels (mehr Drucker sind nicht vorhanden), die ich mit den Druckernamen fülle, und dann bei Klick auf ein Label den entsprechenden Drucker zum Standarddrucker mache. Nach dem Druck wird der originale Standarddrucker wiederhergestellt.
Alles funktioniert prächtig - aber nur ein Mal! Wird danach ein anderer Drucker für den nächsten Druck ausgewählt, wird statt dessen auf dem Drucker der ersten Wahl gedruckt.
Wird das Programm neu gestartet, geht wieder nur der Drucker, der zuerst ausgewählt wird für alle weiteren Ausdrucke.Hier der Code zum Füllen der Labels:
#include "Unit1.h" TPrinter *pPrinter = Printer(); // Zeiger auf das Druckerobjekt void __fastcall TForm25::Label30Click(TObject *Sender) { int i=0,j=0,k; char *druck = new char[500]; AnsiString ansidruck = pPrinter->Printers->GetText(); char *adruck = ansidruck.c_str(); while (adruck[i] != '\0' && j<10) { j++; k=0; while (adruck[i] != '\r' && adruck[i] != '\n' && adruck[i] != '\0' && k<498) druck[k++] = adruck[i++]; while (adruck[i] == '\r' || adruck[i] == '\n') i++; druck[k] = '\0'; switch (j) { case 1: Label44->Caption = AnsiString(druck); break; case 2: Label45->Caption = AnsiString(druck); break; ... case 10: Label53->Caption = AnsiString(druck); break; } } }
... und beim Druck auf ein Label wird Label->Caption an folgende Funktion übergeben:
//--------------------------------------------------------------------------- //-Diese Funktion sichert den Standarddrucker, setzt ihn auf Druckername, druckt, // und stellt den Standarddrucker wieder her //--------------------------------------------------------------------------- void __fastcall TForm25::DruckeAuf(AnsiString Druckername) { char *Standarddrucker = new char[500]; unsigned long pcchBuffer = 500; bool geklappt = GetDefaultPrinter(Standarddrucker,&pcchBuffer); if (geklappt) { bool auchgeklappt = SetDefaultPrinter(Druckername.c_str()); if (auchgeklappt) { Panel4->Caption = "Ausdruck gestartet ..."; Panel4->Repaint(); Ausdrucken(); if(SetDefaultPrinter(Standarddrucker)) Panel4->Caption = "Standarddrucker wiederhergestellt" } } }
Hat jemand eine Idee, warum das nur einmal klappt?
Vielen Dank für Eure Mühen
-
Warum so umständlich?
Wo das Problem in deinem Code liegt, kann ich dir nicht sagen, ich habe ihn zur Hälfte durchgeschaut und dann aufgegeben.Versuch es mal mit den Möglichkeiten, die das Printer-Objekt zur Verfügung stellt:
// Standarddrucker merken AnsiString asPrinterSelected; if(Printer()->PrinterIndex >= 0) asPrinterSelected = Printer()->Printers->Strings[Printer()->PrinterIndex]; // Drucker auslesen for(int i=0;i < Printer()->Printers->Count;i++) { if(i == 0) Label44->Caption = Printer()->Printers->Strings[i]; else if(i == 1) Label45->Caption = Printer()->Printers->Strings[i]; ... } // Angeklickter Drucker verwenden Printer()->PrinterIndex = Printer()->Printers->IndexOf(Label45->Caption); // Standarddrucker zurücksetzen if(asPrinterSelected.Length() > 0) Printer()->PrinterIndex = Printer()->Printers->IndexOf(asPrinterSelected);
-
Hm, ja die Druckernamen über die Stringliste zu holen ist natürlich wesentlich geschickter, als über den kompletten Text. Das hatte ich übersehen.
Mit dem Umschalten über den PrinterIndex funktioniert jetzt auch alles bestens, und der Fehler ist weg.Der Fehler lag definitiv bei GetDefaultPrinter/SetDefaultPrinter.
Warum das aber einmal funktioniert, und dann nicht mehr ist mir immer noch ein Rätsel.Vielen Dank für Deinen Vorschlag, er hat mir sehr geholfen.