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 :

Aligner les nombres et les décaler à droite c++ builder starter


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut Aligner les nombres et les décaler à droite c++ builder starter
    Bonsoir,

    Comment décaler les nombres vers la droite pour obtenir par exemple ce résultat ?
    142,95
    9847,32
    0,15
    Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {  
     double x = 9992112.78787;
     double z = 14782.258;
    ListBox1->Items->Add(FloatToStrF(x,ffFixed,10,2));   // 2 chiffres après la virgule
    ListBox1->Items->Add(FloatToStrF(z,ffFixed,10,2));
    }
    Dans ce code, les nombres ne sont pas alignés les uns en-dessous des autres et sont à gauche.

  2. #2
    Membre actif
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2016
    Messages : 20
    Par défaut
    J'ai cherché si il y avait une propriété pour TListBox et je n'en ai pas trouvé.
    Si son seul but est l'affichage justifié à droite alors un TMemo fera l'affaire grâce à sa propriété "Alignment".

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut
    Citation Envoyé par Maliono Voir le message
    J'ai cherché si il y avait une propriété pour TListBox et je n'en ai pas trouvé.
    Si son seul but est l'affichage justifié à droite alors un TMemo fera l'affaire grâce à sa propriété "Alignment".

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut aligner des chiffres à droite
    Citation Envoyé par Maliono Voir le message
    J'ai cherché si il y avait une propriété pour TListBox et je n'en ai pas trouvé.
    Si son seul but est l'affichage justifié à droite alors un TMemo fera l'affaire grâce à sa propriété "Alignment".

    Merci Maliono,

    En Delphi Pascal, la fonction Str permet d'aligner les chiffres sur n'importe quel composant . en C++, je ne sais pas si il y a un l'équivalent.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    D'abord vérifier si TCanvas dispose d'une méthode DrawText qui s'appuierait sur le même principe que celle des API WINDOWS !
    Cette fonction aligne le texte dans un RECT (TRect chez toi) aussi bien en horizontal qu'en vertical.

    Si ça n'existe pas, dans ce cas il est nécessaire d'utiliser OnDrawItem donc en fixant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox1->Style = bOwnerDrawFixed;
    Après, il faut coder dans la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
          TRect &Rect, TOwnerDrawState State)
    {
    }
    L'idée est alors de développer un code où l'on va reculer d'une strate : on passe de BCB aux API WINDOWS
    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    // Un TRect WINDOWS qu'il faudra initialiser avec le &Rect (à moins que ce soit compatible...)
    RECT rc; 
    // On récupère le HWND de la ListBox
    HWND hwnd = Control->Handle;
    // on récupère de HDC de HWND
    HDC hdc = GetDC( hwnd );
    // donc on initialise ce qui doit l'être :
    rc.left   =
    rc.top    = 
    rc.right  = 
    rc.bottom =
    // Effacer / coloriser le fond en fonction de la valeur de State
    FillRect(hdc, &rc, couleur_de_fond); // couleur_de_fond est un RGB ou un COLORREF
    // On va écrire en mode transparent pour ne pas altérer la couleur de fond :
    SetBkMode(hdc, TRANSPARENT);
    // En fonction de la couleur du fond... donc en partie en fonction de State ...on fixe la couleur du texte
    SetTextColor(hdc, couleur_du_texte); // couleur_du_texte est un RGB ou un COLORREF
    // On affecte ensuite au hdc la fonte du ListBox en récupérant son HFONT
    SelectObject(hdc, Canvas->Font->Handle);
    //...
    //... normalement yapluka :
    // L'API WINDOWS où Text est la chaîne à afficher çàd un pointeur vers tableau de char
    DrawText(hdc, Text, -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
    // On en a terminé donc on rend le hdc
    ReleaseDC( hdc );
    la valeur DT_RIGHT (aligner à droite) peut aussi être DT_LEFT (aligner à gauche) ou DT_CENTER (centrer entre rc.left et rc.right)
    la valeur DT_VCENTER centre verticalement entre rc.top et rc.bottom.

    Il faudrait tester (je vais essayer de mon coté)!
    Tout dépend de ce que l'on peut faire dans la hiérarchie des procédures graphiques BCB/WINDOWS
    A ce stade, est-ce que BCB va réussir à compiler à la bonne place et donc, au bon moment (en termes d'exécution) le OnDrawItem ?

    A plus !

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut décalage
    Salut,

    Merci pour la réponse.

    J'ai trouvé setw() qui agit sur la largeur (gabarit) qui varie selon la valeur donnée à setw()

    Il faut inclure #include<iomanip> et using namespace std;Cela fonctionne en c++ "classique". Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double ttc, remise;
    cout << setw(20) << "prix ttc = " << setw(12) << ttc << "\n";
    cout << setw(20) << "remise = "  << setw(12) << remise << "\n";
    Par contre, je ne trouve pas comment utiliser setw() avec un composant (listbox ou autre) avec builder.

    A+

Discussions similaires

  1. [VB.NET] Les tableaux et les nombres aléatoires
    Par stracoma dans le forum Débuter
    Réponses: 1
    Dernier message: 24/06/2016, 01h34
  2. les consts ou les nombres
    Par Dr walid dans le forum Débuter
    Réponses: 5
    Dernier message: 05/11/2009, 21h44
  3. Comment lisez-vous les nombres dans les différentes bases ?
    Par SimpleMe dans le forum Assembleur
    Réponses: 1
    Dernier message: 29/08/2007, 10h31
  4. Réponses: 11
    Dernier message: 01/05/2007, 00h15

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