Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Hardware ansteuern (https://www.delphipraxis.net/171137-hardware-ansteuern.html)

Pfl 22. Okt 2012 18:17

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

RWarnecke 22. Okt 2012 18:28

AW: Hardware ansteuern
 
Um die Drucker auszulesen, habe ich eine OpenSource-Komponente TPrinterInfo erstellt. Damit kannst Du eigentlich fast alles von den installierten Druckern auf dem Rechner auslesen. Sollte noch etwas fehlen, dann melde Dich einfach bei mir. oder füge es selbst hinzu. Bei letzterem würde ich mich über eine kurze Nachricht freuen.

haentschman 22. Okt 2012 18:31

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:

Popov 22. Okt 2012 18:39

AW: Hardware ansteuern
 
Also das mit der Liste der Drucker könnte so aussehen:

Delphi-Quellcode:
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;
Vielleicht gibt es auch was besseres, kenn mich da kaum aus.

Bummi 22. Okt 2012 19:35

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;

Pfl 22. Okt 2012 21:08

AW: Hardware ansteuern
 
Hä?! Wie jetzt?

Popov 22. Okt 2012 21:35

AW: Hardware ansteuern
 
Die Rückfrage ist sehr aussagekräftig!

Pfl 22. Okt 2012 21:40

AW: Hardware ansteuern
 
Ich benötige von Bummis Quellcode eine OnClick-Methode:

Delphi-Quellcode:
procedure TForm9.BitBtn3Click(Sender: TObject);
begin

end;
end.
Ach ich vergaß: Vielen Dank für Deinen Code für die Druckerliste. Das habe ich gebraucht! :thumb:

Bummi 22. Okt 2012 21:58

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;

Pfl 22. Okt 2012 22:13

AW: Hardware ansteuern
 
Geht leider nicht.

Fehler: "Undeklarierterer Bezeichner : SendEscapeToPrinter".

:(

Bummi 22. Okt 2012 22:19

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.

Pfl 23. Okt 2012 21:14

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:
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.
Hat jemand eine Idee? Erst mal vielen Dank für die bisherigen Antworten! :wink:

haentschman 24. Okt 2012 05:48

AW: Hardware ansteuern
 
Moin...
Zitat:

Hat jemand eine Idee?
...allerdings. Du hast dich auf den Quellcode gestürzt wie eine Fliege auf einen ...haufen. Du solltest erst mal klären wo die Geräte physikalisch dran hängen. Wenn deine Kassenlade am RS232 hängt kannst du Steuersequenzen zum Druckerport schicken wie du willst. :roll:

grl 24. Okt 2012 17:25

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

Pfl 27. Okt 2012 21:21

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.

grl 28. Okt 2012 10:07

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

Neumann 28. Okt 2012 10:58

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.

Pfl 28. Okt 2012 21:02

AW: Hardware ansteuern
 
Ich besitze einen EPSON TM-T 88V

grl 28. Okt 2012 21:04

AW: Hardware ansteuern
 
Und was sagt die Dokumentation von dem Drucker zum Thema Kassenlade öffnen?

Luggi

Pfl 28. Okt 2012 22:07

AW: Hardware ansteuern
 
Es gibt die Möglichkeit, die Lade über den Treiber zu öffnen; ich würde es aber lieber mit Steuerzeichen machen.

Medium 29. Okt 2012 09:26

AW: Hardware ansteuern
 
Naja, wenn das bei dem Modell einfach nicht vorgesehen ist, wirst du kaum eine Wahl haben.

jaenicke 29. Okt 2012 09:38

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...

Neumann 29. Okt 2012 09:53

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.

jaenicke 29. Okt 2012 11:08

AW: Hardware ansteuern
 
Zitat:

Zitat von Neumann (Beitrag 1188860)
Sehe ich auch so, die Lösung mit dem virtuellen Comport ist die Beste.

Ich finde die via OPOS am schönsten. Vor allem, weil es mir vollkommen egal ist was für eine Schublade dran hängt, solange sie als OPOS Gerät angelegt ist. :wink:

Wir haben diverse Einzelansteuerungen geschrieben für diverse Laden, da ist OPOS sehr viel angenehmer...

grl 29. Okt 2012 15:25

AW: Hardware ansteuern
 
Zitat:

Zitat von jaenicke (Beitrag 1188856)
Mehr dazu steht alles in den Entwicklerdokumentationen von Epson...

Dem ist nichts hinzuzufügen.

Gruß,

Luggi


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz