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

C++Builder Discussion :

Migration C++ Builder 6 vers C++ Builder 2009


Sujet :

C++Builder

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut Migration C++ Builder 6 vers C++ Builder 2009
    Bonjour

    je migre un grosse application (322 sources 700.000 lignes sans les Packages) de C++Builder 6 vers 2010. Après avoir corrigé diverses erreurs de comptabilité qui bloquait la compilation j'exécute le code et comme un bogue survient je pose un trap dans le code sur un instruction innocente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString s = Edit1->Text
    ou Edit1 est un TEdit

    Je m'aperçois que s est vide tandis que Edit1->Text ne l'est pas. Je consulte (en debug) Edit1->Text et j'obtiens le message

    E2451 Symbole '_fastcall Controls::TControl::GetText()' non défini
    Étonné je crée un nouveau projet dans lequel je fais la manipe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString s=Edit1->Text;
    Button1->Caption=s;
    Je constate cette fois que Edit1->Text est bien lisible mais chose étrange, bien que la valeur de Edit1->Text soit transférée dans Button1->Caption, "s" est vide ! J'essaie s.Length() et là j'obtiens

    E2451 Symbole '_fastcall System::AnsiStringBase::Length()' non défini
    J'en déduis que mon projet a été converti avec des options qui agissent sur les types de chaines mais je n'ai pas trouvé d'explication claire dans la doc en ligne.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu devrais avoir un warning sur cette ligne AnsiString s = Edit1->Text; comme conversion implicite avec perte : W1058: Transtypage de chaîne implicite avec perte de données potentielle de '%s' en '%s' (Delphi)

    En fait cette ligne est équivalente à AnsiString s = AnsiString(Edit1->Text);.
    Cela appelle implicitement le constructeur AnsiString(UnicodeString),
    car l'opérateur = n'existe que si la forme AnsiString operator =(AnsiString).

    N'utilise pas le débogueur pour cela, cela ne fonctionnait déjà pas avant !
    Fait des ShowMessage ou OutputDebugString pour afficher tes tests !

    Ensuite, si tu as migré le projet, par défaut il mélange ANSI pour les API Windows et UnicodeString pour la VCL
    Si tu as recréé un projet, il est passer totalement en Unicode : Mappage _TCHAR

    Cela fait au moins 3 ans que l'on répète inlassablement l'enjeu et l'éventuelle complexité de la migration : Comment passer en douceur de D5 à XE2 ?

    Il y a toute une histoire de CodePage en fait ta chaine AnsiString contient une copie la valeur brute de l'UnicodeString avec le CodePage 65001 (sous Windows) converti par LStrFromUStr et si l'on remonte la chaine d'appel et de directive on abouti à WideCharToMultiByte

    Possible que le déboggueur soit perdu, ça lui arrive souvent !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Merci

    Au vu de toutes ces infos utiles j'ai investigué plus avant et j'ai constaté que :

    Un projet migré (par ouverture du projet C++6) est automatiquement opté
    "Mappage de _TCHar en : char"
    Un projet créé de toute pièce : c'est pareil.

    Je précise qu'il s'agit du C++ 2009 du RAD Studio 2009, peut être différent de XE2.

    Mais ce que je n'avais pas vu c'est que le débogueur est désormais plus subtil et offre plusieurs niveaux de détails comme suit :



    J'avais en fait mal localisé mon problème qui se situe au niveau d'un TDataset->Open() qui produit une division par zéro. Mais comme je pensais que la chaine SelectSQL était mal construite cela avait égaré mes recherches. Je vous tiens au courant.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    La suite du problème est déplacé ici

    http://www.developpez.net/forums/d12...bdataset-open/

Discussions similaires

  1. [IDE] Migration d'un projet vers C++ Builder XE6
    Par Irisael dans le forum C++Builder
    Réponses: 1
    Dernier message: 01/09/2014, 15h17
  2. Migration C++ Builder 6 versus C++ Builder 2009 & AnsiString
    Par frantzgac dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/08/2012, 11h10
  3. Réponses: 2
    Dernier message: 30/07/2009, 08h14
  4. Transformer un code vers C++ Builder
    Par matnes dans le forum MATLAB
    Réponses: 2
    Dernier message: 24/01/2008, 13h30
  5. Convertir un programme Visual c++ vers C++ builder
    Par Skarlix dans le forum C++Builder
    Réponses: 11
    Dernier message: 16/10/2004, 22h51

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