Automatisation d'impression

NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009 - 17 janv. 2009 à 18:50
NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009 - 23 janv. 2009 à 08:44
Bonjour à tous,

Voila mon projet histoire de me simplifier un peu la vie.

But: imprimer toute une série de fichier présent dans un répertoire
Problème: il s'agit d'un vieux soft qui ne permet pas le "select all > click droit > print" :( !
Problème 2: ça fais un bail que j'ai plus programmé..

J'avais donc penser a faire un "soft" qui agirrait comme suit:

1.Lister les fichiers d'un dossier et les compter (registre X)
2.Modifier un des fichiers ini du programme pour que lorsqu'on fait "ouvrir" il arrive directement dans le bon répertoire (accessoirement, stocker l'ancienne valeur afin qu'on puisse la remettre après)
3.Ouvrir le soft en question
4.Placer le nom du 1er fichier dans le clipboard
5.Simuler un "Ctrl+L" (ouvrir)
6.Simuler un "Ctrl+V" (tout le monde sait ce que cela fait ;-))
7.Simuler un "Enter" [Le fichier est ouvert dans le soft]
8.Simuler un "Ctrl+P" (print)
9.Simuler un "Enter"
10.Décrémenter le registre X et placer le nom du 2éme fichier dans le clipboard
11.Repartir a l'étape 5 jusqu'a ce que X=0
12.Si x=0, restaurer la valeur du fichier ini à celle d'origine

Que pensez vous de mon "organigrame" ? Avez vous des sources qui pourraient m'aider ?

Merci d'avance à tous..

9 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
17 janv. 2009 à 20:08
Salut
Oui, manque peut-être la refermeture de ton logiciel après impression, non ?
sinon les instances vont s'accumuler.
Alors encore quelques SendKeys (pour l'envoi de touches) de plus.
Faudra aussi prévoir une petite boucle/tempo entre l'ordre d'impression et la fermeture du soft.

Pour ton histoire de fichier INI, j'ai pas tout compris.
Tu peux éviter ça en incluant le répertoire au nom du fichier, je pense.

Pour réaliser tout ça, il te suffit de taper les mots clés associés à chacune des tâches dans la case Rechercher parmi les Codes en .Net seulement, pour découvrir comment faire.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009
17 janv. 2009 à 21:02
Déjà merci pour ta réponse rapide jack.

Oui en effet, j'avais oublié la fermenter a la fin, ça peut être bien pratique.

Un simple timer fera l'affaire tu penses pour la durée d'impression?

En gros pour le INI, dans le repertoire du programme, il y a un fichier ini (config.ini si je me souviens bien, peu importe en faite), dont une ligne est le repertoire qu'ouvre le programme par défaut lors d'un "open" ou d'un "save". Je sais pas si c'est très clair comme explication :-) !
Mais si j'en suis tes conseils, en rentrant, par exemple, c:\dossier\fichier.xxx dans le champ "ouvrir", j'aurai le fichier en question qui s'ouvrira, c'est bien ça?

Derniere chose, je n'ai qu'une licence pour VB6, donc pas de .net, gros problème(s) en perspectives ?!

Merchi..
0
NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009
17 janv. 2009 à 23:16
Re-bonjour..

Je glande pas, j'ai déjà fait beaucoup de recherche, pour l'instant, j'arrive à trouver (et compter) les fichiers d'un dossier dans une filelistbox, l'imprimer automatiquement et fermer le programme après (appelons cela procédure "print").

Par contre je trouve pas comment dire a ce gentil VB: tu prends le 1er fichier de la filelistbox, tu me fais la procédure "print", tu compares la valeur du registe X, si X pas égal à 0, tu prend le 2éme etc etc jusqu'a ce que X=0 ! J'imagine que ça doit être avec un "for i = .." mais je vois pas comment l'integrer ç une filelistbox!

Voici mon code actuel :

--------------------------------------------------------------------------------------------------------------------
Private Declare Function GetTickCount Lib "kernel32" () As Long 'var

Private Sub Form_Load()
Dir1.Path = txt_source.Text
End Sub

Private Sub Drive1_Change()
    Dir1.Path = Drive1.Drive
End Sub

Private Sub Dir1_change()
    File1.Path = Dir1.Path
    lbl_nbr_files.Caption = File1.ListCount
