Autor Beitrag
C++arsten
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: So 21.01.07 16:58 
Hallo, das ist der Code, mit dem ich drucken möchte:

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:
procedure TForm1.Button1Click(Sender: TObject);
var
    device, driver, port: array [0..255of char;
    hdmode              : THandle;
    pdmode              : PDevMode;
    dc                  : HDC;
begin
    //Druckerspeicher belegen
    Printer.GetPrinter(device, driver, port, hdmode);
    pdmode := GlobalLock(hdmode);
    pdmode^.dmFields := pdmode^.dmFields or dm_PaperSize;

    //Blatt einstellen
    Printer.Orientation := poPortrait;
    pDmode^.dmPaperSize := dmPaper_A4;
    pDMode^.dmDefaultSource := DMBIN_CASSETTE;

    //Drucken starten
    Printer.BeginDoc;

    SetBkMode(Printer.Canvas.Handle, TRANSPARENT);
    dc := GetDC(Printer.Handle);
    SetMapMode(dc, MM_LOMETRIC);

    Printer.Canvas.Font.Name := 'Arial';
    Printer.Canvas.Font.Style := [fsBold];
    Printer.Canvas.Font.Color := clBlack;
    Printer.Canvas.Font.Size := 12;
    Printer.Canvas.TextOut(500500'Hallo Welt'); //5cm von oben und links
  
    Printer.EndDoc;
end;

Ich habe dazu zwei Fragen:
a) Ist der Aufbau zum Drucken so korrekt?
b) Warum wird der Text "Hallo Welt" bei unterschiedlichen Treibern nicht immer 5 cm von oben und links ausgegeben? Je nach verwendetem Treiber ist die Ausgabe verschoben.

Danke.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 21.01.07 17:11 
Die Angabe der Pixel ist nicht gleichbedeutend mit der in CM. Wenn Du einen Drucker hast, der mit 720dpi die Seite druckt, druckt dieser den Text 500/720 Inch (500/720 * 2,54 cm) vom Seitenrand entfernt.

Du musst also entweder die Angabe manuell von cm in Pixel umrechnen oder die Canvas-Skalierung an metrische Maße anpassen. Dafür gibt's hier im Forum ne Beschreibung ...

P.S.: Könntest Du bitte Delphi-Quelltexte in Delphi-Tags einschließen???

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: So 21.01.07 17:23 
Danke erstmal für die Antwort.

Könntest du mir den link für die Antwort, von der du sprichst, senden?

Wie lautet die Syntax für Delphi-Codes hier?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 21.01.07 17:35 
user profile iconC++arsten hat folgendes geschrieben:
Danke erstmal für die Antwort.

Könntest du mir den link für die Antwort, von der du sprichst, senden?

Wie lautet die Syntax für Delphi-Codes hier?


Siehe Beitragseditor unter Abschnitt Bereiche ... Dort auf das + drücken oder <span class="inlineSyntax"><span class="codecomment">{PROTECTTAGdff2719234f2f133b6391905cd680265}</span></span> verwenden.

Du kannst Dir da mal den Thread (+Links darin) anschuen: www.delphi-forum.de/...mp;highlight=drucken

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Di 23.01.07 17:25 
Habe noch eine Frage:

Unter Win98 kann ich (mit dem Codefragment, s. o.) den A3-Schacht auswählen (DMBIN_LOWER) auf DIN-A3 drucken.

Unter XP hingegen wird der A3-Schacht nicht angesprochen. Das Papier wird immer vom A4-Schacht eingezogen.

Habe das Drucken verschiedentlich unter 98 und XP probiert. Sobald ich den Drucker an ein 98-System hänge läuft es, unter XP nicht. Warum?!?
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Mi 24.01.07 12:01 
Kannst du denn unter XP den Papierschacht nur von deinem Delphi-Programm aus nicht ansteuern oder generell nicht?

_________________
Anonymes Eckenkind
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 24.01.07 13:17 
user profile iconBenBE hat folgendes geschrieben:
Die Angabe der Pixel ist nicht gleichbedeutend mit der in CM. Wenn Du einen Drucker hast, der mit 720dpi die Seite druckt, druckt dieser den Text 500/720 Inch (500/720 * 2,54 cm) vom Seitenrand entfernt.

