Autor Beitrag
spacemanspiff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.12 08:18 
Moin, moin,

gestern habe ich mich damit abgemüht, meinem Endlosdrucker (derzeit über USB verbunden), der zu Protokollzwecken eingesetzt werden soll, eine Zeile abzuringen... vergeblich :-(

Ich kann zwar mit dem TPrinter-Objekt drucken, allerdings immer nur eine komplette Seite, was für unsere Zwecke quatsch ist.

Zu Testzwecken habe ich einen Button erzeugt und eine Funktion hinterlegt...


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:
27:
28:
29:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //...
  //Druckerliste erzeugen
  cbPrinter.Items.Assign(Printer.Printers);  //Liste aller Windows-Drucker
  //...
end;

procedure TForm1.SelectPrinter(Sender: TObject);
begin
  Printer.PrinterIndex := cbPrinter.ItemIndex;
end;

procedure TForm1.TestPrinter(Sender: TObject);
var P: TPrinter;
begin
  if (cbPrinter.ItemIndex <> -1then
  begin
    P := Printer;
    P.BeginDoc;
    try
      P.Canvas.TextOut(101'Test 1' +CRLF);
      P.NewPage;
      P.Canvas.TextOut(101'Test 2');
    finally
      P.EndDoc;
    end;
  end;
end;



Steuerzeichen scheine ich nicht senden zu können. Ebenso scheint das TPrinter-Objekt bzw. das Canvas-Objekt nicht für zeilenweises drucken ausgelegt zu sein. Ich kann nämlich erst nur das Canvas "vollkritzeln" und dann mit P.Newpage oder P.EndDoc an den Drucker ausgeben.

Meine Fragen an Euch: Habe ich was übersehen oder kann ich das nicht mit oben genutzten Objekten bewerkstelligen? Welche Chance habe ich, immer nur eine Zeile auf dem Drucker auszugeben und nur einen Zeilen- und nicht gleich einen Seitenvorschub zu machen?

Vielen Dank im Voraus schon mal :-)

Beste Grüße,
Thomas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 21.12.12 09:45 
Du musst das Format des Druckers auf Endlospapier umstellen (rechte Maustaste --> Druckereinstellungen). Sonst ist eine Seite eben eine Seite.

Mehr Möglichkeiten, auch was das Abschneiden angeht, bietet z.B. eine Ansteuerung via OPOS, die z.B. bei Epson Druckern in der Regel möglich ist.

Und was die Steuerzeichen angeht: Für die musst du meistens vorher nur die Schriftart umstellen.
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.12 10:30 
Hi Sebastian und danke für die Antwort.

Auf Endlospapier habe ich den Drucker bereits eingestellt, allerdings fehlt mir die Möglichkeit einen Zeilenvorschub vorzunehmen. Es bleibt so oder so bei einem Seitenvorschub bis kurz nach der perforierten Stelle.

OPOS sagt mir aktuell noch nichts und ein schnelles googeln lässt es so erscheinen, als müsse man sich erst mal gründlich einarbeiten. Ich spiele grad mit dem Gedanken, den Drucker via RS232 oder LPT/generic text only anzusteuern. Das scheint mir dann ähnlich wie auf der Konsole - nur halt auf dem Endlosdrucker - zu erscheinen. Bin mir aber nicht sicher, da ich das noch nie gemacht habe. Jemand eien Meinung dazu?

Schriftarten kann ich direkt am Drucker einstellen, aber welche führt zum Ziel?
Zur Auswahl stehen:
- Draft
- Draft Condensed
- Roman
- Sans serif
- Courier
- Prestige
- Script
- Others ... (?)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 21.12.12 11:01 
Was mir gerade auffällt:
Du schreibst wie du einen Seitenvorschub verhindern kannst, hast aber genau den explizit drin... :?!?:
ausblenden Delphi-Quelltext
1:
P.NewPage;					
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.12 12:43 
Ja, das ist nur ein Test gewesen.
Das NewPage löst das Drucken aus. Oder aber der Befehl EndDoc.

Oder kennst Du ne andere Möglichkeit das Drucken auszulösen? Durch welchen Befehl soll ich NewPage ersetzen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 21.12.12 13:17 
Da geht nur EndDoc, wenn das Abschneiden nicht zwischendrin per Escapesequenz klappt. Denn NewPage springt ja genau eine "Seitengröße" weiter.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 21.12.12 13:21 
Du versuchst mit einem Seitendrucker auf einen Zeilendrucker zu drucken. Das bezieht sich jetzt auf BeginDoc/EndDoc. Versuche mal besser zeilenweise mit writeln zu drucken, wobei der Seitenvorschub dann chr (12) wäre.

_________________
Gruß
Hansa
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.12 13:42 
@jaenicke
EndDoc schiebt leider auch eien komplette Seite vor

@hansa
WriteLn klappt auch nicht, da der Drucker sich nach WriteLn nicht genötigt sieht auch zu drucken. Das klappt dann erst, wenn ich den Ausgabestream schließe und dann findet ebenfalls ein Seitenvorschub statt.

:-(
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 21.12.12 13:52 
Schiebt der Drucker genau bis zur Perforation weiter ? Sofern der beim Einschalten schon da war oder wie ? Wenn Du writeln verwendest, dann druckt der wohl erst beim Close. Seitenvorschub kommt aber wohl offensichtlich automatisch vom Drucker. Mach mal da besser ein Reset bzw. stelle auf Werkseinstellung zurück. Hört sich alles nach Oki oder Epson an. Was ist das genau für ein Drucker ?

_________________
Gruß
Hansa
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.12 13:57 
Wenn ich die richtige Papiergröße eingebe ja, dann schiebt er bis zur Perforation weiter, falls ich ihn nach dem Einschalten so einstelle.

Es ist ein Epson LQ-300+II.

Genau. Er druckt erst beim Close. Und ausprobiert habe ich es nicht, aber laut Doku bringt mich Reset auch nicht weiter, da es das Dokument ja ebenfalls schließt. Und im Druckertreiber habe ich nichts gefunden. Es ist aber auch ein Standardruckertreiber, da Epson für den Drucker wohl keine Win7 Treiber hat.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 21.12.12 14:03 
Epson LQ-300 ? Jo, da druckt jetzt gerade irgendwo einer seine Rechnungen damit. :mrgreen: Und zwar ungefähr so :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
(*$I-*) writeln(LST1,st); (*$I+*)

PROCEDURE page;
  BEGIN
    close (LST1);


vorher steht noch das hier und es geht.

ausblenden Delphi-Quelltext
1:
2:
assign (LST1,'LPT1');
rewrite (LST1);

_________________
Gruß
Hansa
spacemanspiff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Fr 21.12.12 14:31 
Hmm... so ähnlich hatte ich es ebenfalls versucht.
Sieht mir mit der procedure aber immer noch danach aus, als würde man so seitenweise und nicht zeilenweise drucken oder überseh ich was?
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Fr 21.12.12 19:20 
hansa, LPTx: als Ziel geht aber an USB nicht - zu einer USB Verbindung kann man nicht per Textdatei-Output drucken.

spacemanspiff, wenn Du keine Seiten (in der im Treiber eingestellten Größe) drucken willst, mußt Du über RAW-Druck statt über printer.canvas drucken. Canvas unterstützt keine Steuerzeichen bzw. direkten Drucker-Commands und druckt ausschließlich mit Seitenvorschub aus den Seitenwerten des Treibers.

Mit RAW-Druck kannst Du sowohl direkte Drucker-Commands absetzen wie auch die im writeln enthaltenen CR/LF benutzen. Allerdings mußt Du dann auch evtl. alles direkt per Drucker-Commands einstellen: Schrift, Zeilenbreite, Zeilenabstand ... sonst nimmt der Drucker seine eigenen Default-Werte.

Zu RAW-Druck gibt es ausreichend Quellcodes im Web.

:)
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 21.12.12 20:22 
user profile iconMeierZwoo hat folgendes geschrieben Zum zitierten Posting springen:
hansa, LPTx: als Ziel geht aber an USB nicht - zu einer USB Verbindung kann man nicht per Textdatei-Output drucken.


Das sagst aber nur Du ! Dir ist offrensichtlich der Befehl net use... nicht bekannt.

_________________
Gruß
Hansa
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Sa 22.12.12 02:54 
user profile iconhansa hat folgendes geschrieben Zum zitierten Posting springen:
Dir ist offrensichtlich der Befehl net use... nicht bekannt.


"Net" kannte ich bisher nur als Tool für M$ LAN, und das auch nur aus der Theorie. Wenn Du damit sagen willst, daß du auf einen [virtuellen] Netzwerkdrucker an LPTx: umleitest, um dem Programm eine virtuelle LPTx: vorzugaukeln, dann mußt Du das aber auch fairerweise vor deinem Quellcode erwähnen. Denn ohne die Umleitung geht LPTx: bei einem USB-Drucker nicht.