Toujours dans la même doc page 5, les codes d’échappement pour l'ouverture du tiroir sont légèrement différents : 27,112,0,25,250.
MelanieS pourra certainement confirmer tout cela prochainement puisqu'elle est équipée
Toujours dans la même doc page 5, les codes d’échappement pour l'ouverture du tiroir sont légèrement différents : 27,112,0,25,250.
MelanieS pourra certainement confirmer tout cela prochainement puisqu'elle est équipée
je viens de découvrir qu'on peut en fait envoyer tout cela directement sur le port 9100 de l'imprimante, j'ai pu imprimer un bitmap avec idTCPClient sans passer par le driver imprimante qui ne sert plus à rien du coup
Bonjour,
J'arrive un peu tard sur le sujet (retour de vacances et problèmes de reprise oblige ) .
J'ai eu affaires avec une imprimante EPSON TM également mais une H6000III
toute mes impressions ont été faites par les fameuses OPOS , le seul problème que j'ai rencontré concernait la partie Edition de chèques impossible de régler correctement la taille du papier
Ta nouvelle note ,Paul , m'ouvre de nouvelles perspectives !!
Bonsoir !
Et avant toute chose, je vous remercie tous sincèrement de vos réponses et de vos conseils ! Tout commence à s'éclairer
J'ai essayé de fignoler les bouts de codes que vous m'avez donné.
Je n'ai malheureusement ni la caisse ni l'imprimante avec moi ce soir...
Pensez-vous que ce code est susceptible de fonctionner ?
Enfin..Que je ne fais pas de (trop) grossières erreurs ?
Les "longueurs" et "largeurs" sont la position des textes sur le ticket.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58 procedure Tpage_accueil.FormCreate(Sender: TObject); var Index : integer; begin ComboBox1.Items.Assign(Printer.Printers); Index := ComboBox1.Items.IndexOf('EPSON TM-T88V Receipt'); if (Index < 0) and (ComboBox1.Items.Count > 0) then Index := 0; ComboBox1.ItemIndex := Index; end; procedure Tpage_accueil.Imprimer(); // record qui gère l'ouverture de la caisse const cmd: record len: Word; esc: array[0..4] of Char; end = ( len: 5; esc: #27'p07y' // <Esc>p0, t1, t2 : Drawer Kick ); begin // Sélection imprimante Printer.PrinterIndex := Printer.Printers.IndexOf('EPSON TM-T88V Receipt'); // Début d'envoi à l'impression Printer.BeginDoc; // Écriture du ticket de caisse Printer.Title := 'Facture'; Printer.Canvas.Font.Name := 'Arial'; Font.Size := 8; Printer.Canvas.Textout('longueur', 'largeur', 'Facture Numéro [...]'); Printer.Canvas.Textout('longueur', 'largeur', 'Rue de [...]'); Printer.Canvas.Textout('longueur', 'largeur', 'Horaires : [...]'); Printer.Canvas.Textout('longueur', 'largeur', 'Tel : [...]'); Printer.Canvas.Textout('longueur', 'largeur', 'Date : ' + Now); Printer.Canvas.Textout('longueur', 'largeur', 'Article 1 - Prix x'); Printer.Canvas.Textout('longueur', 'largeur', 'Article 2 - Prix y'); Printer.Canvas.Textout('longueur', 'largeur', 'Total : [...]'); Printer.Canvas.Textout('longueur', 'largeur', 'Merci de votre visite'); // Ouverture du tiroir caisse Printer.Canvas.Font.Name := 'control'; Printer.Canvas.Font.Size := 10; // Découpe du papier Escape(Printer.Handle, PASSTHROUGH, 0, @cmd, nil); // Fin d'envoi à l'impression Printer.EndDoc; end;
Je n'ai pas encore la manière de gérer cela, sauf de celle que tu m'as donnée.
bon alors, le code dans le OnCreate je l'ai mis pour pouvoir choisir une imprimante via un ComboBox...du coup il faut prendre ComboBox1.ItemIndex dans le Button1Click et non l'IndexOf(...) sinon ça sert à rien
la Police "Control" fait double emploi avec le PASSTHROUGH, c'est soit un "A" en police Control 10, soit un PASSTHROUGH mais pas les deux.
Bonjour,
Voici un zip contenant des tests (=> peu de commentaires) que j'avais fait à l'époque
il y a bien sur un peu de tout mais surtout les 2 modes de connexion à l'imprimante (via driver ou port com) faudrait que j'y ajoute la méthode de Paul
(quand j'aurais le temps )
mes excuses par avance , cela date de début 2012 donc je ne me rappelle plus exactement tout
Serge
Bonjour,
Je me suis rendu chez un client ce matin pour tester, la séquence #27'p07y' fonctionne effectivement.
Mais je suis allé plus loin que ça
J'ai réalisé une petite application de démonstration qui m'a permis de :
1) retrouver automatiquement les imprimantes réseau
2) imprimer du texte
3) imprimer un bitmap
4) imprimer un code bar
5) couper le papier
6) ouvrir le tiroir caisse
et tout cela sur un PC sans aucun driver EPSON installé !
J'ai même pu intervenir sur la configuration de l'imprimante et lui ajouter une localisation et un administrateur. Mais en fait je peux aussi reconfigurer la partie réseau, la seule contrainte étant que l'imprimante doit dès le départ avoir une adresse IP compatible avec celle du PC, or il me semble que ces imprimantes sont livrées sans DHCP et avec une adresse IP fantaisiste.
Tout cela avec des imprimantes EPSON TM T88V, si vous avez un autre modèle en IP, je serais curieux de savoir comme réagit le programme.
Vous pouvez télécharger le programme Delphi 6 compilé (sans les sources) à cette adresse.
Je n'ai pas encore décidé de ce que j'allais faire de cette solution... pour l'instant les sources ne sont pas disponibles.
Bonsoir,
Navrée de ne répondre que maintenant.
Ma version de DELPHI a rendu l'âme samedi dernier et j'ai dû réinstaller Delphi 7 sauf que le programme ne fonctionnait plus (perte d'une grande partie du code).
J'ai pu tout rapidement ré-écrire.
Et je me retrouve à mon point initial.
L'impression !
Merci de ta "correction" de mon bout de code, Paul, je vais reprendre tout ça.
Ah voilà, j'avais une question que je voulais poser juste avant mon problème de delphi.
La police control et le passthrough, l'un est pour la découpe du papier et l'autre est pour l'ouverture de caisse, non ?la Police "Control" fait double emploi avec le PASSTHROUGH, c'est soit un "A" en police Control 10, soit un PASSTHROUGH mais pas les deux.
Ou alors j'ai pas tout pigé...
Ok, je déclare la constante pour la découpe du papier
Et c'est uniquement là que j'utilise la constance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 const cmd: record len: Word; esc: array[0..4] of Char; end = ( len: 5; esc: #27'p07y' // <Esc>p0, t1, t2 : Drawer Kick );
Code : Sélectionner tout - Visualiser dans une fenêtre à part Escape(Printer.Handle, PASSTHROUGH, 0, @cmd, nil);
J'suis désolée, je comprend vite, mais faut m'expliquer longtemps ! :calim2:
tu peux tout faire en passthrough, et probablement tout faire avec la police Control.
En fait, le but c'est d'envoyer une séquence de caractères à l'imprimante
le mode passthrough demande au driver de ne toucher à rien et d'envoyer la séquence qu'on a défini directement à l'imprimante.
La police "Control" c'est ce que propose EPSON pour simplifier les choses, le caractère "A" est remplacé par la séquence d'ouverture du tiroir...pour couper le papier c'est F ou P (voir ici).
L'avantage du mode passthrough, c'est qu'il fonctionne avec n'importe quel driver d'imprimante (puisqu'on lui dit de ne toucher à rien), alors que si la police Control n'est pas présente la seconde solution ne fonctionnera pas. L'inconvénient c'est qu'il faut connaître les séquences d'échappement qui ne sont pas forcément les mêmes d'un modèle à l'autre...je suppose que la police Control se charge de ce détail.
D'accord.
Donc en fait, l'une des méthodes vaut l'autre.
Il n'y en a pas réellement de meilleure.
Normalement, il devrait y avoir une imprimante unique.
Tiens...Un autre souci me vient dans mon code.
J'ai un bouton "Insérer dans la facture", qui est sensé ajouter l'élément sélectionné dans mon TListView au ticket d'impression.
Mais cela me cause un souci que je comprend tout à fait, mais que je ne sais pas comment résoudre.
En effet, si j'ajoute le Printer.Canvas, il me dit que l'imprimante n'imprime pas pour l'instant parce que l'impression n'est pas encore commencée..
Ici, la partie article est sensée être ce que j'ajoute depuis mon bouton Insérer..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.BtInsererClick(Sender: TObject); var Selection : string; begin Nom := ListView.Items[ListView.ItemIndex].Caption; Prix := StrToFloat(ListView.Items[ListView.ItemIndex].SubItems[0]); Selection := Nom + ' ' + FloatToStr(Prix) + ' CHF'; //Printer.Canvas.Textout(10, 10, Selection); end;
Comment puis-je faire, donc, pour ajouter mes articles à la facture depuis mon bouton "Insérer" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TForm1.Imprimer(); const cmd: record len: Word; esc: array[0..4] of Char; end = ( len: 5; esc: #27'p07y' // <Esc>p0, t1, t2 : Drawer Kick ); begin // Sélection imprimante Printer.PrinterIndex := Printer.Printers.IndexOf('EPSON TM-T88V Receipt'); // Début d'envoi à l'impression Printer.BeginDoc; // Écriture du ticket de caisse Printer.Title := 'Facture'; Printer.Canvas.Font.Name := 'Arial'; Font.Size := 8; EnteteFacture(); Printer.Canvas.Textout(10, 10, 'Article 1 - Prix x'); Printer.Canvas.Textout(10, 10, 'Article 2 - Prix y'); PiedFacture(); // Découpe du papier + impression Escape(Printer.Handle, PASSTHROUGH, 0, @cmd, nil); // Fin d'envoi à l'impression Printer.EndDoc; end;
Je galère là dessus...
Soit on n'élabore l'impression qu'une fois la facture totalement composée (cad ses éléments tous connus), soit on débute l'impression en ouvrant le canevas et y collant les lignes voulues, puis d'autres dans le bouton insérer par exemple, et on clôture la facture par un clic sur le bouton finaliser/imprimer (cela suppose que le canevas soit accessible à partir de tous les boutons qui devront travailler dessus).
Merci de ta réponse.
Je viens de passer quelques heures à me faire une espèce de logique et j'ai fini par presque totalement modifier mon code
En voici une partie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure TForm1.FormCreate(Sender: TObject); begin // Je lance le début de l'impression (sûrement là où ça pose problème..) EnteteFacture(); Printer.PrinterIndex := Printer.Printers.IndexOf('EPSON TM-T88V Receipt'); end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForm1.EnteteFacture(); begin // L'entête de ma facture Printer.BeginDoc; Printer.Canvas.Textout(10, 10, 'Nom de la boutique'); Printer.Canvas.Textout(10, 10, 'Adresses'); Printer.Canvas.Textout(10, 10, 'Horaires'); Printer.Canvas.Textout(10, 10, 'Téléphone'); Printer.Canvas.Textout(10, 10, ' '); Printer.Canvas.Textout(10, 10, DateToStr(Now)); end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForm1.PiedFacture(); begin // La fin de la facture ainsi que l'envoi à l'imprimante. Printer.Canvas.Textout(10, 10, 'Total à payer : '); Printer.Canvas.Textout(10, 10, 'Espèces : '); Printer.Canvas.Textout(10, 10, 'À rendre : '); Printer.Canvas.Textout(10, 10, ' '); Printer.Canvas.Textout(10, 10, 'Merci de votre visite'); Escape(Printer.Handle, PASSTHROUGH, 0, @cmd, nil); Printer.EndDoc; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TForm1.BtInsererClick(Sender: TObject); begin // Articles que j'ajoute au fur et à mesure à ma facture Nom := ListView.Items[ListView.ItemIndex].Caption; Prix := StrToFloat(ListView.Items[ListView.ItemIndex].SubItems[0]); Selection := Nom + ' ' + FloatToStr(Prix); Printer.Canvas.Textout(10, 10, Selection); end;Mais au lancement de l'application, j'ai une erreur qui ne bloque pas le programme pour autant mais le fait planter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.BtPaiementClick(Sender: TObject); begin // Fin du programme, j'imprime la facture. PiedFacture(); end;
Comme je le penses bien, l'erreur vient de mon FormCreate, mais dans ce cas-là, je ne vois pas trop comment le résoudre.La projet a provoqué une classe d'exception EPrinter avec le message "Impression en cours". Processus stoppé.
Je pense qu'il suffit d'inverser les 2 lignes pour sélectionner l'imprimante active avant de démarrer l'impression...
....J'ai honte...
J'me sens tellement nulle, sur le coup
Merci infiniment, Tourlourou.
Il ne me reste plus qu'à aller tester mon petit programme.
Je viendrais vous tenir au courant.
Et comment fais-tu si le(la) client(e) ne veut plus un article, veut payer avec une carte de crédit, voire plusieurs modes de payement
A part ça, il faudrait peut-être calculer un décalage en Y, toutes tes lignes sont superposées
En fait, j'attend d'être devant l'imprimante pour faire les réglages concernant l'allure de la facture (où seront les éléments dans la facture).
Quant aux modes de paiement, il n'y a pas d'appareils pour les cartes, donc, dans l'idéal, c'est cash (c'est un programme de gestion de caisse pour salon de coiffure. Ce sont donc des prix choisis par le patron et ce sont des chiffres ronds. )
J'ai déjà géré un bouton "Annuler" mais il est vrai qu'il était fonctionnel lorsque je n'avais qu'un memo où j'indiquais toutes mes informations. Il suffisait de vider ce dernier.
A présent, il va falloir que je gère la création d'une "nouvelle" facture, et donc, la remise à zéro de l'impression.
Édit, j'ai pensé à simplement fermer l'impression dés que j'appuie sur le bouton "recommencer" et de la relancer ensuite. Mais ceci ne fonctionne QUE si je n'ai pas encore appuyé sur le bouton "paiement", sinon, cela me remet l'erreurl'imprimante n'imprime pas pour l'instantSuis-je bête !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForm1.BtAnnulerClick(Sender: TObject); begin Printer.EndDoc; Total := 0; EdTotal.Text := '0'; EdEspeces.Text := '0'; EdARendre.Text := '0'; BtInserer.Enabled := true; BtPaiement.enabled := false; EnteteFacture(); end;
Quand j'appuie sur le bouton paiement, je ferme DÉJA, l'impression.
C'est pour ça que si je la ferme de nouveau dans le bouton annuler, cela génère une erreur.
J'ai réglé le problème avec une variable boolean déterminant si la facture a déjà été "terminée" ou non.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager