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:
//***************************************************************
// Stelle die Parameter des Duckers ein
// Parameter
//   PaperSize   : Feste Papergröße z.B. DMPAPER_A4
//   PaperWidth  : Papierbreite in 0,1 mm Schritten
//   PaperHeight : Papierhöhe in 0,1 mm Schritten
//                 PaperWidth und PaperHeight sind nur wirksam,
//                 wenn PaperSize = DMPAPER_USER ($100)
//   PrinterBin  : Papierschacht (dmDefaultSource)
//                 0 = Default
//   Orientation : Ausrichtung DMORIENT_PORTRAIT (1)
//                             DMORIENT_LANDSCAPE (2).

procedure SetupPrinter(PaperSize, PaperWidth, PaperHeight,
                       PrinterBin, Orientation: Integer);
var
  Device : array[0..255of char;
  Driver : array[0..255of char;                       
  Port   : array[0..255of 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;
  // Die Werte Übernehmen (Durch die folgende Zeile wird unteranderem
  // die Routine SetState aufgerufen, die dafür sorgt, das die Werte über-
  // nommen werden).
  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// 3 * 18 = 54
      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// with Printer
    Printer.EndDoc;
  end;  //for i:=

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);  // temporär zur kontrolle
  ASetupPrinter(DMPAPER_USER,54,70,0,DMORIENT_LANDSCAPE);
  setPapertype(2); // Papierauswahl
  Listbox1.ItemIndex:= 2// Markieren in der  Papierlistbox
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:
/***************************************************************
// Stelle die Parameter des Duckers ein
// Parameter
//   PaperSize   : Feste Papergröße z.B. DMPAPER_A4
//   PaperWidth  : Papierbreite in 0,1 mm Schritten
//   PaperHeight : Papierhöhe in 0,1 mm Schritten
//                 PaperWidth und PaperHeight sind nur wirksam,
//                 wenn PaperSize = DMPAPER_USER ($100)
//   PrinterBin  : Papierschacht (dmDefaultSource)
//                 0 = Default
//   Orientation : Ausrichtung DMORIENT_PORTRAIT (1)
//                             DMORIENT_LANDSCAPE (2).
procedure TForm1.ASetupPrinter(PaperSize, PaperWidth, PaperHeight,
                       PrinterBin, Orientation: Integer);
var
  Device : array[0..255of char;
  Driver : array[0..255of char;
  Port   : array[0..255of char;
  hDMode : THandle;
  PDMode : PDEVMODE;
begin
//  exit;
//  Printer.PrinterIndex := -1;
  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;
  // Die Werte Übernehmen (Durch die folgende Zeile wird unteranderem
  // die Routine SetState aufgerufen, die dafür sorgt, das die Werte über-
  // nommen werden).
  Printer.PrinterIndex := Printer.PrinterIndex;
end;

procedure TForm1.setPapertype(papierNr: integer);
var
  aDevice: array[0..255of char;
  aDriver: array[0..255of char;
  aPort:   array[0..255of 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

user profile iconRupert hat folgendes geschrieben Zum zitierten Posting springen:
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