Salut à tous,
Au fil des annnées j'ai souvent et je dirais trop souvent essayé des exemples dont les liasons
entre fichiers étaient erratiques. J'ai compris le pourquoi quand Gregory m'a répondu
( voir http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000690)
Si je mets mes forms dans un repertoire X
Si je mets mes prog de ce projet dans un repertoire Y
Si je mets mes prog communs a tous les projets dans un repertoire Z
Comment - le load du form saura-t-il ou se trouve gridcompanion.prg ?
Bien je vais répondre à cette question. Là ou tu l'as mis Greg ;o)
Ce qui m'amène aussi à réaliser que Sys(16) est mal compris et que son utilisation n'est pas adéquatement bien utilsé.
Sys(16) retourne trois types d'indications différents. Enfin c'est du texte qu'il retourne.
1er cas -- dans un fichier.prg on aura
e:\owner\eddy\visual foxpro projects\essaisgetpath\program1.fxp
en gros l'emplacement du fichier compiler.
2ieme -- dans une procedure d'un programme on aura
procedure testsys16 e:\owner\eddy\visual foxpro projects\essaisgetpath\program1.fxp
on y retrouve le mot procedure + le nom de la procedure et enfin le fichier compilé
avec son emplacement sur le disque
3ieme -- dans une classe comme un formulaire ou un objet aura ce qui suis
procedure sys16obj.load e:\owner\eddy\visual foxpro projects\essaisgetpath\program1.fxp
dans la procedure d'un objet s'ajoute le nom de l'objet + le nom de la procedure ainsi que le
nom etl'emplacement du fichier contenant l'objet exécuté
Dans ces trois cas on a un point commun et c'est le double points ':' qui sépare le chemin du
disque local
Faut donc simplement éliminer ce qu'il y a avant le disque local pour trouver ce que l'on veut.
Soit le chemin du fichier exécuté sur le disque de notre ordi.
Quand je charge un exemple que soit sur Atoutfox ou ailleurs, je ne commence pas à modifier l'emplacement
de ces fichiers. Je dézippe le tout et le place dans un dossier spécial. Enfin j'isole le tout pour qu'il n'y
ait pas d'interraction avec mes fichiers de travail.
Donc encore un fois si je reprends l'exemple de Greg ci-haut cité, je vais dans le load du formulaire et
j'ajoute les lignes suivantes ;
* Auteur Eddy Maue ;o)
Local lcGetPath && le chemin de ce fichier
lcGetPath = JustPath(Substr(Sys(16),At(":",Sys(16))-1))
Set Procedure To (m.lcGetPath+'\gridcompanion.prg') ADDITIVE
vous l'aurez compris j'obtiens ainsi le chemin ou j'ai placé le formulaire dans lcGetPath et ne reste plus qu'à lier le
fichier de procedure gridcompanion.prg pour que l'exemple soit entièrement fonctionnel
la valeur, chez moi, de lcGetPath est
e:\owner\eddy\visual foxpro projects\exemple\gregory adam\mouseenterforgrid
comme tous les fichiers de l'exemple sont dans ce répertoire il ne reste qu'à exécutéer la commande SET PROCEDURE TO
Le code livré ci-bas insérera GetPath dans intellisence et tout ce qui reste à faire c'est de tapper Getpath pour avoir
* Auteur Eddy Maue ;o)
Local lcGetPath && le chemin de ce fichier
lcGetPath = JustPath(Substr(Sys(16),At(":",Sys(16))-1))
Voilà c'est tout simple
Pour finir un p'tit rafraîchissement sur là resolution dynamique de recherches de fichiers
dans les répertoires.
set default to c:\MesProjetsVFP\RacineDeMonProjet
c'est ici qu'on fixe l'origine de tout ce qui suit. Enfin presque
c'est le point de référence de l'éxécutable ou de recherche
des fichiers de Vfp
on y placera nos sous-répertoires utiles à notre projet
Tout au long du développement de l'application si on veut
éviter d'écrire le sous-répertoire ou sont nos fichiers, on utilise
le SET PATH TO
set path to data;forms;progs;....
permet de résoudre pour Vfp la recherche de fichiers dans les sous répertoires du projet
ciblés par set default to.
le Set Path TO permet l'emploit de .\ et ..\ pour pouvoir ce déplacer à d'autres niveaux de
l'arbre du disque ciblé par SET DEFAULT TO
on peut des lors écrire
set Path to ..\commun\class additive
se qui permetera la recherche de fichiers sur des répertoires de
de niveaux inférieurs à notre projet sans qu'on est besoin de constamement
écrire le chemin complet. Dans ce cas ci le dossier commun est sur
le meme niveau que le répertoire du projet
travailler sur le meme répertoire ciblié par SET DEFA TO
.\Data\Matable
au final la structure d'un projet peut ressembler à ceci
c:\MesProjetsVFP
\Commun
\headers
\class
\progs
\RacineDeMonProjet
\Data
\Forms
\progs
\reports
\headers
\class
\labels
\docs
\autres
Seul l'inclusion des fichiers d'entêtes (*.h) ne sont pas soumis à ces règles.
Pourquoi ?. Parce que les fichiers d'entêtes sont précompilés et donc SET DEFAULTO
et SET PATH ne sont pas utiles il faut donc localiser et situer dans l'arbre
l'emplacement du fichier.h delà l'importance de comprendre la
mécanique de .\ et ..\
Ce n'est pas important de savoir ou sont localisé nos fichiers si on se rapporte à
là racine du disque. L'important c'est de savoir à quel niveau en dessous ou au dessus
sont localisés les fichiers d'entêtes que nous voulons inclure à un projet ou à un fichier.
Partons d'une racine connue
e:\TousMesProjetsVFP\
Exemple :
.\commun\class
.\commun\headers
.\MonProjet
.\Data
.\prgs
.\headers
....
ce qui ce traduit par
e:\TousMesProjetsVFP\commun\class
e:\TousMesProjetsVFP\commun\headers
e:\TousMesProjetsVFP\MonProjet
e:\TousMesProjetsVFP\MonProjet\Data
e:\TousMesProjetsVFP\MonProjet\prgs
e:\TousMesProjetsVFP\MonProjet\headers
e:\TousMesProjetsVFP\MonProjet\ ....
C'est là une des forces de Vfp, on a pas besoin de connaître la racine
d'un projet ou d'un fichier. On a seulement besoin de connaître son
emplacement relatif.
Dans un programme je pourrais avoir à inclure des fichiers d'entêtes localisés
aux emplacements suivants :
.\commun\headers\edition.h
.\commun\headers\treeview.h
.\MonProjet.h
.\headers\un.h
.\\headers\deux.h
La solution toute simple est de faire toute les liasions dans un seul fichier d'entête
soit celui à la racine du projet. C'est mon choix et le votre peut etre différent.
Mais au final, nous aurons le même résultat.
Des lors le set default et le set path ne servent à rien ici.
tout ce passe à partir du répertoire hôte du fichier.h
L'exemple ici suppose que MonProjet.h est dans le répertoire hôte
du projet
*Fichier MonProjet.h
#include ..\commun\headers\edition.h
#include ..\commun\headers\treeview.h
#include .\headers\un.h
#include .\headers\deux.h
Pour atteindre Edition.h, l'emploit de ..\ permet de remonter d'un
niveau et reste qu'à situer Edition.h avec l'ajout des répertoires
commun\headers
Un autre exemple, plutot de placer MonProjet.h dans le
répertoire hôte du projet. Plaçons le dans le répertoire Headers
du projet
.\MonProjet\headers\MonProjet.h
ce qui nous donne dans MonProjet.h
#include ..\..\commun\headers\edition.h
#include ..\..\commun\headers\treeview.h
#include un.h
#include deux.h
Dans votres prochain exemple que vous soumetterez vous n'aurez plus de problemes
si vous suivez c'est regles de bases.
Si je joins plusieux fichiers dans un exemple à proposer j'agis comme suivant :
je présume que vous enregistrerez mon exemple dans un répertoire qui lui est propre
j'évite d'affecter SET DEFAULT TO et SET PATH TO. Si je ne peux faire autrement,
je les sauve dans des variables et je restore à la fin de l'exemple.
Pour les entêtes à inclure ca passe exactement comme décrit plus haut.
Pour tout autres types de fichiers il faut savoir ou notre fichier principal est localisé sur
le disque.
Et c'est là que GetPaht est utile
Define Class TestGetPaph As Form
Procedure Load
* Auteur Eddy Maue ;o)
Local lcGetPath && le chemin de ce fichier
lcGetPath = Justpath(Substr(Sys(16),At(":",Sys(16))-1))
Set Procedure To (m.lcGetPath+'\gridcompanion.prg') Additive
Use (m.lcGetPath+"\Matable") In 0
Do (m.lcGetPath+"\MonFichier.prg")
Endproc
EndDefine
Bon ca peut devenir rébarbatif de sur employé GetPath si on a beaucoup de fichiers
( forms,progs,tables et autres )
Define Class TestGetPath As Form
p_cPath = ""
p_cDefault = ""
Procedure Load
With Thisform
.p_cPath = Set("Path")
.p_cDefault = Set("Default")
Endwith
* Auteur Eddy Maue ;o)
Local lcGetPath && le chemin de ce fichier
lcGetPath = Justpath(Substr(Sys(16),At(":",Sys(16))-1))
Set Default To (m.lcGetPath)
Set Path To Data;Class
#include .\MonFichier.h
* ici le code utile pour la suite de l'exemple
Endproc
Procedure Destroy
With This
Set Default To (.p_cDefault)
Set Path To (.p_cPath)
Endwith
Endproc
Enddefine
A+ Eddy Maue
|