IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Problème de construction du nom d'une variable [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Problème de construction du nom d'une variable
    Bonjour,

    Je suis désolé d'avoir recours au Forum pour un problème dont la solutiion était jusqu'à présent évidente et qui ne posait aucune question :
    je souhaite modifier le nom d'un fichier qui se termine par .CSv. Jusuq'à présent la construction d'un chemin complet et nom d'un fichier ne me posait aucun problème.
    Le code en question est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NomFichUTF := ED_FichChoisi.Text ;  // le chemin complet et nom d'un fichier se terminant par .csv
        TradFichANS := '';  // initialisation de la variable string TRadFichANS
        Valeur1 := '' ;  // Initialiastion de la variable string Valeur1
        For k :=  0 To ((length(NomFichUTF))-4) Do
         Begin
          Valeur1 := NomFichUTF[k] ;
          TradFichANS := TradFichAnS + Valeur1 ; //construction du nom du fichier converti
         end;
        TradFichANS := TRadFichANS+ '_ANS.csv' ;  // le chemin et nom complet du fichier
    Bien entendu, la variable Valeur1 n'a été introduite que pour vérifier que la lecture de la variable NomFichUTF caractère par caractère se faisait correctement ce qui est le cas.
    Par contre la construction pas à pas du contenu de la variable TradFichANS ne se fait pas et le contenu de cette variable reste vide !!!

    Qu'ai-je oublié ? peut-être dans les Uses où les paquets rfequis (l'inpecteur de projet affiche FCL, LazUtils, LCL ( les deux derniers étant ajoutés par moi.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Je vois au moins un problème dans le code que vous montrez, c'est NomFichUTF[k], avec k = 0. k devrait commencer à 1, me semble-t-il.

    Personnellement, pour ce genre de problème, je mets des WriteLn aux endroits concernés et je lance mon programme depuis la console.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Pour avoir le nombre de caractères d'une chaîne UTF8, il vous faut utiliser UTF8Length et non Length. Et aussi (voir réponse précédente) le premier caractère d'une chaîne est à l'indice 1.

    Si j'ai bien compris, vous voulez remplacer '.csv' par '_ANS.csv'; Pourquoi ne pas utiliser simplement la fonction
    stringReplace ? Comme il y a très peu ce chances qu'il y ait deux fois '.csv' dans le nom du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TradFichANS := stringReplace(NomFichUTF , '.csv',  '_ANS.csv' ,[rfIgnoreCase]);
    Mais si vous, voulez faire autre chose que simplement changer l'extension, alors ni votre code, ni le mien ne conviennent et il vous faut préciser votre objectif...

    bb84000

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Réponse
    Bonjour,

    Effectivement c'est bien le remplacement que je veux faire. Je ne connaissais pas cette instruction qui fera parfaitement l'affaire. Il n'empêche qu'il est anormal que la construction caractère par caractère du nouveau nom bloque et que la variable TradfichANS reste vide car la boucle remplit bien son rôle quant à l'individualisation des caractères. La variable valeur1 prend bien la valeur D puis : puis \ puis T etc.. si la valeur de NomFichUTF est D:\toto\monfichier.csv même si l'instruction est length et nom UTF8Length et qu'elle commence à 0 et non 1.
    Le problème est donc contourné mais pas vraiment résolu.
    Merci pour vos réponses.

    R. O.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Réponse et fin
    Bonjour,

    Mea culpa !!!

    Je viens de tester les réponses qui m'ont été faites et, particulièrement de commencer la boucle "For k := ..." à 1 et non à 0 et ce simple changement fait que la chaine TradFichANS est construite sans problèmes. Le fait que la chaine, en commençant à zéro ne renvoie rien pour le premier caractère de construction de TradFichANS bloque le déroulement normal de la boucle.
    Même si la solution du simple remplacement est beaucoup plus satisfaisante, c'est un soulagement d'avoir résolu le problème de la boucle.

    Merci à tous

    R.O.

  6. #6
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour !

    Parfait.


    A noter que si vous voulez changer l'extension d'un fichier sans connaître cette extension, vous pouvez utiliser la fonction ExtractFileExt(FileName) et utiliser la valeur retournée dans la fonction StringReplace...

    bb84000

  7. #7
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 745
    Points
    9 745
    Par défaut
    Citation Envoyé par OR34a Voir le message
    Bonjour,

    Mea culpa !!!

    Je viens de tester les réponses qui m'ont été faites et, particulièrement de commencer la boucle "For k := ..." à 1 et non à 0 et ce simple changement fait que la chaine TradFichANS est construite sans problèmes. Le fait que la chaine, en commençant à zéro ne renvoie rien pour le premier caractère de construction de TradFichANS bloque le déroulement normal de la boucle.
    Même si la solution du simple remplacement est beaucoup plus satisfaisante, c'est un soulagement d'avoir résolu le problème de la boucle.

    Merci à tous

    R.O.
    Juste pour info. Dans les "string" pascal, qui sont limitées à 255 caractères, de mémoire, le Chaine[0] contient le code ascii représentant la longueur de la chaine. Forcer ce caractère doit pas être acceptable et provoquer un dysfonctionnement !
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Merci
    Merci pour les compléments et l'explication du dysfonctionnement si on initialise la boucle à 0.

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Il est préférable d'utiliser UTF8Length pour assurer la compatibilité mais ici et puisque le chemin n'est constitué que de caractères ASCII Length renverra aussi la longueur correct.

    Citation Envoyé par OR34a Voir le message
    Le fait que la chaine, en commençant à zéro ne renvoie rien pour le premier caractère de construction de TradFichANS bloque le déroulement normal de la boucle.
    Non il n'y a aucun blocage et je dirais même que TradFichANS est correctement rempli mais NomFichUTF[0] vallant #0 (hazard ?) et #0 étant la marque de fin de chaîne, TradFichANS est tronquée à l'affichage.
    Pour s'en convaincre, il suffit de contrôler la longueur de la chaîne par UTF8Length(TradFichANS) et constater que le résultat est bien la longueur de chaîne voulue... +1. On pourrait même effacer ce premier caractère #0 par Delete(TradFichANS, 1, 1) pour retomber sur nos pieds.

    A contrario, StrLen(PChar(TradFichANS)) retournerait bien 0 puisque dans ce cas c'est la position du #0 qui est déterminante.

    Citation Envoyé par Jon Shannow Voir le message
    Dans les "string" pascal, qui sont limitées à 255 caractères, de mémoire, le Chaine[0] contient le code ascii représentant la longueur de la chaine. Forcer ce caractère doit pas être acceptable et provoquer un dysfonctionnement !
    C'est effectivement la longueur dans le cas d'une ShortString mais l'allocation est toujours de 256 octets. Le caractère zéro ne faisant que donner la longueur utile dans ce buffer il n'y a pas de dysfonctionnement possible.
    Et au contraire, à l'époque c'était une façon simple de tronquer une chaîne. Si TradFichANS avait été de ce type et qu'on voulait juste en conserver le lecteur (d:\), TradFichANS[0] := chr(3) était parfait (mais maintenant on préfèrera SetLength bien sûr).

  10. #10
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut KISS
    Bonjour,

    Et le plus simple de tout, il y a tout une ribambelle de fonctions qui traficottent les noms de fichier dont celle-ci :

    Code PASCAL : Sélectionner tout - Visualiser dans une fenêtre à part
    FileName2 := ChangeFileExt(FileName, '.csv');

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  11. #11
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour Guesset,

    Bon sang, je l'avais loupée, celle-là, quand je voulais une fonction pour supprimer l'extension !

    bb84000

  12. #12
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 329
    Points : 4 146
    Points
    4 146
    Par défaut
    Bonjour,

    Il me semble même qu'il y en a une qui ne récupère que le nom du fichier sans l'extension ni chemin d'accès. Mieux, il y en a aussi une qui éclate un nom long en drive, chemin, nom, extension. Il faut juste faire attention aux noms qui ont plusieurs charnières comme Toto.old.pas, même si les fonctions considèrent généralement que l'extension va de la fin vers le premier point en marche arrière. Mais les appels successifs...

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Module dont le nom est une variable
    Par Mr Hyde dans le forum Général Python
    Réponses: 11
    Dernier message: 26/02/2023, 20h39
  2. [MySQL] problème nom de table en SQL parce que le nom est une variable
    Par Boujoute dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/02/2012, 00h08
  3. [Reflection] Connaître le nom d'une variable ...
    Par dahwoud dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 09/08/2005, 14h37
  4. Réponses: 5
    Dernier message: 25/05/2005, 22h29
  5. Réponses: 2
    Dernier message: 14/05/2004, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo