zu verwendeten Drucker setzen?
-
Hallo,
ich möchte gern aus meiner Anwendung heraus einen vorhandenen Drucker auswählen, der das Dokument drucken soll. Dazu wird man ja das Objekt Printer() nutzen müssen. Dieses nutze ich auch, um mir die vorhandenen Drucker auflisten zu lassen:TPrinter *drucker = Printer(); AnsiString Name = drucker->Printers->GetText(); ShowMessage(AnsiString("Drucker: " + Name));
Mit
drucker->PrinterIndex
lässt sich der gewählte Drucker (Aus dem TPrintDialog) ja identifizieren.
Meine Frage ist nun, wie ich denn einen vorhandenen Drucker als Ausgabegerät setzen kann? Das geht wohl mit
SetPrinerA()
, wo ich aber leider nicht klar komme. Hat da jemand einen Rat???
Danke und Gruß
Torsten
-
Jau, hat einer. TPrinter führt eine Liste der installierten Drucker (
Printers
). Du kannst einen Drucker aus dieser Liste auswählen, indem du dem AttributPrinterIndex
des globalen Printer Objekts einen Wert zuweist, der dem Index des Druckers in derPrinters
Liste entspricht.
-
Super, hat funktioniert.
Danke
-
Zu früh gefreut
Ich konnte jetzt folgendes Phänomen feststellen:
Wenn ich meinen Labeldrucker vor dem Drucken als Standartdrucker festlege, druckt er die Labels wie gehabt korrekt.
Wenn ich aber einen anderen Drucker als Standartdrucker definiert habe und über den Druckerdialog (und meinem Code) den Labeldrucker als Ausgabegerät wähle://Drucker-Dialog aufrufen und Drucker wählen PD1->Execute(); //Drucker-Index ermitteln int indexP = Printer()->PrinterIndex; //gewählten Drucker per Index setzen Printer()->PrinterIndex = indexP;
...wird das Etikett nicht vollständig gedruckt. Nur die erste Zeile und danach nix mehr
Torsten
-
torsten_156 schrieb:
Zu früh gefreut
//Drucker-Dialog aufrufen und Drucker wählen PD1->Execute(); //Drucker-Index ermitteln int indexP = Printer()->PrinterIndex; //gewählten Drucker per Index setzen Printer()->PrinterIndex = indexP;
Das sieht komisch aus... eigentlich machst du ja nichts anderes, als
Print()->PrinterIndex = Print()->PrinterIndex;
-
Wenn man's genau nimmt, stimmt
Demnach reicht es dann wohl aus, wenn man über den PrinterDialog den zu verwendenden Drucker auswählt. Dann kann ich mir den Code ja schenken. Allerdings druckt mein Programm so auf den Drucker, den ich ausgewählt habe
Ich werde morgen mal prüfen was gedruckt wird, wenn ich nur den PrinterDialog zur Auswahl nutze...
Gruß
Torsten
-
So, ich habe jetzt nochmal geprüft, ob es einen Unterschied macht, wenn ich den oben beschriebenen Code weg lasse und nur den Drucker über den PrinterDialog auswähle. Ich habe festgestellt, dass mein Etikett nur korrekt gedruckt wird, wenn der Drucker als "Standartdrucker" definiert ist.
Das würde jetzt für mich bedeuten, dass ich den über den PrinterDialog ausgewählten Drucker per Code als "Standartdrucker" definiere und nach erfolgtem Druck diese Einstellung wieder rückgängig mache.Nur wie stelle ich das an???
Gruß
Torsten
-
Nein, das kann so (generell) nicht stimmen. In dem Fall, wo ich den Drucker per Dialog auswähle druckt das Programm auch auf dem Drucker.
Den Windows Standarddrucker kannst du über die Win32 API FunktionSetDefaultPrinter
setzen.Edit:
Wie druckst du denn überhaupt?
-
Ich drucke wie folgt:
//drucken... int x=0; int vSize, vAnzahl; if(!Printer()->Printing) { Printer()->BeginDoc(); while (x < DS) { Werte_setzen(x); LB1->Selected[x]=true; vAnzahl = vKurztext.Length(); if (vAnzahl <= 29) { vSize = 8; } if (vAnzahl >29 && vAnzahl <=35) { vSize = 7; } if (vAnzahl > 35) { vSize = 6; } Print_Etikett(vKurztext,vLagerplatz,vMB,vHB,vMatNr,vSize); x++; Printer()->NewPage(); LB1->Selected[x-1]=false; }//while Printer()->EndDoc(); }//if else { MessageDlg("Es ist ein Fehler aufgetreten.",mtError ,TMsgDlgButtons() << mbOK,0); Close(); }
Das liefert mir auf dem Standartdrucker auch immer das korrekte Ergebnis. Leider nur da.
Jetzt wollte ich mal den Standartdrucker setzen und habe es so versucht:bool gesetzt = SetDefaultPrinter("\\maraprt01\marp227C");
Nur leider bekomme ich immer ein false zurück. Aber auch keine Fehlermeldung...?
-
Achtung, doppelte Backslashes beachten. Der Druckername wird so mit Sicherheit nicht akzeptiert. Ein Blick in die MSDN hätte dir auch verraten, dass du über die Funktion
GetLastError
detaillierte Fehlerinformationen abfragen kannst.
Was passiert denn, wenn duSetDefaultPrinter
einen Eintrag aus der ListePrinter()->Printers
übergibst?
-
ok, das mit GetLastError werde ich versuchen. Den Druckernamen, den ich mit doppelBackslash angegeben habe, stammt aus Printer->Printers. Auch wenn ich nur den Druckername ohne \\maraapp\ angebe, funktioniert es nicht.Gruß
-
DocShoe meint, daß du die Backslashs selber escapen mußt, also z.B.
"\\\\maraprt01\\marp227C"
-
Th69 schrieb:
DocShoe meint, daß du die Backslashs selber escapen mußt, also z.B.
"\\\\maraprt01\\marp227C"
So, geanu das mit den \\\...\.. hat gefehlt. So nimmt er jetzt auch den Drucker.
Ich gehe nun wie folgt vor:
1. Standartdrucker mitGetDefaultPrinter()
sichern
2. Zebra-Drucker mitSetDefaultPrinter()
setzen
3. Etikett drucken
4. Gesicherten Standartdrucker wieder mitSetDefaultPrinter()
setzen
Vielen Dank für eure Hilfe
Torsten