ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

GetPath   



L'auteur

eddymaue
Canada Canada
Membre Simple
# 0000000075
enregistré le 26/10/2004
Maue Eddy
j8j 8j8 Gatineau
de la société Formatek
Fiche personnelle


Note des membres
pas de note

Contributions > 20 - Trucs et Astuces

GetPath
# 0000000692
ajouté le 17/05/2009 02:34:13 et modifié le 18/05/2009
consulté 3988 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0


Télécharger le ZIP (884 octets)
Description

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

 

 

 

 

Code source :
*
* si vous utilez cette technique d'approche c'est important que la ligne suivante
*
*     * Hauteur Eddy Maue ;o)
*
* apparaisse.
*


With Createobject("AddGetPathPourFoxCode")
  .Add()
Endwith

Define Class AddGetPathPourFoxCode As custom
  lcFC = ""
  Procedure Add()
  This.lcFC = _Foxcode
  _Foxcode = ""
&& Vérifier si GetPath existe dans Foxcode.dbf

  Select abbrev From (This.lcFC) Where Padl("getpath",Len(abbrev)) $ Lower(abbrev) Into Array laGetPathExiste

  If Vartype(laGetPathExiste)#"U"
    Return
  Endif
  lcAddAbbrev = "getpath"
  lcExpand = ""
  lcType = "U"
  lcCase = "M"
  lcCmd = "{}"
  ltTimestamp = Datetime()

  #ifndef cr
     #define cr Chr(13)
  #enddef
  lcData = [LPARAMETER oFoxCode] + cr ;
  +     [oFoxcode.valuetype = "V"] + cr ;
  +     [text to lcData textmerge noshow] + cr + cr ;
  +     [* Auteur Eddy Maue ;o)] + cr ;
  +     [Local lcGetPathOfThisFile ]+Chr(Asc('&'))++Chr(Asc('&'))+[ le chemin de ce fichier] + cr ;
  +     [lcGetPathOfThisFile = JustPath(Substr(Sys(16),At(":",Sys(16))-1))] + cr + cr  ;
  +     [endtext] + cr ;
  +     [Return lcData] +cr




  Insert Into ( This.lcFC ) (abbrev,expanded,Type,Case,cmd,Data,timestampValues ;
    ( lcAddAbbrev ;
    , lcExpand ;
    , lcType ;
    , lcCase ;
    , lcCmd ;
    , lcData ;
    , ltTimestamp ;
    )

  Endproc

  Procedure Destroy

  If Used(Juststem(This.lcFC))
    Use In (Juststem(This.lcFC))
  Endif
  _Foxcode = This.lcFC

  Endproc
Enddefine





Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2018.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0