Autor |
Beitrag |
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Fr 22.06.07 17:19
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: www.delphipraxis.net/post738996.html, darin wurde dann darauf reweb.fh-weingarten....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 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!  Aber auch nur dann... und ich will den nicht als Standard-Drucker *grml*
_________________ Anonymes Eckenkind
|
|
M. Raab
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: So 24.06.07 09:15
Hallo
ich habe im Torry Net das gefunden:
www.torry.net/quicks...rinter&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
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
Miri 
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Mo 25.06.07 07:56
Hey, danke! Werd mir das bei Gelegenheit anschauen und berichten! 
_________________ Anonymes Eckenkind
|
|
Matthias
      
Beiträge: 121
|
Verfasst: 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
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
      
Beiträge: 47
Erhaltene Danke: 1
Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
|
Verfasst: 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
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; |
_________________ Grüße Rupert
|
|
GlasshouseManor
Hält's aus hier
Beiträge: 10
Delphi Enterprise
|
Verfasst: 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
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: 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
|
|
|