Ist bei seinem Code völlig unerheblich, da er den MapMode auf MM_LOMETRIC gesetzt hat.

Ich könnte mir nur vorstellen, dass die unterschiedlichen Drucktreiber unterschiedlich dicht am Rand drucken können und dass es so zu einer Verschiebung kommt.
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Mi 24.01.07 15:38 
Also, es ist zum Verzweifeln.
Ich arbeite jetzt mit XP und kann programmgesteuert auf A3 und A4 wechseln (hurra!), aber auf A3 wird immer nur hochkant gedruckt, nicht quer:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    //A3
    //Printer.Orientation := poLandscape;
    pDMode^.dmFields := pDMode^.dmFields or DM_ORIENTATION;
    pDMode^.dmOrientation := DMORIENT_LANDSCAPE;
    //ab hier läufts
    pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
    pDMode^.dmPaperSize := DMPAPER_A3;
    pDMode^.dmFields := pDMode^.dmFields or DM_DEFAULTSOURCE;
    pDMode^.dmDefaultSource := DMBIN_LOWER;

Weiß jemand, warum beim Drucken auf A3 das Landscape nicht angenommen wird bzw. nur hochkant gedruckt wird?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 25.01.07 15:51 
user profile iconLuckie hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:
Die Angabe der Pixel ist nicht gleichbedeutend mit der in CM. Wenn Du einen Drucker hast, der mit 720dpi die Seite druckt, druckt dieser den Text 500/720 Inch (500/720 * 2,54 cm) vom Seitenrand entfernt.

Ist bei seinem Code völlig unerheblich, da er den MapMode auf MM_LOMETRIC gesetzt hat.

Ich könnte mir nur vorstellen, dass die unterschiedlichen Drucktreiber unterschiedlich dicht am Rand drucken können und dass es so zu einer Verschiebung kommt.


Wenn Du Zeilen 21ff meinst: GetDC auf Printer.Handle liefert zwar ein Handle für den Drucker, Printer.Canvas.Handle ist aber zu diesem Zeitpunkt IMHO noch nicht initialisiert, weshalb sich das Canvas ein anderes Handle holt. Anstatt GetDC sollte hier direkt Printer.Canvas.Handle verwendet werden, wenn man VCL und API schon mischt.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 25.01.07 16:16 
Ja natürlich muss er für SetMapMode das Handle vom Canvas des Druckers angeben und nicht das Handle vom Drucker. Hatte ich übersehen.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Do 25.01.07 17:06 
user profile iconC++arsten hat folgendes geschrieben:
Habe noch eine Frage:

Unter Win98 kann ich (mit dem Codefragment, s. o.) den A3-Schacht auswählen (DMBIN_LOWER) auf DIN-A3 drucken.

Unter XP hingegen wird der A3-Schacht nicht angesprochen. Das Papier wird immer vom A4-Schacht eingezogen.

Habe das Drucken verschiedentlich unter 98 und XP probiert. Sobald ich den Drucker an ein 98-System hänge läuft es, unter XP nicht. Warum?!?


Hallo,

wenn der Druckertreiber ein anderer ist, sind wahrscheinlich die Bezeichnungen und Nummern für Papierschächte und Ähnliches nicht gleich. Da mir das in unseren Betrieben immer Ärger gemacht hat, habe ich mir ein Utility geschrieben, um die Definitionen für den jeweiligen Drucker auszulesen und zu dokumentieren. Ist urururalt, läuft aber immer noch, als Anhang beigefügt. Drucker wählen, Datei wählen, da steht dann alles drin.

Gruss Reinhard
Einloggen, um Attachments anzusehen!
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Fr 26.01.07 18:35 
Danke für die bisherigen Antworten.

