![]() |
Hardware ansteuern
Liste der Anhänge anzeigen (Anzahl: 1)
Liebe Community,
ich sitze leider im Moment tief in der Tinte; ich möchte in meine Software den Nutzer Einstellungen an der Hardware vornehmen lassen. Dabei soll Delphi alle verfügbaren Drucker in eine ComboBox einlesen und einen Testausdruck durchführen. Auch soll die Kundenanzeige, sofern vorhanden mit einem Beispieltext angesteuert werden: Text: "ApoPlus Apothekensystem 2010" "Umlaute ä,ö,ü,ß [Datum und Uhrzeit]". Ich habe leider überhaupt keine Ahnung, wie ich das anstellen könnte... :( Schwierig wird es dann auch bei der Kassenlade... Kann jemand helfen?? Vielen Dank und lieben Gruß im Voraus! Als Anhang ein Screenshot zum besseren Verständnis |
AW: Hardware ansteuern
Um die Drucker auszulesen, habe ich eine OpenSource-Komponente
![]() |
AW: Hardware ansteuern
Hallo...
da wirst du dich wohl oder übel mit TComPort z.B. auseinandersetzen müssen. :zwinker: Sowohl die Kassenschublade als auch das Display arbeiten damit und wenn es über einen virtuellen ComPort ist. Desweiteren mußt du dich mit den verschiedenen Modellen und deren Bedienungsanleitungen vertraut machen. Jedes arbeitet anders... :zwinker: |
AW: Hardware ansteuern
Also das mit der Liste der Drucker könnte so aussehen:
Delphi-Quellcode:
Vielleicht gibt es auch was besseres, kenn mich da kaum aus.
uses
Printers; procedure TForm1.Button1Click(Sender: TObject); var p: TPrinter; begin p := TPrinter.Create; try ComboBox1.Items.Assign(p.Printers) finally p.Free; end; end; |
AW: Hardware ansteuern
Für die Kassenladen gibt es üblicherweise String welche man per Escape schicken kann
Delphi-Quellcode:
function SendEscapeToPrinter(const PrinterName: String; Const S: AnsiString): Boolean;
type TPrnBuffRec = record bufflength: Word; Buff_1: array [0 .. 255] of AnsiChar; end; var Buff: TPrnBuffRec; TestInt: Integer; OldIndex: Integer; begin OldIndex := Printer.PrinterIndex; try Result := Printer.printers.IndexOf(PrinterName) > -1; Printer.PrinterIndex := Printer.printers.IndexOf(PrinterName); Printer.BeginDoc; TestInt := PassThrough; if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TestInt), @TestInt, nil) > 0 then begin StrPCopy(Buff.Buff_1, S); Buff.bufflength := StrLen(Buff.Buff_1); Escape(Printer.Canvas.Handle, PassThrough, 0, @Buff, nil); Result := True; Printer.EndDoc; end else Result := False; finally Printer.PrinterIndex := OldIndex; end; end; |
AW: Hardware ansteuern
Hä?! Wie jetzt?
|
AW: Hardware ansteuern
Die Rückfrage ist sehr aussagekräftig!
|
AW: Hardware ansteuern
Ich benötige von Bummis Quellcode eine OnClick-Methode:
Delphi-Quellcode:
Ach ich vergaß: Vielen Dank für Deinen Code für die Druckerliste. Das habe ich gebraucht! :thumb:
procedure TForm9.BitBtn3Click(Sender: TObject);
begin end; end. |
AW: Hardware ansteuern
Delphi-Quellcode:
procedure TForm9.BitBtn3Click(Sender: TObject);
begin if SendEscapeToPrinter('Wie auch immer Dein Drucker heißt','Der Kassenschubladenöffnungssttring aus dem Herstellerhandbuch') then Showmessage('Jetzt sollte die Schublade auf sein ....') end; |
AW: Hardware ansteuern
Geht leider nicht.
Fehler: "Undeklarierterer Bezeichner : SendEscapeToPrinter". :( |
AW: Hardware ansteuern
Nuja, die Funktion findest Du in #5...
Also beispielsweise vor Deinem Aufruf in den implementation Teil packen, oder in eine Unit (z.B. tools) verfrachten, die Deklaration in den interface-Abschnitt die Routine in den implementation Abschnitt un die Unit in die uses Deines "Aufrufformulars" übernehmen. |
AW: Hardware ansteuern
Vielen Dank, Bummi. Ich hab den Fehler zwar behoben, leider will der dämliche Drucker nicht die Lade öffnen.
Hier ist der komplette Source:
Delphi-Quellcode:
Hat jemand eine Idee? Erst mal vielen Dank für die bisherigen Antworten! :wink:
unit Unit9;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, ButtonWithColor, Registry, IniFiles, OleServer, CmAdmCtl, Printers, cyBaseButton, cyBitBtn; type TForm9 = class(TForm) Image1: TImage; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; GroupBox4: TGroupBox; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; ComboBox1: TComboBox; Label1: TLabel; Label2: TLabel; ComboBox2: TComboBox; ComboBox3: TComboBox; Label3: TLabel; Edit1: TEdit; Label4: TLabel; Edit2: TEdit; Label5: TLabel; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox4: TCheckBox; Label6: TLabel; UpDown1: TUpDown; PrinterSetupDialog1: TPrinterSetupDialog; PrintDialog1: TPrintDialog; Edit3: TEdit; ComboBox4: TComboBox; Label7: TLabel; BitBtn1: TBitBtn; ComboBox5: TComboBox; Label8: TLabel; Label9: TLabel; Label10: TLabel; ComboBox6: TComboBox; Edit4: TEdit; Edit5: TEdit; ComboBox7: TComboBox; Label11: TLabel; BitBtn2: TBitBtn; BitBtn3: TBitBtn; ComboBox8: TComboBox; Label12: TLabel; GroupBox5: TGroupBox; CheckBox5: TCheckBox; COMAdminCatalog1: TCOMAdminCatalog; RichEdit1: TRichEdit; cyBitBtn1: TcyBitBtn; procedure SpeedButton2Click(Sender: TObject); procedure CheckBox5Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure cyBitBtn1Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure BitBtn2Click(Sender: TObject); private { Private-Deklarationen } IniFile : TMemIniFile; public { Public-Deklarationen } end; function SendEscapeToPrinter(const PrinterName: String; Const S: AnsiString): Boolean; var Form9: TForm9; Reg: TRegistry; Ini : TIniFile; p: TPrinter; implementation {$R *.dfm} procedure TForm9.BitBtn1Click(Sender: TObject); begin if PrintDialog1.Execute then begin printer.BeginDoc; printer.NewPage; printer.EndDoc; Application.MessageBox('Dokument wurde in Auftrag gegeben.','',mb_ICONINFORMATION or mb_OK); end; end; procedure TForm9.BitBtn2Click(Sender: TObject); begin WriteLn ('Hallo Text'); WriteLn ('Jetzt wird abgeschnitten'); Write (#029#086#065#010); end; procedure TForm9.BitBtn3Click(Sender: TObject); begin if SendEscapeToPrinter(ComboBox1.Text,Combobox7.Text) then Application.MessageBox('Wurde die Lade geöffnet?','Impulstest Kassenlade',mb_ICONQUESTION or mb_YESNO); end; procedure TForm9.CheckBox5Click(Sender: TObject); begin if CheckBox1.Checked=true then begin cyBitBtn1.Enabled:=true; end; end; procedure TForm9.cyBitBtn1Click(Sender: TObject); begin Application.MessageBox('Möchten Sie ApoPlus 2010 wirklich in den Autostart-Ordner des Systems schreiben? Falls Ja, muss das System neu gestartet werden','Registry-Eintrag Autostart',mb_ICONWARNING or mb_YESNO); end; procedure TForm9.FormActivate(Sender: TObject); var ini : TiniFile; begin Ini:=TIniFile.Create('C:\Settings\Control.ini'); try Combobox1.Text := Ini.ReadString('Printer', 'Output','') ; ComboBox2.Text := Ini.ReadString('Printer', 'Interface','') ; ComboBox3.Text := Ini.ReadString('Printer', 'Hersteller','') ; //Ini.ReadString('Printer', 'Anzahl', Edit1.Text); //Ini.ReadString('Printer', 'Speed', Edit2.Text); IF Ini.ReadString('Printer', 'AutoCutEnabled','') = 'YES' then CheckBox1.Checked := true else CheckBox1.Checked := false; Edit3.Text := Ini.ReadString('Printer', 'Breite',''); //ComboBox4.Text := Ini.WriteString('Printer', 'Format' ); if Ini.ReadString('Display', 'Enabled','') = 'YES' then CheckBox2.Checked := true else CheckBox2.checked := false; //ComboBox5.Text := Ini.WriteString('Display', 'Interface' ); //ComboBox6.Text := Ini.WriteString('Display', 'Steuerzeichen'); //Edit4.Text + Edit5.Text := Ini.WriteString('Display', 'Text' ); //if CheckBox4.Checked //then Ini.WriteString('POS', 'Enabled', 'YES') //else Ini.WriteString('POS','Enabled','NO'); //Ini.WriteString('POS', 'Algorithmus', ComboBox7.Text); //if CheckBox3.Checked //then Ini.WriteString('EC', 'Enabled', 'YES') //else Ini.WriteString('EC', 'Enabled', 'NO'); //ComboBox8.Text := Ini.WriteString('EC','Interface'); finally Ini.Free; p := TPrinter.Create; try ComboBox1.Items.Assign(p.Printers) finally p.Free; end; end; end; procedure TForm9.SpeedButton1Click(Sender: TObject); begin Ini:=TIniFile.Create('C:\Settings\Control.ini'); try Ini.WriteString('Printer', 'Output', Combobox1.Text); Ini.WriteString('Printer', 'Interface', ComboBox2.Text); Ini.WriteString('Printer', 'Hersteller', ComboBox3.Text); Ini.WriteString('Printer', 'Anzahl', Edit1.Text); Ini.WriteString('Printer', 'Speed', Edit2.Text); if CheckBox1.Checked then Ini.WriteString('Printer', 'AutoCutEnabled', 'YES') else Ini.WriteString('Printer', 'AutoCutEnabled', 'NO'); Ini.WriteString('Printer', 'Breite', Edit3.Text); Ini.WriteString('Printer', 'Format', ComboBox4.Text); if CheckBox2.Checked then Ini.WriteString('Display', 'Enabled', 'YES') else Ini.WriteString('Display', 'Enabled', 'NO'); Ini.WriteString('Display', 'Interface', ComboBox5.Text); Ini.WriteString('Display', 'Steuerzeichen', ComboBox6.Text); Ini.WriteString('Display', 'Text', Edit4.Text + Edit5.Text); if CheckBox4.Checked then Ini.WriteString('POS', 'Enabled', 'YES') else Ini.WriteString('POS','Enabled','NO'); Ini.WriteString('POS', 'Algorithmus', ComboBox7.Text); if CheckBox3.Checked then Ini.WriteString('EC', 'Enabled', 'YES') else Ini.WriteString('EC', 'Enabled', 'NO'); Ini.WriteString('EC','Interface',ComboBox8.Text); finally Ini.Free; Application.MessageBox('Ihre Änderungen wurden übernommen. Eventuell muss das Programmm neu gestartet werden. Übername in C:\Settings\.','Änderungen gesichert',mb_ICONINFORMATION or mb_OK); Form9.Close; end; end; procedure TForm9.SpeedButton2Click(Sender: TObject); begin if Application.MessageBox('Sind Sie sicher, dass Sie abbrechen wollen?', 'Abbruch bestätigen', MB_ICONQUESTION or MB_YESNOCANCEL) = IDYES then close; end; function SendEscapeToPrinter(const PrinterName: String; Const S: AnsiString): Boolean; type TPrnBuffRec = record bufflength: Word; Buff_1: array [0 .. 255] of AnsiChar; end; var Buff: TPrnBuffRec; TestInt: Integer; OldIndex: Integer; begin OldIndex := Printer.PrinterIndex; try Result := Printer.printers.IndexOf(PrinterName) > -1; Printer.PrinterIndex := Printer.printers.IndexOf(PrinterName); Printer.BeginDoc; TestInt := PassThrough; if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TestInt), @TestInt, nil) > 0 then begin StrPCopy(Buff.Buff_1, S); Buff.bufflength := StrLen(Buff.Buff_1); Escape(Printer.Canvas.Handle, PassThrough, 0, @Buff, nil); Result := True; Printer.EndDoc; end else Result := False; finally Printer.PrinterIndex := OldIndex; end; end; end. |
AW: Hardware ansteuern
Moin...
Zitat:
|
AW: Hardware ansteuern
Was ist denn das für eine Kassenlade? Ich hab hier z.B. Exemplare, die hängen an einem Bondrucker dran. An den schickt man in einer bestimmten Schriftart ein bestimmtes Zeichen, dann geht die Kassenlade auf.
Also: Doku der verwendeten Hardware lesen oder zumindest mitteilen, was du genau für Hardware hast, mit der du reden sollst... Luggi |
AW: Hardware ansteuern
Die Lade stammt von METAPACE und ist das Modell METAPACE K1 mit RJ11-Bus über den Bondrucker. Der Bondrucker ist mit USB angeschlossen.
|
AW: Hardware ansteuern
Also, wenn das Teil nur am Bon-Drucker angeschlossen ist und nicht am PC direkt dann muss auch die Öffnung über den Bon-Drucker passieren. Womit wir wieder bei der Frage nach der Hardware wären: Was für ein Bon-Drucker ist das denn? Was steht denn in der Doku zum Drucker wie man den Kontakt für die Lade auslöst?
Luggi |
AW: Hardware ansteuern
Da gibt es mehrere Lösungsmöglichkeiten:
1. Kassenlade geht immer auf, wenn gedruckt wird: Kann man in der Regel bei den Druckereinstellungen so konfigurieren, keine weiteren Maßnahmen notwendig. 2. Steuercode an den Drucker in die Druckdaten mit aufnehmen; z.B. Schrift Control + Steuerzeichen. Lade geht auf wenn dieser Text geschickt wird. Nachteil ist, das wenn man nur das Steuerzeichen schickt ein leerer Papierschnipsel aus dem Drucker kommt. 3. Bei einigen USB-Druckern (z.B. Epson, Star usw) kann man einen virtuellen Comport erstellen und über diesen den Befehl zum Öffnen an den Drucker schicken. Ist wohl die beste Lösung, wenn man die Schublade über den Drucker steuert. Port darf immer nur kurz geöffnet werden, sonst funktioniert der Druck über den Windows-Treiber ev. nicht mehr. 4. Schubladenöffner mit USB-Anschluss verwenden: Kostet extra (rund 50 Euro) braucht Versorgungsspannung (12V) geht nur für 12V Schubladen. 5. Kassenrechner hat Schubladenanschluss: ev. Programmieraufwand, HW-Ports müssen gesetzt werden. Treiber notwendig. Bei jedem Hersteller anders. |
AW: Hardware ansteuern
Ich besitze einen EPSON TM-T 88V
|
AW: Hardware ansteuern
Und was sagt die Dokumentation von dem Drucker zum Thema Kassenlade öffnen?
Luggi |
AW: Hardware ansteuern
Es gibt die Möglichkeit, die Lade über den Treiber zu öffnen; ich würde es aber lieber mit Steuerzeichen machen.
|
AW: Hardware ansteuern
Naja, wenn das bei dem Modell einfach nicht vorgesehen ist, wirst du kaum eine Wahl haben.
|
AW: Hardware ansteuern
Das geht bei dem Modell sowohl über OPOS als auch über einen virtuellen COM-Port und Escapesequenzen. Mehr dazu steht alles in den Entwicklerdokumentationen von Epson...
|
AW: Hardware ansteuern
Sehe ich auch so, die Lösung mit dem virtuellen Comport ist die Beste. Man darf nur wie ich schon geschrieben habe den Port nicht offenlassen, da sonst der Druck über den Windows-Treiber nicht mehr funktioniert.
Was mir dabei noch Probleme macht, ist den Status der Schublade abzufragen. Manche Drucker haben auch 2 Schnitstellen, USB und seriell. Dann kann man über ein zusätzliches serielles Kabel die Escape-Sequenzen für die Schubladensteuerung schicken. |
AW: Hardware ansteuern
Zitat:
Wir haben diverse Einzelansteuerungen geschrieben für diverse Laden, da ist OPOS sehr viel angenehmer... |
AW: Hardware ansteuern
Zitat:
Gruß, Luggi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz