#1 Tue 11 November 2008 22:11
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Ouvrir toutes les tables présentes dans un répertoire.
Bonjour,
Dans le cadre d'un programme qui utilise de nombreuses tables situé dans un même dossier. Je donne le choix à l'utilisateur de sélectionner le répertoire de travail. Cependant j'aurais aimé soit récupérer le nom des tables présente dans le répertoire (dont le nom et le nombre varie fréquemment) soit toutes les ouvrir dans la session courante.
Ma question est donc comment es ce possible de réaliser l'une ou l'autre de ces manipulations? Sachant que j'ai déjà récupérer le chemin du répertoire sur lequel je vais travailler
Merci d'avance
Hors ligne
#2 Tue 11 November 2008 23:07
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonsoir
Piste: faire une liste (dans une variable array) de tous les *.tab (éventuellement de ceux seulement qui sont accompagnés d'un *.map: tables graphiques, sauf images) et présenter cette liste dans une MultiListBox ou un PopUpMenu
Mais là il est tard...
Hors ligne
#3 Wed 12 November 2008 11:25
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: Ouvrir toutes les tables présentes dans un répertoire.
Merc de votre réponse , cependant ceci me paraissait normal de fonctionner comme cela mais le probleme est : par quel fonction puis je récuperer la liste des tables présentes dans le répertoire sachant que leurnom et leur nombre n'est pas fixé.
Hors ligne
#4 Wed 12 November 2008 13:45
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Pour la liste, ce n'est pas totalement trivial ....
Une solution simple est de passer par DOS (eh oui...) en créant en début de programme la liste des TABs du répertoire sous forme d'un fichier texte, que l'on détruira en fin de programme. Entre temps on lira dans ce fichier de quoi établir une variable liste des TAB.
Soit la variable "repertoire", texte, connue (par exemple repertoire="C:\temp\") et une variable s_chaine texte
Soit aussi une variable variable liste TABnames(0) et une variable i entier
s_chaine= "Run Program "+chr$(34)+"cmd.exe /c Dir "+repertoire+"*.tab"+" /O-D /B >"+repertoire+"liste_tab.txt"+chr$(34)
Run Command s_chaine
'.... ensuite on lit les noms dans le fichier et on les mets dans la variable liste
s_chaine = "Open File "+chr$(34)+repertoire+"liste_tab.txt"+chr$(34)+" for input As #1"
Run Command s_chaine
i=1
Do While Not EOF(1)
Line Input #1, str
If Not EOF(1) Then
Redim TABnames(Ubound(TABnames)+1
TABnames(i)=str
i=i+1
End If
Loop
Close File #1
' enfin, si on veut tout traiter:
For i=1 To Ubound(TABnames)
' faire ici le traitement prévu pour chacun des TABs présents dans repertoire,
' par un call sub_procedure par exemple
Next
Note CHR$(34) permet d'insérer " (guillemet) dans le texte
Hors ligne
#5 Sun 16 November 2008 19:27
- snaileater
- Participant actif
- Date d'inscription: 5 Nov 2008
- Messages: 121
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonjour,
j'ai voulu tester ces exemples et je bloque à la ligne suivante :
Code:
Open File "d:\liste_tab.txt" for Input as #1
Testée dans le code ou dans la FMB j'ai le même comportement :
"commande indisponible : open" ...
Où peut-être l'astuce ?
Merci !
Hors ligne
#6 Sun 16 November 2008 19:49
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonjour
Dans la FMB ...pas étonnant, cette commande n'y est pas autorisée !!
Dans le code...ça doit passer si le chemin est "en dur" comme dans votre exemple, par contre s'il y a une variable il faut passer par une commande interprétée comme dans l'exemple de mon post #4
Hors ligne
#7 Sun 16 November 2008 21:04
- snaileater
- Participant actif
- Date d'inscription: 5 Nov 2008
- Messages: 121
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonsoir,
j'essaie juste de faire fonctionner les quelques lignes indiquées auparavant :
Code:
s_chaine = "Open File "+chr$(34)+repertoire+"liste_tab.txt"+chr$(34)+" for input As #1" Run Command s_chaine
avec repertoire="d:\"
et je n'y arrive jamais ... encore un pb de guillemets et chr$(34) mais je tourne en rond ...
Hors ligne
#8 Sun 16 November 2008 21:11
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Tout est bon dans les guillemets
Si s_chaine et repertoire sont bien définis en string...ça doit marcher dans un mbx
Par contre c'est inutilisable dans la FMB (cf. plus haut)
Hors ligne
#9 Mon 17 November 2008 10:05
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonjour et merci pour votre réponse mais je vais encore vous embeter un petit peu....
Désolé mais en fait l'instruction d'ouverture du fichier txt avec la liste ne fonctionne pas, mapinfo me retourne que la commande open est indisponible, ca a fonctionné une premiere fois (vendredi juste pour tester brievement votre code sur mon poste avant le weekend)mais depuis impossible d'acceder à la sutie.
J'ai placé un note juste apres l'instruction et cela me rapporte quelque chose de similaire à la syntaxe disponible dans l'aide de Mapbasic (au guillemet près )
Hors ligne
#10 Mon 17 November 2008 10:38
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
...J'ai placé un note juste apres l'instruction et cela me rapporte quelque chose de similaire à la syntaxe disponible dans l'aide de Mapbasic (au guillemet près )
Bon...on va se résoudre à considérer que l'aide en ligne a tort
Deux solutions
- tester
s_chaine = "Open File "+repertoire+"liste_tab.txt"+" for input As #1"
print s_chaine
Run Command s_chaine
- ou tester
dim bidule as string
bidule=repertoire+"liste_tab.txt"
print bidule
Open File bidule for input As #1
nb: je préfère print à note car on peut copier-coller du contenu de la fenêtre message....
Hors ligne
#11 Mon 17 November 2008 11:23
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: Ouvrir toutes les tables présentes dans un répertoire.
Meme probleme avec ses codes ,l'erreur retorunée est la meme que celle de snaileater (message 12 du sujet)
Ps: c'est vrai que le print est mieux et garde en mémoire les derniers "essais"
Hors ligne
#12 Mon 17 November 2008 12:02
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Idée !!
DOS va trop vite !! Le fichier liste_tab.txt se crée instantanément et il faut un système un moment pour "prendre conscience" de son existence
Après sa création (avant de faire Open File...) utilisez une sous procédure d'attente genre
declare sub attente(byval duree as smallint) 'à introduire au début
.........
s_chaine= "Run Program "+...
Run Command s_chaine
call attente(2) 'la duree de l'arrêt est donnee en secondes
s_chaine = "Open File "+...
...
--------------------------
sub attente(byval duree as smallint)
dim start as integer
start=timer()
while timer()-start < duree Wend
end sub
Hors ligne
#13 Mon 17 November 2008 12:16
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonne idée ..... mais ça ne fonctionne pas. en effet meme en ne faisant tourner que ce morceau de code avec un ficheir créer et remplit correctement avec les tables présentes dans le repertoire, le message d'erreur retourné est toujours le même
Hors ligne
#14 Mon 17 November 2008 13:06
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Je fatigue...mais voilà un code qui marche, avec la réserve qu'on ne peut pas se dispenser de la commande note "bla, bal..." car MI perd le focus pendant l'exécution de la commande DOS et que c'est tout ce que j'ai trouvé pour qu'il le récupère et affiche le dialogue
declare sub main
declare sub onliste
declare sub attente(byval duree as smallint)
dim repertoire,bidule,liste,s_chaine,str,TABnames() as string
dim i,j as integer
sub main
repertoire="D:\"
s_chaine= "Run Program "+chr$(34)+"cmd.exe /c Dir "+repertoire+"*.tab"+" /O-D /B > "+repertoire+"liste_tab.txt"+chr$(34)
Run Command s_chaine
call attente(2) 'on attend deux secondes
'.... ensuite on lit les noms dans le fichier et on les mets dans la variable liste
bidule=repertoire+"liste_tab.txt"
If FileExists(bidule) Then
note "fichier trouvé... !!"
Open File bidule for input As #1
End If
i=1
Do While Not EOF(1)
Line Input #1, str
If Not EOF(1) Then
Redim TABnames(Ubound(TABnames)+1)
TABnames(i)=str
i=i+1
End If
Loop
Close File #1
Call onliste
end sub
sub onliste
Dialog title "test"
control popupmenu
id 2
title from variable TABnames
Control OKButton
Control CancelButton
end sub
sub attente(byval duree as smallint)
dim start as integer
start=timer()
while timer()-start<duree Wend
end sub
Hors ligne
#15 Mon 17 November 2008 21:40
- snaileater
- Participant actif
- Date d'inscription: 5 Nov 2008
- Messages: 121
Re: Ouvrir toutes les tables présentes dans un répertoire.
bon ... j'ai refait quelques petits tests ... :
Code:
's_chaine = "Open File "+repertoire+"liste_tab.txt for input As #1" s_chaine="Open File d:\liste_tab.txt for input as #1" print s_chaine Run Command s_chaine
le run command fonctionne avec la deuxième ligne mais pas avec la première (celle mise en commentaire) alors que les deux chaines de caractères sont bien censées produire le même résultat ... non ?
De plus cette deuxième ligne fonctionne alors que le nom du fichier dans l'Open File n'est mm pas mis entre guillemets (contrairement à la syntaxe indiquée dans la doc ...)
Le souci que j'ai comme Fabius ce n'est pas de lancer la commande DOS mais la constitution de la bonne chaine pour l'Open File ...
Sinon comme le dit Maurice ... il n'y a pas de raison à utiliser un Run Command dans ce cas là ... puisqu'un simple :
Code:
Open File repertoire+"liste_tab.txt" for input as #1
fonctionne ...
Par contre je veux bien prendre les paris que dès qu'un espace sera présent dans le nom d'un répertoire cette écriture va à nouveau stresser Mapinfo ...
Hors ligne
#16 Mon 17 November 2008 22:26
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Trois conclusions:
- l'aide en ligne se goure et la syntaxe est (ou peut être) Open File bidule.txt... sans guillemets
- Open File ne peut pas être intégré dans une chaine cmd="Open File"+variable+"..." suivie d'un Run Command cmd
- passer par DOS empêche l'utilisation de répertoires avec espaces ou accents etc... Ce n'est pas MapInfo qui cale mais DOS
Une solution: se passer de DOS. Il est tard mais je vous propose bientôt deux méthodes alternatives...
Hors ligne
#17 Tue 18 November 2008 08:49
- magali di salvo
- Participant actif
- Lieu: Lyon
- Date d'inscription: 21 Sep 2005
- Messages: 70
Re: Ouvrir toutes les tables présentes dans un répertoire.
bonjour,
j'arrive comme un cheveux sur la soupe, ou alors j'ai mal compris le sujet mais j'avais eu le même problème voir
ce fil de discussion : http://georezo.net/forum/viewtopic.php?id=52270
et en utilisant l'extrait de code fournit à l'époque par Maurice ça marchait très bien.
je remet à tout hasard, dans le fil ci-dessus, la dernière version du MB que j'avais déduit du code de Maurice (celui que j'avais joint initialement ne fonctionnait pas)...
c'est à adapter en fonction du contexte bien sûr (désolée si je suis "hors sujet")
cordialement
magali di salvo Diren rhône-alpes
[EDIT Maurice] comme il est un peu compliqué, car adapté à ta problématique, je joins, dans le post suivant, un code plus centré sur le présent sujet (qui contient les mêmes "fondamentaux" ...mais eux seuls)
Hors ligne
#18 Tue 18 November 2008 09:07
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Aargh ...grillé !!
Pas hors sujet du tout Magali, mais j'avais moi même oublié(!) ma contribution à tes efforts
Et je joins un bout de code plus simple mais plus adapté au présent sujet qui montre
- deux façons de désigner un répertoire (API, plus puissant et FileOpenDialog, plus simple et "rustique" maist qui laisse le problème des répertoires vides ou qui ne contiennent pas de TAB)
- un exemple de listing des TABs contenus dans le répertoire désigné, à l'aide d'un PopUpMenu (d'autres sont possibles, comme le passage de la variable liste à une liste caractère du genre (tab1;tab2;...tabx), utile dans certains cas)
Bien sûr il faut le compiler pour tester son comportement
Hors ligne
#19 Wed 19 November 2008 09:46
- Fabius
- Participant actif
- Date d'inscription: 19 Mar 2008
- Messages: 130
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bonjour,
Pour le suvi: le code fournit par maurice fonctionne donc merci à tous pour votre aide et désolé de ne pas avoir ressorti le sujet traitant de ce probleme, j'avais pourtant recherché un probleme similaire avant de me décider a créer un post
Hors ligne
#20 Wed 19 November 2008 10:33
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Pas de problème, c'est moi qui aurait dû me souvenir... (faut que je pense à aller consulter ! )
Je ferai un peu de ménage dans le sujet si vous êtes d'accord, pour épargner aux futurs lecteurs nos hésitations...
Hors ligne
#21 Wed 19 November 2008 19:47
- snaileater
- Participant actif
- Date d'inscription: 5 Nov 2008
- Messages: 121
Re: Ouvrir toutes les tables présentes dans un répertoire.
Je trouve personnellement qu'il est toujours un peu dommage de modifier un topic sachant que dans une question se trouve souvent des considérations qui certes peuvent donner l'impression de partir dans tous les sens mais qui globalement restent utiles ... je pense ...
en l'occurrence dans ce topic il y a deux points "annexes" que je trouve parfois assez "galère" :
1] La passation d'une chaine de caractère pour interprétation dans Run Command
2] Les problèmes potentiellement liés avec les processus asynchrones lancés par "Run Program"
Mais ces considérations ne sont pas valables que pour Mapinfo d'ailleurs ...
Hors ligne
#22 Wed 19 November 2008 22:19
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Ouvrir toutes les tables présentes dans un répertoire.
Bon, alors je ne touche à rien
- les commandes interprétées: pas difficile à faire (penser au chr$(34) pour les guillemets et à un print pour vérifier) elles sont à utiliser chaque fois qu'une variable se trouve dans la commande. Mais on a vu que certaines ne marchent pas: peut être - à vérifier - toutes celles que l'on a pas le droit d'utiliser dans la FMB ?
- les processus asynchrone (joli mot mais inconnu de moi (!); je suppose qu'il s'agit du cmd.exe évoqué dans ce fil): la façon de récupérer le "focus" n'est pas résolue (si ce n'est avec un note "bla, bla" ...pas très élégant )
ps: une astuce un peu plus jolie est de remplacer ce note "bla, bla" par Set Window 1011 Front, la fenêtre 1011 étant celle de l'application MapInfo...
re-ps: j'ai pas résisté !! j'ai fait (un peu) le ménage...
Hors ligne
#23 Thu 20 November 2008 09:41
Re: Ouvrir toutes les tables présentes dans un répertoire.
Si quelqu'un souhaite faire une synthèse, il est le bienvenu. A terme, les synthèses pourront aller dans le Wiki pour référence ultérieure, à moins que quelqu'un ne veuille le faire dès à présent, je le guiderais à travers le wiki
Robin.
Hors ligne