Entwickler-Ecke
Windows API - Druckereigenschaften Papiergröße einstellen
Miri - Fr 22.06.07 17:19
Titel: Druckereigenschaften Papiergröße einstellen
Hi zusammen,
kämpfe gerade gegen einen uralten Nadeldrucker. (NEC P20 oder so)
Das Drucken an sich ist nicht das Problem, sondern die Druckereinstellungen.
Das Vieh soll auf ca. 4*9cm großes Endlos-Etiketten-Papier drucken. Gut und schön. Über die Druckereinstellungen ein neues Papierformat definiert (das zu finden war schon ne Kunst!), und auf gleichem Wege das neue Format für den Drucker als Standard definiert.
Nu nen PrintDialog aufs Form geklatscht, und so weiter, dann ausprobieren. PrintDialog öffnet sich, um sicher zu gehen guck ich nochmal in die Druckereinstellungen und was ist? Da steht die Papiergröße wieder auf A4. Da kann ich das jetzt zwar wieder umstellen und dann funktioniert das mit dem Drucken, aber ehrlich gesagt, habe ich keine Lust, das jedes und jedes (und jedes) mal wieder einzustellen.
Lange Rede, kurzer Sinn:
Beim Googlen hab ich das hier gefunden:
http://www.delphipraxis.net/post738996.html, darin wurde dann darauf
http://reweb.fh-weingarten.de/toolbox/projekte/xprintset/index.html verwiesen. Zum einen kostet das aber Geld (ok, 10€ könnte sogar ich noch locker machen), und zum anderen müsste ich dann ja noch auf das Heft warten...
Ach ja... und das hier
http://support.microsoft.com/kb/140285 hab ich auch noch gefunden, da blicke ich aber beim besten Willen nicht durch. Falls das mein Problem lösen kann, könnte mir das jemand erklären? Und falls nicht, gibt es einen anderen Weg, auch aus Delphi heraus direkt auf dieses verdammte Papierformat zuzugreifen?
Gruß,
Miri
Edit:
Mir ist gerade noch was aufgefallen:
Wenn ich den Drucker als Standard-Drucker festlege, funktioniert es! :gruebel: Aber auch nur dann... und ich will den nicht als Standard-Drucker *grml*
M. Raab - So 24.06.07 09:15
Hallo
ich habe im Torry Net das gefunden:
http://www.torry.net/quicksearchd.php?String=set+printer&Title=Yes
In der Delphi Hilfe findest Du zudem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| property Papers: TStrings; Default (list of paper sizes supported by the default printer) Category Printer Description This property will return a TStringList of paper sizes that are supported by the current printer. See also
TBaseReport Class, SelectPaper, SupportPaper, TStrings Example (Delphi)
ListBox2.Items := RvNDRWriter1.Papers;
Example (C++Builder)
ListBox2->Items = RvNDRWriter1->Papers; |
Mit der Printer Box wählst Du den Drucker aus und stellst dann vom Deinem Programm aus die Seitengröße des ausgewählten Druckes ein.
Gruss
Markus
Miri - Mo 25.06.07 07:56
Hey, danke! Werd mir das bei Gelegenheit anschauen und berichten! :-)
Matthias - Di 26.06.07 22:54
Hallo,
hier eine Funktion, die ich mal vor längerer Zeit geschrieben habe.
Immer, wenn ich den Drucker verwende benutze ich diese.
Matthias
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| procedure SetupPrinter(PaperSize, PaperWidth, PaperHeight, PrinterBin, Orientation: Integer); var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE; begin Printer.PrinterIndex := Printer.PrinterIndex; Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin pDMode^.dmFields := pDMode^.dmFields or DM_ORIENTATION; pDMode^.dmOrientation := Orientation;
pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH; pDMode^.dmPaperSize := PaperSize; pDMode^.dmPaperWidth := PaperWidth; pDMode^.dmPaperLength := PaperHeight;
pDMode^.dmFields := pDMode^.dmFields or DM_DEFAULTSOURCE; pDMode^.dmDefaultSource := PrinterBin; GlobalUnlock(hDMode); end; end; Printer.PrinterIndex := Printer.PrinterIndex; end; |
Rupert - Mi 25.03.09 16:53
Hallo miteinander!
Das Thema scheint ja beinahe älter zu sein as das Forum ;-)
... dennoch glaubte ich, das die gezeigte Routine funktioniert - tut es aber nicht.
Der Drucker ist ein Smart Label Printer 220 auf COM1. Ich soll auf ein Etikett Drucken Maß = 54 x 70. Trotz vorgeschalteter Auswahlroutinen und reverse Abfrage, ob das Papier auch eingestellt ist, glaubt der Drucker während des Drucks, dass er auf ein Etikett 28 x 89 druckt. Das ist der erste Papiertyp in der Liste aller auswählbaren Typen.
Einstellen tue ich das 3. Papier - an mehreren Positionen in der Druckroutine getestet - erfolglos.
Gibt es andere Möglichkeiten, das Papierformat zu setzen?
Das ist die Druckroutine
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| For i:=1 to (strtoint(A_Anz_Aufkleber.Text)) do begin with Printer do begin orientation:=poLandscape; Zl := 3*18; Canvas.Font.Name:='Arial'; Canvas.Font.Size:= 10; BeginDoc; Canvas.Draw(logox,logoy,Firmenlogo.Picture.Graphic); Canvas.TextOut (IdentNrx,IdentNry,'Ident-Nr. '); Canvas.Font.Style := [fsBold]; Canvas.TextOut (A_Label_Identx,IdentNry,A_Label_Ident.Caption); Canvas.Font.Style := []; Canvas.TextOut (Mengex,Mengey,'Menge: '); Canvas.Font.Style := [fsBold]; Canvas.TextOut (A_Label_Identx,Mengey,A_Label_Menge.Caption); Canvas.Font.Style := []; Canvas.TextOut (Memo1x,Memo1y,Memo1.Lines.Strings[0]); Canvas.TextOut (Memo1x,Memo2y,Memo1.Lines.Strings[1]); Canvas.TextOut (Memo1x,Memo3y,Memo1.Lines.Strings[2]); if A_Label_Masch.Caption <> '' then Canvas.TextOut (MaschNrx,MaschNry,'Masch-Nr: '+A_Label_Masch.Caption); if A_Label_Type.Caption <> '' then Canvas.TextOut (Typex,Typey,'Type: '+A_Label_Type.Caption); end; Printer.EndDoc; end; |
Hier wird der Drucker gewählt (soll später entfallen - wenn´s funktioniert)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Druckerlisten_Click(Sender: TObject);
begin printer.printerindex := Druckerbox.itemindex; A_Druck_Button.Caption:= 'Drucken auf: '+ Druckerbox.Items[Druckerbox.itemindex]; Getpapernames(ListBox1.Items); ASetupPrinter(DMPAPER_USER,54,70,0,DMORIENT_LANDSCAPE); setPapertype(2); Listbox1.ItemIndex:= 2; end; |
Diese beiden Routinen stammen aus dem Forum
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69:
| /*************************************************************** procedure TForm1.ASetupPrinter(PaperSize, PaperWidth, PaperHeight, PrinterBin, Orientation: Integer); var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE; begin Printer.GetPrinter(Device, Driver, Port, hDMode); if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin pDMode^.dmFields := pDMode^.dmFields or DM_ORIENTATION; pDMode^.dmOrientation := Orientation;
pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH; pDMode^.dmPaperSize := PaperSize; pDMode^.dmPaperWidth := PaperWidth; pDMode^.dmPaperLength := PaperHeight;
GlobalUnlock(hDMode); end; end; Printer.PrinterIndex := Printer.PrinterIndex; end;
procedure TForm1.setPapertype(papierNr: integer); var aDevice: array[0..255] of char; aDriver: array[0..255] of char; aPort: array[0..255] of char; hDMode: THandle; PDMode: PDEVMODE; begin Printer.GetPrinter(aDevice, aDriver, aPort, hDMode); if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE; pDMode^.dmPaperSize := papierNr; GlobalUnlock(hDMode); end; end; end; |
GlasshouseManor - Do 26.03.09 23:29
Ich würde Dir empfehlen, XPrinter mal näher zu prüfen (Du hast es in Deinem ersten Beitrag schon erwähnt). Es gibt meines Wissens wenig Vernünftiges zum Druckerhandling. XPrinter ist zwar schon etwas älter, aber ich arbeite schon länger damit und finde es sehr praktikabel.
Reinhard Kern - Fr 27.03.09 03:02
Rupert hat folgendes geschrieben : |
Gibt es andere Möglichkeiten, das Papierformat zu setzen?
|
Hallo,
unschön (aber es soll ja auch Treiber geben, die nicht in allen Punkten korrekt funktionieren): du könntest nach der Initialisierung dem Drucker eine ESC-Sequenz mit dem richtigen Format schicken. Steht sicher im Handbuch.
Gruss Reinhard
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!