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 :

Transformation en unicode


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Dev informatique retraité
    Inscrit en
    Août 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev informatique retraité
    Secteur : Santé

    Informations forums :
    Inscription : Août 2005
    Messages : 221
    Points : 171
    Points
    171
    Par défaut Transformation en unicode
    Bonjour,

    Je suis passé de Delphi 2007 à Rad Studio XE2 et j'essaye de migrer mes Programmes et je me trouve confronté au Pb d'unicode
    J'en ai résolu pas mal nmais il me reste celui lié à une procédure de copie qui marchait super bien et j'aimerai bien la réutiliser
    Voici 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
    17
    //*****************************************
    procedure copier(Handle:HWND;Source,Cible:String);
     var
      lpFileOp : TSHFileOpStructA;
      TabFrom:array[0..16383] of char;
      i:integer;
     begin
      For i:=0 to length(Source)-1 do TabFrom[i]:=Source[i+1];
      {-----préparation du paramètre lpFileOp -----}
      lpFileOp.Wnd:=handle;
      lpFileOp.wFunc:=FO_COPY;
      lpFileOp.pFrom:=TabFrom;       // On aurait aussi put ecrire pFrom := @Chaine[1]
      lpFileOp.pTo:=PAnsiChar(Cible);
      lpFileOp.fFlags:=FOF_ALLOWUNDO;  // Possibilité d'annuler la copie
      { fin de la préparation du paramètre lpFileOp}
      SHFileOperation(lpFileOp);// procède à la copie
     end;
    Voici les messages d'erreur que j'ai :
    [DCC Erreur] Utilitaires.pas(43): E2010 Types incompatibles : 'PAnsiChar' et 'array[0..16383] of Char'
    [DCC Avertissement] Utilitaires.pas(44): W1044 Transtypage de string en PAnsiChar suspect
    [DCC Erreur] Utilitaires.pas(47): E2010 Types incompatibles : '_SHFILEOPSTRUCTW' et '_SHFILEOPSTRUCTA'

    Avez vous une idée pour résoudre cela

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    alors, il faut savoir que l'API Windows est pour parti déclinée en deux versions A = Ansi, W = Wide, dans Delphi < 2009 les fonctions sont par défaut Ansi, depuis 2009 elles sont par défaut Wide (Unicode).

    Ansi, la fonction SHFileOperation n'existe pas, il existe SHFileOperationA et SHFileOperationW, SHFileOperation est un alias vers l'une ou l'autre en fonction de la version de Delphi.

    la même règle s'applique aux structures TSHFileOpStructA c'est de l'Ansi à utiliser avec SHFileOperationA, dans ton cas tu dois utiliser TSHFileOpStructW qui travaille en Unicode...ou TSHFileOpStruct qui sera Unicode avec D2009+ et Ansi avant.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Ce qui m'étonne, c'est que pFrom et pTo sont des tableaux de chaine (tableaux de char)
    à la base il manquait un zéro terminal pour le tableau en plus de celui de fin de chaine ! non ?

    Il existe CopyFile si c'est juste la copie d'un seul fichier !

    Et en plus c'est dans la : Comment copier un fichier ?


    Code valable aussi bien en 2007 qu'en XE2, il suffit d'utiliser le type PChar et String mappé en Ansi ou Unicode selon la version !

    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
    //*****************************************
    procedure copier(Handle:HWND; const Source, Cible:String);
    var
      lpFileOp : TSHFileOpStruct;
      i:integer;
    begin
      {-----préparation du paramètre lpFileOp -----}
      lpFileOp.Wnd:=handle;
      lpFileOp.wFunc:=FO_COPY;
      lpFileOp.pFrom:= PChar(Source + #0);   
      lpFileOp.pTo:= PChar(Cible + #0);
      lpFileOp.fFlags:=FOF_ALLOWUNDO;  // Possibilité d'annuler la copie
      { fin de la préparation du paramètre lpFileOp}
      SHFileOperation(lpFileOp);// procède à la copie
     end;

  4. #4
    Membre habitué
    Homme Profil pro
    Dev informatique retraité
    Inscrit en
    Août 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev informatique retraité
    Secteur : Santé

    Informations forums :
    Inscription : Août 2005
    Messages : 221
    Points : 171
    Points
    171
    Par défaut
    merci pour vos réponses

    Bien sur c'est pour copier plusieurs fichiers, en effet je connais CopyFile de la FAQ
    Effectivement je n'avais pas utilisé le #0 et cela marchait sans Pb !
    Néanmoins je vais le rajouter comme vu dans ton code

    J'essaye vos propositions et vous tiens au courant de l'évolution

  5. #5
    Membre habitué
    Homme Profil pro
    Dev informatique retraité
    Inscrit en
    Août 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev informatique retraité
    Secteur : Santé

    Informations forums :
    Inscription : Août 2005
    Messages : 221
    Points : 171
    Points
    171
    Par défaut
    Bon Super en faisant un mix des deux réponses j'ai ma solution et cela marche
    Il faudra que je me fasse à l'unicode si j'ai d'autres transformations à faire
    Merci à tous les deux

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Ce qui m'étonne, c'est que pFrom et pTo sont des tableaux de chaine (tableaux de char)
    à la base il manquait un zéro terminal pour le tableau en plus de celui de fin de chaine ! non ?
    ben non les String Delphi possèdent déjà un #0 terminal, c'est automatique

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    @Paul
    Tu n'as pas compris ma remarque !
    Je ne parle pas du Zéro Terminal de chaine mais du Zéro Terminal de Tableau de chaine !

    Citation Envoyé par msdn
    pFrom

    Type: PCZZTSTR

    Note This string must be double-null terminated.

    A pointer to one or more source file names. These names should be fully qualified paths to prevent unexpected results.

    Standard MS-DOS wildcard characters, such as "*", are permitted only in the file-name position. Using a wildcard character elsewhere in the string will lead to unpredictable results.

    Although this member is declared as a single null-terminated string, it is actually a buffer that can hold multiple null-delimited file names. Each file name is terminated by a single NULL character. The last file name is terminated with a double NULL character ("\0\0") to indicate the end of the buffer.

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    @Paul
    Tu n'as pas compris ma remarque !
    Je ne parle pas du Zéro Terminal de chaine mais du Zéro Terminal de Tableau de chaine !
    au temps pour moi, j'étais aussi très surpris de ta remarque qui est en fait juste évidemment

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

Discussions similaires

  1. Transformer une variable en chaine UNICODE
    Par 1rageux dans le forum Windows
    Réponses: 5
    Dernier message: 04/08/2008, 15h54
  2. classe pour transformer en unicode ?
    Par lex13 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 27/08/2007, 10h35
  3. Transformer une String en Unicode
    Par annemarie dans le forum Delphi
    Réponses: 3
    Dernier message: 28/02/2007, 17h43
  4. Réponses: 7
    Dernier message: 06/11/2006, 20h43
  5. Transformer de l'Unicode en ASCII
    Par kow_Ced dans le forum Langage
    Réponses: 4
    Dernier message: 28/10/2005, 08h53

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