Man kann es drehen und wenden, wie man will: Mein obiger Code (erstes Posting) läuft unter 98, aber nicht unter XP.
Der Drucker ist natürlich derselbe. Ich arbeite verschiedene Druckjobs in einer Schleife ab, mal werden A3-Blätter bedruckt, mal A4, in bunter Folge. Das alles funktioniert unter 98 klaglos, hier wird immer der gewünschte Schacht angesteuert mit richtiger Ausrichtung und gewünschter Darstellung. Derselbe (!) Code mit gleichem (!) Drucker, gleichem Treiber (!), nur an einen XP-Rechner angeschlossen ... und schon wird entweder der Schacht nicht mehr angesteuert, oder die Darstellung ist winzig klein, oder die Ausrichtung stimmt nicht, oder oder oder andere diverse Absonderlichkeiten treten auf.

Ich versuche nun nicht mehr, das zu verstehen. Irgendwann kommt die Phase da muss die Säge ruhen. Man kann auch noch mit 98 arbeiten, wenngleich der Komfort etwas fehlt.

Sollte ich jemals eine plausible Lösung finden, poste ich sie hierhin.

Love, Peace and the Universe

C++arsten
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Fr 26.01.07 20:44 
user profile iconC++arsten hat folgendes geschrieben:
...

Derselbe (!) Code mit gleichem (!) Drucker, gleichem Treiber (!), nur an einen XP-Rechner angeschlossen ... und schon wird entweder der Schacht nicht mehr angesteuert, oder die Darstellung ist winzig klein, oder die Ausrichtung stimmt nicht, oder oder oder andere diverse Absonderlichkeiten treten auf.
...
C++arsten


Hallo C,

Das ist ein Irrtum.
Gleicher Code ja, gleicher Drucker ja, aber unter XP hast du nicht den gleichen Treiber wie unter 98. Selbst wenn es so aussieht.

Gruss Reinhard
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Sa 27.01.07 01:21 
Ja, das stimmt. Genau das ist das Problem. Irgend etwas muss unter XP grundsätzlich anders sein als unter 98.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 27.01.07 09:14 
user profile iconC++arsten hat folgendes geschrieben:
Ja, das stimmt. Genau das ist das Problem. Irgend etwas muss unter XP grundsätzlich anders sein als unter 98.


Hast du denn überhaupt einmal nachgeprüft, ob der A3-Schacht unter XP WIRKLICH die Nummer 2 hat?

Gruss Reinhard
C++arsten Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: Sa 27.01.07 10:02 
Ja, natürlich. Ich kann (danke für dein Programm) den A3-Schacht ansteuern. Aber nur bei der ersten zu druckenden Seite. Sobald dann aber ein A4-Blatt und danach wieder ein A3-Blatt eingezogen werden soll (innerhalb der Schleife, die das steuert), erkennt er den A3-Schacht nicht mehr, zieht also das A4- und A3-Papier trotz Programmanweisung nur aus dem A4-Schacht. Ich habs mit deinen Ziffern versucht, mit Konstanten a la UPPER_BIN etc. Hier spukts.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 27.01.07 13:34 
user profile iconC++arsten hat folgendes geschrieben:
Ja, natürlich. Ich kann (danke für dein Programm) den A3-Schacht ansteuern. Aber nur bei der ersten zu druckenden Seite. Sobald dann aber ein A4-Blatt und danach wieder ein A3-Blatt eingezogen werden soll (innerhalb der Schleife, die das steuert), erkennt er den A3-Schacht nicht mehr, zieht also das A4- und A3-Papier trotz Programmanweisung nur aus dem A4-Schacht. Ich habs mit deinen Ziffern versucht, mit Konstanten a la UPPER_BIN etc. Hier spukts.


Hallo,

ich hatte schon mal eine SEHR verbreiteten Laserdrucker einer SEHR renommierten Druckerfirma, der konnte keine Schriften auf doppelte Breite skalieren, obwohl er das selbst behauptet hat - ich musste mein Programm umschreiben. Es hat 3 Jahre gedauert, bis der Fehler bei einem Update behoben wurde.

Auch bei Treiber-Programmierern kommen mal Fehler vor.

Du könntest ja mal die Seiten einzeln drucken - falls das nicht schon so ist.

Gruss Reinhard