Autor Beitrag
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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! :gruebel: Aber auch nur dann... und ich will den nicht als Standard-Drucker *grml*

_________________
Anonymes Eckenkind
M. Raab
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Mo 25.06.07 07:56 
Hey, danke! Werd mir das bei Gelegenheit anschauen und berichten! :-)

_________________
Anonymes Eckenkind
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: 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

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Netware, Linux, WIN A-Z, DOS
Delphi 2005- Delphi 2009
BeitragVerfasst: 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
ausblenden 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)
ausblenden 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
ausblenden volle Höhe 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;

_________________
Grüße Rupert
GlasshouseManor
Hält's aus hier
Beiträge: 10


Delphi Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: 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