Wenn der Windows-Druckertreiber installiert ist, blockiert dieser den Comport. Kein anderes Programm kann ihn dann verwenden. Man kann dann aber einfach den Befehl zum Öffnen der Schublade als Textzeile mit der Schrift 'Control' an den Drucker senden. Ist nur ein Buchstabe, welcher müsste ich nachsehen.
Warum die elende serielle Schnittstelle für den Drucker? Ist extrem langsam und veraltet. Drucken von Graphiken und Truetype-Schriften ist damit unzumutbar.
Weiter habe ich gesehen, dass der Kassenrechner selbst eine Schnittstelle für eine Kassenschublade hat. Warum nicht die verwenden?
Habe das bei Kassenrechnern anderer Herstellern gemacht, funktioniert gut. Hier mal meine Routine, die mit nahezu allen Anschlußmöglichkeiten klarkommt:
Delphi-Quellcode:
procedure opendrawer;
Var
FH:THandle;
Buff: array[0..5] of char;
RetW:DWORD;
port:string;
begin
if dm.SchubladeVonRechner then
begin
if dm.SchubladeHWPort>$8000 then // Schublade an Drucker mit LPT
begin
port:='lpt'+inttostr(dm.SchubladeHWPort-$8000);
FH:= CreateFile(PChar(Port),
GENERIC_READ or GENERIC_WRITE,
0, Nil, OPEN_EXISTING, 0, 0);
if (FH <> INVALID_HANDLE_VALUE) then
try
Buff:=#27#112#48#50#250; // Escape-Sequenz
WriteFile(FH, Buff, 5, RetW, Nil);
finally
CloseHandle(FH);
end;
FH:= CreateFile(PChar(Port),
GENERIC_READ or GENERIC_WRITE,
0, Nil, OPEN_EXISTING, 0, 0);
if (FH <> INVALID_HANDLE_VALUE) then
try
Buff:=#27#112#49#50#250; // Zweiter Anschluss
WriteFile(FH, Buff, 5, RetW, Nil);
finally
CloseHandle(FH);
end;
end else
begin
portwriteb( dm.SchubladeHWPort,dm.SchubladeAuf ); // Schublade am Rechner angeschlossen Strom ein man braucht zlportio (Torry?)
Timerschublade.Enabled:=true; // Schaltet Strom wieder ab
end;
end else
if dm.Schubladedirekt then // IBM-Kasse mit Steuerung Schublade über Comport (vacommx: Tcomport)
begin
if not (dm.displayport=dm.Schubladecomnr) then
vacomm3.WriteStr(dm.Schubladecm) else
vacomm2.WriteStr(dm.Schubladecmd);
end else
begin
if (dm.Steuertextoption=2) or (dm.Steuertextoption=1) then
begin
switchprinter(dm.Steuertextdrucker);
if fileexists(dm.steuertext) then
begin
redbeleg.lines.LoadFromFile(dm.steuertext); // RTF-Text mit Steuerzeichen, senden über Druckertreiber
redbeleg.Print('');
end else
begin
messagedlg(_('Schubladen - Steuertext konnte nicht gefunden werden'),mterror,[mbok],0);
end;
end;
end;