End Sub

Private Sub Pause(TempDePause As Variant)
Dim A As Variant
Dim B As Integer
Dim C As Variant
A = GetTickCount()
      Do
B% = DoEvents()
C = GetTickCount()
Loop Until C - A >= TempDePause * 1000
End Sub

Private Sub Cmd_Click()
    txt_nbr.Text = File1.ListCount
End Sub

Private Sub cmd_go_Click()
Clipboard.Clear
Clipboard.SetText (txt_root.Text)
txt_root.Text = Dir1.Path & "" & File1.FileName
End Sub

Private Sub File1_DblClick()
    txt_root.Text = Dir1.Path & "" & File1.FileName
End Sub

Private Sub cmd_print_Click()
txt_root.Text = Dir1.Path & "" & File1.FileName
Pause 0.5
Clipboard.Clear
Clipboard.SetText (txt_root.Text)
Pause 1
Shell ("C:\Program Files\winpol.exe"), vbNormalFocus
Pause 3
SendKeys "%F"
Pause 1
SendKeys "o"
Pause 1
SendKeys "^V"
Pause 1
SendKeys "%O"
Pause 1
SendKeys "%F"
Pause 1
SendKeys "P"
Pause 1
SendKeys "%O"
Pause 3
SendKeys "%F"
Pause 1
SendKeys "x"
End Sub

--------------------------------------------------------------------------------------------------------------------



Grand merci d'avance..
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
18 janv. 2009 à 00:52
Re
Si tu fais du VB6, pourquoi poser ta question dans la catégorie .NET ?
Pour perdre inutilement du temps ?
Bref, catégorie modifiée.

Dans ton code d'attente :
DoEvents tout seul suffit, il n'est pas nécessaire de dimensioner une variable B.

Attention à ne pas utiliser de nom de variable ou de procédure qui puisse ressembler à des termes de programmation. "Pause" est un terme DOS, pas de souci, mais méfie toi, cela peut donner des erreurs difficile à résoudre.

Dans ton code cmd_print, tu fais des SendKeys.
Je te recommande d'utiliser tous les paramètres de cette instruction pour demander au code d'attendre l'exécution avant de continuer - voir l'aide de la fonction

Est-ce que ton logiciel accepte un chemin en plus du nom du fichier : Ca, il n'y a qu'en l'essayant que tu le sauras.

As-tu essayé de fournir le nom du fichier à ouvrir en même temps que l'ordre de lancement de ton logiciel ?
C'est à dire que, au lieu de faire un simple
   Shell "C:\CheminExe\monExe", ...
de faire un 
   Shell "C:\CheminExe\monExe  C:\CheminDoc\monDoc.truc", ...
Si cela ouvre le document, cela permet d'éviter les SendKeys
NB : Les parenthèses que tu as mises ne servent à rien.
NB : Si l'extension de tes fichiers à imprimer est associée à ton exécutable, voir l'API nommée "ShellExecute" longuement illustrée dans les Codes et questions forum du site - peut être pratique.

A propos des SendKeys, sache que cette instruction envoie un/des caractères vers la fenêtre qui a actuellement le focus. Alors méfiance : entre 2 SendKeys séparés par une tempo de 1 sec, ne va pas cliquer ailleurs !

Est-ce que ta sub cmd_print fonctionne ?
Ce serait déjà un point important à régler avant de commencer à tout compliquer avec une avalanche de fichiers.

Pour ta boucle, les fichiers étant dans une liste, il est facile de faire une boucle For-Next.
En plus, tu as déjà utilisé dans ton code les termes qui te fourniront les valeurs bornes : File1.ListCount
Seule chose à laquelle il faut faire attention, c'est que les index de ListBox commencent à 0 et pas à 1, donc, en commençant de 0, il faudra aller jusqu'à File1.ListCount - 1

Le code que tu as mis dans cmd_print, mets le dans une autre Sub, par exemple ImprimeUnFichier et tu lui déclares un paramètre (*) qui sera le nom du fichier à utiliser en lieu et place de "txt_root.text".
(*) comme tu l'as fait pour ta Sub Pause, mais cette variable sera de type String
Ensuite, dans cmd_print ainsi vidée, tu mets ta boucle de lecture de ta liste et tu lances des appels à ta Sub ImprimeUnFichier File1.List(tonIndexDeBoucleForNext)

