Autor Beitrag
gargoyl
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 15.03.07 12:11 
Hi

Das Problem ist folgendes:
ich habe einen Drucker an LPT2 angeschlossen an welchen ich ESC-Kommandos sende welches auch problemlos funktioniert. Dieser Drucker wird jedoch in zukunft nur noch eine USB Schnittstelle besitzen und ich weiß leider nicht wie ich diese direkt ansprechen kann.
Im Forum habe ich schon gesucht jedoch wurden die informationen von Jahr zu Jahr immer magerer und letztendlich wurde bisher dazu auch keine Lösung vorgebracht.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var f:textfile;
    s:string;
begin
  AssignFile(f,'LPT2:'); //soll jetzt USB sein
  Rewrite(f);
  WriteLn(f,'TEXT');
  s:=chr(27)+'ME';
  WriteLn(f,s);
  CloseFile(f);
end;


grüße Gargoyl
Backslash
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: Do 15.03.07 13:33 
Hast du schonmal drüber nachgedacht mit TPrinter zu arbeiten?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses Printers; // nicht vergessen


Printer.BeginDoc; // Initialisiert bzw. instanziert die TPrinterklasse

Printer.NewPage; // neue Seite

Printer.EndDoc; // druckt


Nachtrag: Wenn du mit verschiedenen Druckern arbeitest, dann solltest du noch einen Dialog zum Wählen des Druckers auf deinem Formular unterbringen. Wenn du diesen Dialog aufrufst, dann wird der Drucker automatisch gesetzt. So kannst du deinen USB-Drucker wählen. Das ganze funktioniert bei mir einwandfrei. Wenn du allerdings weiter ESC-Kommandos senden möchtest, kann ich dir leider nicht viel weiter helfen. Zu TPrinter findest du hier sehr viel im Forum.

Ich schau nochmal ob ich was zum Direktzugriff auf einen USB-Drucker finde. Wenn ja, dann melde ich mich innerhalb der nächsten 2 Stunden in diesem Thread. Wenn nicht, kannst du davon ausgehen dass ich versagt hab :(

Gruß

Backslash

Nachtrag: Sorry und :welcome:, hatte ich vergessen :oops:
Backslash
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: Do 15.03.07 13:52 
Ich denke ich hab die Lösung. Ich hab aus Word heraus mal versucht etwas zu drucken. Dort kommt ja der Druckdialog. Da steht sonst auch "an LPT1:" oder "an LPT2:", etc. Bei meinem Usb-Drucker steht da "USB001"

Guckst du angehängtes Screen :D

Ich würde jetzt einfach

ausblenden Delphi-Quelltext
1:
AssignFile(f,'USB001');					



oder
ausblenden Delphi-Quelltext
1:
AssignFile(f,'USB001:');					


versuchen. Es kann aber auch sein dass dein Drucker am USB 2 Port hängt, oder USB 3 oder 4 oder 5. Das ganze kannst du ermitteln wenn du in word z.B. "Datei/Drucken" im Menü aufrufst und dort den USB-Drucker wählst und schaust an welchem "Port" er hängt :)

Hoffentlich hilft das. Ich habe es nicht getestet aber das erscheint mir die einzige plausible Lösung.

Gruß

Backslash
Einloggen, um Attachments anzusehen!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 15.03.07 14:00 
Escape-Sequenzen Daten direkt zum Drucker schicken:

www.swissdelphicente.../showcode.php?id=716

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:
{
  By using the Windows API Escape() function,
  your application can pass data directly to the printer.
  If the printer driver supports the PASSTHROUGH printer escape,
  you can use the Escape() function and the PASSTHROUGH printer escape
  to send native printer language codes to the printer driver.
  If the printer driver does not support the PASSTHROUGH printer escape,
  you must use the DeviceCapabilities() and ExtDevMode() functions instead.


  Mit der Windows API Funktion Escape() kann man Daten direkt zum Drucker schicken.
  Wenn der Drucker Treiber dies nicht unterstützt, müssen die DeviceCapabilities()
  und ExtDevMode() Funktionen verwendet werden.
}


//  DOS like printing using Passthrough command
// you should use "printer.begindoc" and "printer.enddoc"

type
  TPrnBuffRec = record
  bufflength: Word;
  Buff_1: array[0..255of Char;
end;

function DirectToPrinter(S: string; NextLine: Boolean): Boolean;
var 
  Buff: TPrnBuffRec;
  TestInt: Integer;
begin
  TestInt := PassThrough;
  if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT), @testint, nil) > 0 then
  begin
    if NextLine then  S := S + #13 + #10;
    StrPCopy(Buff.Buff_1, S);
    Buff.bufflength := StrLen(Buff.Buff_1);
    Escape(Printer.Canvas.Handle, Passthrough, 0, @buff, nil);
    Result := True;
  end
  else
    Result := False;
