Salut,
Mon appli doit transmettre une trame TCP/IP à une imprimante industrielle.
Pour moi on ne se trouve pas dans le cas d'une config Client/Sever.
Faut-il utiliser les objets Indy, si oui lesquels et comment et si non comment peut-on faire?
Merci





Salut,
Mon appli doit transmettre une trame TCP/IP à une imprimante industrielle.
Pour moi on ne se trouve pas dans le cas d'une config Client/Sever.
Faut-il utiliser les objets Indy, si oui lesquels et comment et si non comment peut-on faire?
Merci
D'abord tu dois absolument connaître le protocole utilisé par ton imprimante... Toi et nous pour pouvoir t'aider![]()
sjrd, ancien rédacteur/modérateur Delphi.
Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
Découvrez Mes tutoriels.





Je suis d'accord, j'ai donc approfondi.
On peut communiquer par FTP, j'ai essayé (exemple du faq : FTP client), j'arrive à me connceter mais pas envoyer le fichier texte.
On peut communiquer en LPR, j'arrive à faire in PrintFile avec un TIdLPR qui m'imprime bien une étiquette. Mais je dois bloquer la com à un endroit car sur un deuxième essai j'ai 'Erreur socket#10048
'Adresse déjà utilisé'
ou une non exécution (temps d'attente trop long) ou un message avec erreur de socket #0.
Désolé si c'est pas très clair mais je comprends pas tout.
Merci
Salut!![]()
Je possède un code Delphi super simple pour éxécuter une url. En gros, le principe que je te propose est le suivant : Si tu éxécutes un programme sur le poste du client qui irait voir de temps en temps si un certain fichier se trouve sur ton serveur (site perso par exemple), alors ce programme le télécharge dès qu'il le trouve et l'imprime... Qu'en penses-tu ? De ton côté, il suffira d'uploader le fichier en question avec un simple formulaire web. C'est la plus simple (peut-être pas la plus performante) des solutions que je possède. Voilà, si tu es intéressé, dis le moi, à+





Je suis bien entendu prenneur de toute solution.
Mais mon objectif est de pouvoir tout réaliser dans une même application.
Je continue à regarder pourquoi je ne peut pas faire de deuxième envoies.
Tout en schant que pour librer la com je suis obliger d'arrêter Delphi et de le relancer (et ça n marche pas à chaque fois). Ce qui me laisse bien penser à une non fermeture de la communication sous forme de socket.
Merci
Voici un code permettant d'effectuer le téléchargement d'un fichier et/ou d'éxécuter un script serveur (php) :Donc l'idée en gros, c'est quand le programme va télécharger le fichier sur le disque, il l'imprime...
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 Uses UrlMon; {----------------------------------------------------------------} Procedure TForm1.Button1Click(Sender: TObject); Const url = 'http://sub0.developpez.com/index.htm'; dst = 'c:\mapage.htm'; Begin Try Try If (FileExists(dst)) Then DeleteFile(dst); URLDownloadToFile(Nil, url, dst, 0, Nil); Except ShowMessage('Erreur de téléchargement.');End; Finally If (FileExists(dst)) Then ShowMessage('Téléchargement effectué.'); End; End;
Aussi, tu peux également utiliser une autre méthode :
http://nono40.developpez.com/sources/source0015/
En tous les cas, le fichier à imprimer doit être sur un serveur.
Soit le serveur l'envoit au client (imprimante), soit le client le télécharge du serveur...
Une fois que le fichier à imprimer est sur le disque du client, tu l'imprimes.





J'essai l'envoi par FTP.
Par contre pour ce qui est de l'envoi par LPR, mon code est le suivant:
Avec IdLPR1 défini :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6IdLpr1.Connect; if IdLpr1.Connected then begin IdLpr1.PrintFile('C:\MonFichier'); end; IdLpr1.Disconnect;
Le première envoi ce fait bien mais au deuxième envoi j'ai l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 object IdLPR1: TIdLPR ASCIIFilter = True MaxLineAction = maException ReadTimeout = 0 Host = '192.168.2.3' Port = 515 Queue = 'pr1' Left = 642 Top = 32 end
" Erreur de socket #10048 Adresse déjà utilisée"
Je pense donc que c'est ma déconnection qui n'est pas bonne, mais j'ai esssayé plusieurs chose tel que destruction de la socket mais rien à faire.
Il me faudrait donc un peut d'aide sur la fin de l'envoi du fichier par LPR.
Merci
Avec ton imprimante tu dois avoir des CD qui te permette d'installer les drivers reseaux.
Il te suffit de les installer et de définir une imprimante générique texte qui utilise ces drivers et il te reste plus qu'a gérer cela simplement comme une impression standard d'un fichier texte.
Modérateur Delphi
Le guide du bon forumeur :
- Les règles du forum tu liras
- La FAQ et les tutoriels tu consulteras
- La fonction Recherche tu utiliseras
- Google tu vénèreras
__________
Rayek World : Youtube Facebook





Ce serait en effet plus facile de passer par une imprimante gérée par le PC mais je n'ai pas le droit compte tenu des contraintes de l'application.
A tout hasard :
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part IdLpr1.Connect := false???
Code : Sélectionner tout - Visualiser dans une fenêtre à part IdLpr1.Disconnect





L'instruction :
n'est pas compilable 'la partie gauche n'est pas affectable'
Code : Sélectionner tout - Visualiser dans une fenêtre à part IdLpr1.Connect:=false;
Il fallait tenter mais tanpis.
Merci
T'as pas un Flush ou un truc comme ça pour vider les tampons de l'imprimante ?
Ou alors, une solution dans ton code : tu crée et détruit l'objet TIdLpr au fur et à mesure de ton besoin (comme ça, ça détruit et réinitialise toutes les instances qui lui sont associées)
De plus : Il est possible que ton imprimante renvoie une info sur ton socket (si c'est du TCP) du style "Ca y'est, c'est fait, impression terminée", que le buffer d'arrivée de ton socket soit donc plein et qu'il t'interdise donc de le détruire jusqu'a ce que tu ais fait ça :
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 procedure TForm1.Imprimer(UnFichier:string); AIdLpr:TIdLPR; begin AIdLpr:=TIdLPR.Create(self); try with AIdLpr do begin ASCIIFilter:=True; MaxLineAction:= maException; ReadTimeout:= 0; Host:= '192.168.2.3'; Port := 515; Queue := 'pr1'; Connect; if Connected then PrintFile(Un Fichier); Disconnect; end; finally AIdLpr.Free; end; end;
ou alors, il faut fermer le socket en ayant pris soin, avec setsockopt de mettre le flag SO_LINGER, et un Timeout de 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 recv(NumeroSocket, BufferArrayOfByte, (SizeOf(BufferArrayOfByte)), 0);
Comme ça, closesocket réussi toujours.





J'ai testé le code en créant et détuisant l'objet TIdLPR mais ça ne marche toujours pas.
Pour le fait de vider le buffer , je suis en delphi 7 et apparament la fonction recv fait parti de WinSock qu'il faut éviter d'utiliser maintenant (je l'ai lu , je ne l'affirme pas).
Merci
non, ne t'inqiete pas, recv fait aussi parti de Winsock2, d'une part;
Ensuite et effectivement, tant que tu n'utilises pas un fichier comme celui de Alex Konshin (disponible sur www.torry.net) pour acceder aux API Winsock2, tu n'accède effectivement qu'aux API des Winsock v1.1. (Qui marchent quand même convenablement pour faire un recv).
Quand tu as affaire avec du réseau, je ne vois pas pourquoi tu éviterais de passer par les Winsock si tu es sous Windows, puisque c'est ce qu'utilisent quasiment tous les logiciels sous Windows et que ça marche très bien (ni mieux, ni moins bien qu'autre chose : il ne faut pas écouter radio trottoir !).
Pour info : je suis sous Delphi 7 et recv fonctionne très bien.
Je pense que si tu veux t'en sortir, il va falloir que tu utilise cette fonction afin de vider le buffer de ton socket avant deconnection.
Ca ne devrait pas représenter plus d'une dizaine de lignes de code, mais ces sur, même moi je ne m'en sent pas le courage... (il faut d'abord récupérer le numéro de socket, et là ça risque d'etre problématique)
Partager