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

Langage Delphi Discussion :

Convertir string en Array of Char et point de restauration


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Convertir string en Array of Char et point de restauration
    Je souhaite créer un point de restauration systeme dans mon programme.
    j'ai trouvé le code sur le site de developpez.com à l'adresse :
    http://www.developpez.com/delphi/faq...inrestauration

    la ligne suivante, affiche le nom du point de restauration :
    InfoPointRestauration.szDescription := 'Example de point de restauration';

    il s'agit en fait d'un Array et non s'un string

    J'ai voulu ajouter un InputBox pour demander le nom du point de restauration mais impossible ! des problèmes de compatibilité de format entre string et Array. J'ai essayer de transformer le string de l'inputbox en Array of Char
    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      a : string;
      RestoreName : Array[0..255) of char;
    begin
      //Copie d'un string vers un array of char
      RestoreName := StrCopy(a, PChar(RestoreName));
     
      InfoPointRestauration.szDescription := RestoreName;
    mais impossible (type incompatibles) ! j'avoue que je bloque.
    Quelque'un peut-il m'aider ?
    Merci.

    Daniel

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Pourquoi ne pas effectuer uen boucle de 1 a Length(<chaine saisie>) et copiler les caracteres un par un dans le tableau de char

    A verifier ... mais je pense que le tableau doit contenir le caracter nul #0 pour terminer la chaine

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Pour transférer un String dans un Array of Char :

    Essayes donc avec Move(StrSource, BufDestination, Length(StrSource));
    et si Length(StrSource) est trop court (0 terminal AZT de l'Array) remplaces par Length(StrSource)+1) ;

    Pour plus de détails sur Move faire F1.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Marche pas !
    marche pas (avec ou sans +1) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      RestoreName  : string;
      RestoreName2 : Array[0..255] of Char;
    begin
     
    repeat
      RestoreName := InputBox('Point de restauration', 'Entrez un nom', 'Nouveau point de restauration');
      until RestoreName <> '';
     
      Move(RestoreName, RestoreName2, Length(RestoreName));
      InfoPointRestauration.szDescription := RestoreName2;  //Array of
    Types incompatibles !
    Quelqu'un peut-il me dire s'il s'agit bien d'un Array of Char pour InfoPointRestauration.szDescription" ?

    Quelqu'un peut il tester le code (voir lien dans la question) ?


    Daniel

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Y'a pas beaucoup de monde sur le forum aujourd'hui.

    Mais si tu tapes 'Copy String to array of char' dans l'Edit qui s'ouvre avec la fonction Chercher dans le Forum (en haut à droite de la page 1 du Forum) on trouve une discussion sur ce sujet qui te donnera peut-êtres des idées.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2007
    Messages : 91
    Par défaut
    Mr secretman.

    peut-etre que c'est StrPCopy que tu dois utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function StrPCopy(Dest:PChar;const Source:string):PChar;
    StrPCopy copie Source dans une chaîne à zéro terminal Dest.Elle renvoie un pointeur vers Dest.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
    a : string;
    RestoreName : Array[0..255) of char;
    begin
    StrPCopy(RestoreName,a);
    InfoPointRestauration.szDescription := RestoreName;

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Types incompatibles !
    StrPCopy(RestoreName,a);

    [Erreur] Unit1.pas(467): Types incompatibles

    Je me demande si "InfoPointRestauration.szDescription"
    est bien d'un Array of Char ??? car j'ai tout essayer en vain.

    Qu'y a t-il comme autres Array ? Byte ? ...

    Si quelque'un à le temps de regarger le source, 2 secondes, pour me dire ce qu'il en pense :

    http://www.developpez.com/delphi/faq...inrestauration

    Merci d'avance,

    Daniel

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Par défaut Y'a pas de doute...
    Non, y'a pas de doute, c'est bien un Array of Char...

    Tu peux refaire un copier-coller de ton code avec ton Input ? J'ai l'impression que le problème vient de l'input et non pas du type d'origine...

  9. #9
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Par défaut Dans l'api...
    Dans l'api le szDescription est limité à 64 caractères... T'es sûr que ton problème ne vient pas de là ???

  10. #10
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    Hello,

    et en essayant Move(StrSource[1], BufDestination, Length(StrSource)); ?

    la partie array of char d'un string commence au rang 1 et non 0, ne l'oublions pas.

    dsl, je n'ai pas delphi ici pour tester.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Toujours type incompatible (voivi le code) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    var
      a : string;
      RestoreName : Array[0..63] of char;
    begin
      // Initialise l'enregistrement
      InfoPointRestauration.dwEventType := BEGIN_SYSTEM_CHANGE;
      InfoPointRestauration.dwRestorePtType := APPLICATION_INSTALL;
      InfoPointRestauration.llSequenceNumber := 0;
     
      a := InputBox('Point de restauration', 'Entrez un nom', 'Nouveau point de restauration');
      Move(a[1], RestoreName, Length(a));
      //  a := StrCopy(RestoreName, PChar(a)); //test2
      // a := StrPCopy(RestoreName, PChar(a)); //test3 : toujours rien
     
      InfoPointRestauration.szDescription := RestoreName;
    Voici donc le code, pour trouver le truc qui coince !

    Daniel

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 477
    Par défaut
    salut

    restorename n'est pas du meme type que szDescription


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MAX_DESC = 64; 
    ...
     // Informations de point de restauration 
    type 
    ... 
       szDescription: array [0..MAX_DESC] of CHAR; // Description : Nom de l'application / opération 
    ...
    64 est different de 63

    @+ Phil

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Toujours incompatibles !
    var
    RestoreName: array [0..MAX_DESC] of CHAR;
    toto : string;

    toto := InputBox('Point de restauration', 'Entrez un nom', 'Nouveau point de restauration');

    Move(toto[1], RestoreName, Length(toto));
    //StrPCopy(RestoreName,toto)

    InfoPointRestauration.szDescription := RestoreName; //Array of

    Toujours type incompatible ! c'est à s'arracher les cheveux.

  14. #14
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    Citation Envoyé par secretman
    var
    RestoreName: array [0..MAX_DESC] of CHAR;
    toto : string;

    toto := InputBox('Point de restauration', 'Entrez un nom', 'Nouveau point de restauration');

    Move(toto[1], RestoreName, Length(toto));
    //StrPCopy(RestoreName,toto)

    InfoPointRestauration.szDescription := RestoreName; //Array of

    Toujours type incompatible ! c'est à s'arracher les cheveux.
    bonjour, j'ai pu jouer un peu avec delphi ce week end.

    Move(toto[1], RestoreName[0], Length(toto));

    devrait mieux fonctionner. attention aux longueurs respectives des tableaux de caractères

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Toujours type incompatible
    Merci pour tes tests !
    RestoreName prend bien le contenu de toto comme un Array (chaque caractère est séparé dans la chaine) mais il rempli les autres caractères, au dela de la longueur de toto jusqu'au 64e caractère, avec des caractères cabalistiques de toute nature. Le problème surement de là.
    Comment faire pour vider la variable RestoreName (Array of Char) avant de l'affecter à toto ?

    Merci,

    Daniel

  16. #16
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    Citation Envoyé par secretman
    Merci pour tes tests !
    RestoreName prend bien le contenu de toto comme un Array (chaque caractère est séparé dans la chaine) mais il rempli les autres caractères, au dela de la longueur de toto jusqu'au 64e caractère, avec des caractères cabalistiques de toute nature. Le problème surement de là.
    Comment faire pour vider la variable RestoreName (Array of Char) avant de l'affecter à toto ?

    Merci,

    Daniel
    As tu vraiment besoin d'un tableau statique ?

    si ce n'est pas le cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RestoreName: array of CHAR; {déclaration de tableau dynamique}
     
    SetLength(RestoreName, Length(Toto));
    {met le tableau à même longueur que Toto}




    sinon,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Index := High(RestoreName) downto 0 do {une simple boucle qui érase les caractères un á un. L'expression High renvoie l'index le plus haut du tableau. ne pas utiliser length qui renvoie la taille, c'est à dire high + 1 et qui donnerait une erreur}
      RestoreName[Index] := '';

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut
    Peut-être un FillChar(RestoreName, MAX_DESC, #0); ???
    pour initialiser le tableau RestoreName afin de supprimer les caractères parasites

  18. #18
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    Citation Envoyé par secretman
    Peut-être un FillChar(RestoreName, MAX_DESC, #0); ???
    pour initialiser le tableau RestoreName afin de supprimer les caractères parasites

    oui un fillchar, mais ainsi, je pense.

    FillChar(RestoreName, Length(RestoreName), 0);
    Il vaut mieux mesurer la valeur de RestoreName
    et, comme il demande un byte en valeur et non un caractère.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut
    lorsque je met
    SetLength(RestoreName, Length(Toto));
    j'ai : [Erreur] Unit1.pas(804): Un objet constante ne peut être passé comme paramètre Var

    Alors je met cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var
    RestoreName: array [0..MAX_DESC] of CHAR;
    toto : string;
     
    begin
       // Initialise l'enregistrement
      InfoPointRestauration.dwEventType := BEGIN_SYSTEM_CHANGE;
      InfoPointRestauration.dwRestorePtType := APPLICATION_INSTALL;
      InfoPointRestauration.llSequenceNumber := 0;
     
      toto := InputBox('Point de restauration', 'Entrez un nom', 'Nouveau point de restauration');
     
      For Index := High(RestoreName) downto 0 do
          RestoreName[Index] := #0;
     
      Move(toto[1], RestoreName[0], Length(toto));
      InfoPointRestauration.szDescription := RestoreName;
    et j'ai toujours : [Erreur] Unit1.pas(810): Types incompatibles, sur la dernière ligne
    Je rappel que le code complet est ici :
    http://www.developpez.com/delphi/faq...inrestauration

    Si quelque'un veut bien faire quelques tests (prend 2 minutes avec un copier coller du code)

    Merci

    Daniel

  20. #20
    bjl
    bjl est déconnecté
    Membre chevronné Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Par défaut
    C'est sur InfoPointRestauration.szDescription := RestoreName;
    qu'est l'erreur ?

    Une déclaration de tableau dans un packed record et une déclaration de tableau dans une var ??



    dans ce cas, travaille directement sur InfoPointRestauration.szDescription:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Length(toto) > Length(InfoPointRestauration.szDescription) then SetLength(toto, Length(InfoPointRestauration.szDescription)); {interdit une copie de caractères plus longue que szDescription}
    For Index := High(InfoPointRestauration.szDescription ) downto 0 do
          InfoPointRestauration.szDescription [Index] := ''; 
    Move(toto[1], InfoPointRestauration.szDescription [0], Length(toto));
    RestoreName est il réellement utile ?

    De mon coté pas de résultat de test avant lundi. Ici, demain c'est férié avec pont vendredi.

Discussions similaires

  1. convertir string en char array
    Par cecile38 dans le forum C++
    Réponses: 2
    Dernier message: 22/05/2012, 13h51
  2. Spliter un string en array of char ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 5
    Dernier message: 18/03/2007, 22h11
  3. Copy String to array of char
    Par Ardely dans le forum Delphi
    Réponses: 11
    Dernier message: 11/02/2007, 00h24
  4. Champ String et Constante Array of Char ?
    Par BXDSPORT dans le forum Delphi
    Réponses: 4
    Dernier message: 24/08/2006, 12h35
  5. Convertir String en Char: comment?
    Par nmathon dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2005, 20h58

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