Ne m'en veux pas, mais je n'aime pas donner du code tout fait.
Tu as les indices pour t'aider à chercher les solutions.
Ces solutions sont dans l'aide de VB6 et parmi les milliers de codes ou questions forum du site.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009
18 janv. 2009 à 11:17
Hello,

Sorry j'ai du me tromper de cat (pas fait attention que j'étais en .net)
J'ai essayer en utilisant la syntaxe
Shell "C:\CheminExe\monExe  C:\CheminDoc\monDoc.truc" mais cela ne fonctionne malheureusement pas.


J'ai quand même encore avancé et suivit tes conseils mais la je bloque vraiment au niveau de la déclaration du paramétre pour mon "printfile" ainsi que pour faire la boucle.




Voici ou j'en suis pour cette procédure:



Private Sub cmd_print_Click()
printfile
End Sub

Private Sub printfile()
txt_root.Text = Dir1.Path & "" & File1.FileName
Pause 0.5
Clipboard.Clear
Clipboard.SetText (txt_root.Text)
Pause 1
Shell "C:\Program Files\QA90PRO32\QA90pro.exe", vbNormalFocus
Pause 3
SendKeys "%F", True
SendKeys "o", True
SendKeys "^V", True
SendKeys "%O", True
SendKeys "%F", True
SendKeys "P", True
SendKeys "%O", True
SendKeys "%F", True
SendKeys "x"
End Sub

Et voila ce que j'ai essayé:

Private Sub cmd_print_Click()
For i = 0 To File1.ListCount - 1
printfile file1.list(i)
Next i
End Sub

Private Sub printfile(filetoprint as string)
filetoprint = Dir1.Path & "" & File1.FileName
Pause 0.5
Clipboard.Clear
Clipboard.SetText (filetoprint)
Pause 1
Shell "C:\Program Files\QA90PRO32\QA90pro.exe", vbNormalFocus
Pause 3
SendKeys "%F", True
SendKeys "o", True
SendKeys "^V", True
SendKeys "%O", True
SendKeys "%F", True
SendKeys "P", True
SendKeys "%O", True
SendKeys "%F", True
SendKeys "x"
End Sub

Malheureusement, cela ne fonctionne pas du tout :/ ! Est-ce que mon 2éme code a du sens ou c'est du grand n'importe quoi ?

Merki :)
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
19 janv. 2009 à 09:44
Re
C'est presque ça, sauf que dans printfile, tu écrases le nom du fichier !

Private Sub cmd_print_Click()
For i = 0 To File1.ListCount - 1
   printfile Dir1.Path & "" & file1.list(i)
Next i
End Sub

Private Sub printfile(filetoprint as string)
<strike>filetoprint = Dir1.Path & "" & File1.FileName
</strike>Pause 0.5
...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009
21 janv. 2009 à 10:25
Merci pour tout ces précieux conseils, ma petite appli fonctionne plutot pas mal :-) !

A bientot..
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
21 janv. 2009 à 13:24
Enfin une bonne nouvelle dans ce bas monde !
De rien.
0
NYghost Messages postés 26 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 23 janvier 2009
23 janv. 2009 à 08:44
En faite, j'ai parlé un peu vite :/ ..

Je dois avoir un problème dans ma boucle car si j'ai (par exemple) 5 fichiers, il me print bien 5 feuilles mais c'est 5 fois le 1er fichier..

Private Sub cmd_print_Click()
    For i = 0 To File1.ListCount - 1
        printfile Dir1.Path & "" & File1.List(i)
    Next i
End Sub




Private Sub printfile(filetoprint As String)
        Pause 0.5
    Clipboard.Clear
    Clipboard.SetText (txt_root.Text)
        Pause 1
    Shell ("C:\Program Files\QA90PRO32\QA90pro.exe"), vbNormalFocus
        Pause 3
    SendKeys "%F", True
    SendKeys "o", True
    SendKeys "^V", True
    SendKeys "%O", True
    SendKeys "%F", True
    SendKeys "P", True
    SendKeys "%O", True
    SendKeys "%F", True
    SendKeys "x"
End Sub



Pourtant rien ne me saute aux yeux ?!
0