end;

// this code works if the printer supports escape commands
// you can get special esc codes from printer's manual

//  example:
printer.BeginDoc;
try
  DirectToprinter('This text ');
finally
  printer.EndDoc;
end;


Zuletzt bearbeitet von hathor am Di 29.09.15 16:26, insgesamt 1-mal bearbeitet
gargoyl Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 11.04.07 14:24 
Hi

Danke ersteinmal für die Hilfe, die letzte Antwort war so ziemlich das was ich gesucht habe.

Leider gibt es ein Problem und zwar wird die ESC-sequenz an den Drucker geschickt und auch ausgeführt jedoch bleibt der Druckauftrag als "wird gedruckt" bestehen und somit kann der Srucker keine weiteren Kommandos annehmen. Wenn man den Auftrag einfach löscht bricht er den Auftrag komplett ab sprich das Medium wird ausgeworfen.

Hat da jemand einen Idee zu?

grüße gargoyl
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 11.04.07 18:44 
user profile icongargoyl hat folgendes geschrieben:
Hi

Danke ersteinmal für die Hilfe, die letzte Antwort war so ziemlich das was ich gesucht habe.

Leider gibt es ein Problem und zwar wird die ESC-sequenz an den Drucker geschickt und auch ausgeführt jedoch bleibt der Druckauftrag als "wird gedruckt" bestehen und somit kann der Srucker keine weiteren Kommandos annehmen. Wenn man den Auftrag einfach löscht bricht er den Auftrag komplett ab sprich das Medium wird ausgeworfen.

Hat da jemand einen Idee zu?

grüße gargoyl


Hallo gargoyl,

keine Lösung, sondern nur die Aufklärung eines Missverständnisses: die PassThrough-Funktion ist nicht als Auftrag an den Drucker gedacht, sondern um INNERHALB eines Druckerauftrags druckerspezifische Kommandos senden zu können. Bei seitenorientierten Druckern wird der Windows-Druckertreiber immer zum Abschluss ein PagePrint o.ä. senden. Das Vorab-Senden von Einstellungen (z.B. mehrere Seiten) funktioniert unter Windows sowieso so gut wie nie, weil der Druckertreiber auch zum Anfang des Jobs alles nach seinen eigenen Einstellungen einrichtet.

Einzeln senden kannst du ESC-Sequenzen möglicherweise, wenn du dir den Drucker noch einmal ohne Treiber einrichtest (Generic-Text), aber wie erwähnt wird das vom eigentlichen Treiber meistens rückgängig gemacht.

Sind Gargoyles nicht die netten Figuren an gotischen Kathedralen?

Gruss Reinhard
gargoyl Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 12.04.07 15:15 
Also ich mag gothische Kathedralenverzierungen wobei das nicht heißen soll das ich Kathedralen an sich mag,... ^^

nunja wer sucht der findet auch irgentwann mal... auch wenn es ziemlich lange gedauert hat aber.
Das letzte Problem lag ja daran das sich der Treiber in die ganze Druckgeschichte einmischt, was somit die ESC-sequenzen ein wenig beeinflusst hat.
Das ganze kann man umgehn indem man die Befehle direkt an den spooler sendet und den Treiber einfach schlichtweg ignoriert.

www.delphipraxis.net...+drucker+senden.html

idee recht simpel, man muss nur wissen wie man es schreibt ;)

grüße Gargoyl
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Do 12.04.07 18:41 
user profile icongargoyl hat folgendes geschrieben:
Also ich mag gothische Kathedralenverzierungen wobei das nicht heißen soll das ich Kathedralen an sich mag,... ^^

nunja wer sucht der findet auch irgentwann mal... auch wenn es ziemlich lange gedauert hat aber.
Das letzte Problem lag ja daran das sich der Treiber in die ganze Druckgeschichte einmischt, was somit die ESC-sequenzen ein wenig beeinflusst hat.
Das ganze kann man umgehn indem man die Befehle direkt an den spooler sendet und den Treiber einfach schlichtweg ignoriert.

www.delphipraxis.net...+drucker+senden.html

idee recht simpel, man muss nur wissen wie man es schreibt ;)

grüße Gargoyl


Hallo Gargoyl,

man kann auch die alte DOS-Methode "copy /b esc_cmd.txt lpt1:" weiterverwenden, wenn man LPTx: entsprechend setzt mit dem "net use" - Befehl. Das gilt natürlich zunächst für einen im Netz freigegebenen Drucker, aber auch einen Drucker am lokalen USB-Port kann man freigegeben und mit net use mit LPTx verbinden (net use lpt1 \\MeinComputer\MeinUSBDrucker).

Gruss Reinhard