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

Composants VCL Delphi Discussion :

Texte vertical dans les header d'un DBGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut Texte vertical dans les header d'un DBGrid
    Bonjour tout le monde,

    J'utilise le composant XDBGrid afin d'afficher le contenu de tables de ma base de données.

    J'aimerais pouvoir afficher le texte des en-têtes de colonnes en vertical (Rotation du texte de 90 degrés).

    J'ai déjà fait quelques recherches et j'approche du but. D'après ce lien :
    http://www.swissdelphicenter.ch/torr...de.php?id=1596

    J'ai réussi à afficher le texte de la manière que je désire. voici mon code (Qui se trouve dans l'évènement FormShow). J'ai dû un peu modifier cet exemple car il était prévu pour une grille normale alors que je voudrais le faire pour une DBGrid.

    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
    27
     
         //...
    Var
       I : Integer;
       tf : TFont;
       lf: TLogFont;
     
    //...
     
         For I:=0 To DBGrid1.Columns.Count-1 Do
         Begin
              DBGrid1.Columns.Items[I].Title.Caption:='Designation Test '+IntToStr(I);
              If I > 0 Then
              Begin
                   tf:=TFont.Create;
                   Try
                         tf.Assign(DBGrid1.Columns.Items[I].Title.Font);
                         GetObject(tf.Handle, SizeOf(lf), @lf);
                         lf.lfEscapement:=900;
                         lf.lfOrientation:=0;
                         tf.Handle := CreateFontIndirect(lf);
                         DBGrid1.Columns.Items[I].Title.Font.Assign(tf);
                   Finally
                           tf.Free;
                   End;
              End;
         End;
    Le texte est bien tourné comme je le souhaite. (Voir pièce jointe "AvantWidth.png") Nom : AvantWidth.png
Affichages : 439
Taille : 65,7 Ko

    Le problème, c'est que dès que je réduis la largeur de mes colonne (à 30 par exemple). le texte ne n'apparaît plus en entier. En fait il apparaît uniquement la partie qui serait visible sur la largeur spécifiée. (voir la pièce jointe "ApresWidth.png") Nom : ApresWidth.png
Affichages : 404
Taille : 65,7 Ko

    Comment est-ce que je peux réduire la taille de mes colonnes sans réduire l'affichage du texte?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    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 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Le problème, c'est qu'il le DBGrid ou XDBGrid ne doit pas penser que l'on a modifié l'orientation du texte, il utilise la largeur de la colonne
    Tu devrais une fois avoir affecter la font à Title, utiliser Canvas.DrawText pour écrire manuellement les entêtes et éviter l'ellipse automatique !

    Ne fais pas cela dans le OnShow de la Form, mais dans OnDrawColumnCell
    le paramètre Column te permettra de savoir quelle colonne doit être dessiner, faut les faire une par une et non toutes dans une boucle
    le paramètre State doit contenir gdFixed pour la ligne d'entête, sinon c'est que c'est la zone de donnée
    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 régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut
    Salut ShailLeTroll, merci de ta réponse. ça m'a bien aidé. J'ai résolu une partie de mon problème.

    En mettant le propriété "Ellipsis" du font du header de la grille à False, le problème est résolu.

    Par contre, j'ai essayé de déplacer mon code dans le OnDrawCell comme tu le suggère :

    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
     
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TXColumn; State: TGridDrawState);
     
    Var
       tf : TFont;
       lf: TLogFont;
     
    begin
         If (gdFixed In State) Then
         If DataCol > 0 Then
         Begin
              tf:=TFont.Create;
              Try
                    tf.Assign(Column.Title.Font);
                    GetObject(tf.Handle, SizeOf(lf), @lf);
                    lf.lfCharSet := DEFAULT_CHARSET;
                    lf.lfEscapement:=900;
                    lf.lfOrientation:=0;
                    tf.Handle := CreateFontIndirect(lf);
                    Column.Title.Font.Assign(tf);
              Finally
                      tf.Free;
              End;
         End;
    end;
    Et le soucis est que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (gdFixed In State) Then
    n'est jamais vrai donc mon code ne s'execute pas. est-ce possible que les header d'un XDBGrid ne soient pas gérés par le DrawColumnCell? c'est un peu bizzare

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    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 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Fait le test avec un DBGrid normal mais il y a un risque que ce XDBGrid soit différent !
    C'est toujours le problème des libs externes, la philosophie des composants Delphi par défaut n'est pas toujours très clair ou connue, donc souvent des composants tiers ne font correctement les traitements standards mais en apportent d'autres !

    En mettant le propriété "Ellipsis" du font du header de la grille à False, le problème est résolu.
    Tu vois là par exemple, moi Ellipsis, je n'ai pas cette propriété, c'est un booléen ?
    Je connais ButtonStyle à cbsEllipsis, très utile pour appeler une sous-fenêtre depuis un champ, je l'ai utilisé pour créer utiliser une TCheckListBox et ainsi avoir un système de sélection multiple comme avec les grilles TMS
    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

  5. #5
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut
    Re,

    J'ai fais le test avec un DBGrid et j'ai le même problème, le state n'est jamais à gdFixed. Pour l'instant, je vais laisser tout ça dans mon formshow qui semble fonctionner.

    Concernant la propriété Ellipsis oui c'est un boolean. bien pratique dans mon cas, ça m'a permis de résoudre mon problème assez facilement.

    En tout cas merci beaucoup de ton aide qui a été une fois de plus très précieuse.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 25/06/2020, 20h21
  2. Texte vertical dans un état Access
    Par mariannesq dans le forum IHM
    Réponses: 3
    Dernier message: 15/01/2007, 17h20
  3. [wxwidgets] erreur dans les header de wxwidgets
    Par dreamkiller dans le forum wxWidgets
    Réponses: 5
    Dernier message: 01/10/2006, 19h14
  4. Texte vertical dans un TCanvas
    Par FredericB dans le forum C++Builder
    Réponses: 6
    Dernier message: 22/05/2006, 18h13
  5. Pas de callback dans les headers en .c
    Par matcocopunch dans le forum OpenGL
    Réponses: 6
    Dernier message: 12/02/2006, 17h46

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