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 :

problème delphi XE !


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut problème delphi XE !
    * Bonjour *

    Mon problème est le suivant :
    le code suivant importe un menu externe qui se trouve dans un fichier dll

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buf:array [0..511] of char;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Plugins[1].GetPluginName(@buf[0]);
    retourne le nom du plugin dans la variable buf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InsertMenu(Menu.Handle, $FFFFFFFF,
                      (MF_BYPOSITION or MF_POPUP or MF_ENABLED),
                      MDPlugins[PluginCount].PluginMenu,PChar(@buf[0]));
    J'utilise cette fonction pour insérer le menu externe dans le menu principal de l'application.
    Avec delphi 2007 pas de problème, mais avec delphi XE le menu s'affiche avec des caractère bizarres.
    Quel est le problème ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    problème AnsiChar / Unicode ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut
    peut être.
    par exemple, le code suivant donne un résultat incorrect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListPluginLog.Items.Insert(0, 'plugin: '+ pchar(@buf[0]));
    alors que le code suivant est correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListPluginLog.Items.Insert(0, 'plugin: '+ pAnsichar(@buf[0]));
    mais le problème avec la fonction Insertmenu est que le compilateur détecte une erreur si on utilise la fonction comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InsertMenuw(Menu.Handle, $FFFFFFFF,
                      (MF_BYPOSITION or MF_POPUP or MF_ENABLED),
                      MDPlugins[PluginCount].PluginMenu,PAnsichar(@buf[0]));

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    Billets dans le blog
    6
    Par défaut
    et en traduisant la chaîne AnsiChar utilisée pour la liste des plugins en chaîne Unicode pour insérer le menu ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Essaye plutot InsertMenuA au lieu de InsertMenuW (A pour Ansi, W pour Wide).
    Sinon, tu peux effectivement caster ta PAnsiChar en PWideChar, la conversion sera faite automatiquement par delphi

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut
    Merci à tous.
    Effectivement l'utilisation de InsertMenuA donne la bonne solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InsertMenuA(Menu.Handle, $FFFFFFFF,
                      (MF_BYPOSITION or MF_POPUP or MF_ENABLED),
                      MDPlugins[PluginCount].PluginMenu,@buf[0]);
    le résultat est correct, mais vraiment un caisse de tête et j'ai été obligé à remplacer toutes les déclaration string par ansistring pour voir l'application s'exécute correctement.

  7. #7
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    en fait tu as 2 approches :
    - soit tu passe tout en PAnsiChar pour rester comme avant (ce que tu as fait)
    - soit tu fais passer ton appli en unicode (plus ou moins automatique avec XE).
    Dans ce cas, vu que tu as une dll qui retourne du PAnsiChar, il faut que tu traite correctement cet appel. Tu peux le faire comme ca (je penses car je n'ai pas XE) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      buf:array [0..511] of AnsiChar;
      wideName: WideString;
    begin
      Plugins[1].GetPluginName(@buf[0]);
      ...
      WideName := PAnsiChar(buf); //conversion implicite en widestring
      InsertMenu(Menu.Handle, $FFFFFFFF,
                      (MF_BYPOSITION or MF_POPUP or MF_ENABLED),
                      MDPlugins[PluginCount].PluginMenu,PWideChar(WideName));
    (n'oublie pas de changer la declaration de ta fonction GetPluginName pour qu'elle prenne un PAnsiChar en parametre)

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

Discussions similaires

  1. Problème Delphi "Nom de session manquant"
    Par QAYS dans le forum Bases de données
    Réponses: 0
    Dernier message: 08/10/2007, 23h05
  2. Problème Delphi 5(oracledataset) avec oracle 10g
    Par FABFAB125 dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2007, 08h59
  3. Problème Delphi suite à un patch Oracle
    Par bouyao dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/08/2006, 11h42
  4. Sql..Probléme..Delphi
    Par cmoimeme dans le forum Bases de données
    Réponses: 8
    Dernier message: 20/12/2005, 07h24

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