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 :

Convertion AnsiString en TString


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Convertion AnsiString en TString
    Bonjour à tous,

    Pour sauvegarder la configuration d'un TComPort (Objet de CPortLib), j'ecrit les parametres dans un registre.
    Jusqu'a lors pas de PB.
    Mais pour rappeller la derniere configue par la lecture du registre, alors là...

    La propriété Port du TComPort : Form1->ComPort->Port , reclame un TString, alors que la valeur sortante de mon registre est un AnsiString.
    D'où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Form1->CPort1->Port=(reg->ReadString("PortRx"));
     
    donne l'erreur:
     
    [Lieur Erreur] Unresolved external '__fastcall Cport::TCustomComPort::SetPortA(const System::AnsiString)' referenced from E:\TSAII 2005\MARC\PROJET RS232\ANALYSEUR_RS232.OBJ
    Et la c'est hors connaissance pour moi...

    Could you help me, please

  2. #2
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Je ne connais pas TComPort et n'ai pas d'aide dessus...

    mais en ce qui concerne le parametre voulu : un TString au lieu d'un String ,
    peut être qu'en faisant :

    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TStringList * lst = new TStringList();
    lst->Add(reg->ReadString("PortRx"));
    Form1->CPort1->Port=lst;
    ....ça peut passer si effectivement la propriété Port est un TString...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci de ton aide DJob, mais ça ne marche pas mieux...
    Cette fois je retrouve le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [C++ Erreur] Analyseur_RS232.cpp(652): E2034 Impossible de convertir 'TStringList *' en 'AnsiString'
    C'est un problème de transtypage...et la touche F1 n'est plus suffisante!

    Merci à toute l'aide venue,

  4. #4
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Je viens de regarder l'aide de TComPort et la méthode Port réclame un String en Delphi.
    Or le String Delphi égale un AnsiString en C++Builder. Je pense donc que ton erreur vient d'ailleurs...
    + + +

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Pour faire au plus simple, j'ai creer une nouvelle appli avec 1 bouton et un ComPort.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
          AnsiString Port="COM1";
          Form1->ComPort1->Port=Port;
     
    }
    Et j'ai toujours le même message...que je ne comprend pas!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Lieur Erreur] Unresolved external '__fastcall Cport::TCustomComPort::SetPortA(const System::AnsiString)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\ESSAI_RS232CBOX.OBJ

  6. #6
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Tu es sûr de bien avoir installé le composant TComPort???
    cf ce tutorial.

    Si ce n'est pas ça, je ne pourrais pas beaucoup plus t'aider...
    + + +

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    bonjour bakaneko

    La librairie est installée via le tutorial que tu me propose. Je pense donc qu' elle est bien installée. Je l'ai d'ailleurs installé sur mes deux PC, et c'est le même resultat. A n'y rien comprendre!

    Je ne ferme pas ce post pour le moment, si quelqu'un pouvait ecrire le code ci-dessus sur son PC et me rapporter ce qu'il en resulte...

    Merci à tous,

  8. #8
    Membre confirmé

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Il y a bien un bogue sur l'écriture directe du N° de Port (la méthode est inaccessible).

    Moi je passe par le SetupDialog() et sauvegarde dans fichier Ini, existe de la même façon pour enregistrer/lire dans registre.

    c'est du global mais cela fonctionne.

    Donc la lecture du N° est accessible mais pas l'écriture

  9. #9
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonsoir,
    quelle version du Composant utilise tu
    dans la version 2.64 la méthode d'écriture du Port s'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall _SetPort(const AnsiString Value);

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  10. #10
    Membre confirmé

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    C'est bien ça, la méthode est bien définie, mais n'est pas accessible.
    et c'est bien la 2.64

    dans Cport.hpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Private:
    ....
    void __fastcall SetPort(const AnsiString Value);
    ....
    Public:
    ....
    __property AnsiString Port = {read=FPort, write=SetPort};
    ...
    Mais :
    • [C++ Erreur] Test1.cpp(27): E2247 '_fastcall TCustomComPort::SetPortA(const AnsiString)' n'est pas accessible

  11. #11
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    +1

    version 2.64 fraichement telechargée

    [Lieur Erreur] Unresolved external '__fastcall Cport::TCustomComPort::SetPortA(const System::AnsiString)' referenced from .....
    j'ai suivi le tutorial pourtant...

    sinon:
    SetPortA defini ANSI
    SetPortW defini UNICODE ...je crois ?

    NB :J'ai installé des composants unicodes (TNT) aussi , je sais pas si ça a un rapport...

    du coup ça m'a un peu enervé...
    j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SetPortA SetPort
    avant les includes de comport... ( c'est un peu brutal je sais.... )
    mais ça à l'air de compiler

    mais j'ai toujours pas compris pourquoi on a une distinction automatique entre ansi et unicode ....


    NB : Apparemment y'a une version 3.0 en telechargement , peut être qu'il n'y a plus ce probleme ....

  12. #12
    Membre confirmé

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    J'avais pas pensé à ça.

    Cela compile et ça marche...

  13. #13
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Je pense avoir compris d'ou vient cette fichue erreur :


    TComport utilise Windows.h qui inclu automatiquement Winspool.h
    dans lequel il y a les fonctions SetPortA et SetPortW :
    suivi d'un joli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifdef UNICODE
    #define SetPort  SetPortW
    #else
    #define SetPort  SetPortA
    Or TComport utilise aussi une fonction SetPort privée en interne...
    d'ou confusion pour BCB....
    Si la fonction s'appelait SetPortCom ou autre y'aurait pas eu ce probleme ..


    NB : on peut mettre aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SetPortA SetPort
    dans le CPort.hpp ( pour eviter de le mettre à chaque fois dans l'application )

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Hello!

    Je suis ravi d'avoir soulevé votre intérêt, mais là vous discutez à un niveau un peu haut pour moi.
    Alors, que dois-je faire pour que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->ComPort1->Port=AnsiString  ... fonctionne
    Merci à vous

  15. #15
    Membre confirmé

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    En résumer de Djob:

    ouvrir le fichier CPort.hpp, intoduire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     #define SetPortA SetPort
    juste avant les includes comme ça:

    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
     
    // Borland C++ Builder
    // Copyright (c) 1995, 2002 by Borland Software Corporation
    // All rights reserved
     
    // (DO NOT EDIT: machine generated header) 'CPort.pas' rev: 6.00
     
    #ifndef CPortHPP
    #define CPortHPP
     
    #pragma delphiheader begin
    #pragma option push -w-
    #pragma option push -Vx
    #define SetPortA SetPort     // Modif Fernand le 19/12/05 pour choix com
    #include <Registry.hpp>	// Pascal unit
    .......

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci à tous pour votre riche participition..

    Ce forum est un véritable outils de travail, encore merci

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Bien que ce poste commence un peu à dater, il m'a permi de résoudre mon problème!!
    Je n'utilise pas CPort.h mais je cherchais juste à pouvoir appeller une fonction de l'API Win32 pour ouvrir un répertoire.

    Ayant un problème avec shlobj.h en rajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     #define SetPortA SetPort
    au tout début de mon header de l'appli principale, ca à compilé tout de suite!

    Et dire que je m'embetais à effacer sans arrêt mes *.obj après une compil pour en refaire une...

  18. #18
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Pour ceux qui ont ce problème avec C++Builder 2010, vous pouvez le faire d'une façon plus général comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef UNICODE
    #define SetPortW SetPort
    #else
    #define SetPortA SetPort
    #endif // !UNICODE
    Il se peut aussi que cette ligne doive être supprimée à cause d'un problème de déclaration multiple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	__fastcall EComPort(int ACode);
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

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

Discussions similaires

  1. Convertion d'un Tableau AnsiString en double
    Par darkman13130 dans le forum C++Builder
    Réponses: 12
    Dernier message: 27/01/2009, 21h43
  2. Convertir AnsiString en TStrings
    Par El-Diablo- dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/03/2008, 14h50
  3. Cannot convert Ansistring to char*
    Par kaizer dans le forum C++Builder
    Réponses: 8
    Dernier message: 20/10/2006, 00h55
  4. TString en AnsiString
    Par chamamo dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/06/2006, 18h35
  5. Convertion de AnsiString en Binaire
    Par jean tof dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/03/2004, 23h58

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