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 :

ColWidth d'un TStringGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut ColWidth d'un TStringGrid
    Bonsoir,

    J'ai un problème avec une fonction de redimensionnement de colonne.

    J'ai fait une petite fonction pour faire le travail (qui fonctionne très bien d'ailleurs) :
    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
     
    procedure AutoSizeCol(Col: integer);
    var
      Width : integer;
      Max   : integer;
      i     : integer;
    begin
      Max := 0;
     
      for i := 0 to fStringGrid.RowCount - 1 do
       begin
         Width := fStringGrid.Canvas.TextWidth(fStringGrid.Cells[Col,i]);
     
         if Width > Max then
          begin
            Max := Width;
          end;
       end;
     
      fStringGrid.ColWidths[Col] := Max + 15;
    end;
    Donc cette procedure redimensionne automatiquement la colonne passé en paramètre ...

    Le problème est que lors de l'appelle de celle-ci au FormShow ou FormCreate et lors d'un appel à l'aide d'un bouton, les valeurs sont différentes.

    Par exemple : OnShow : Max + 15 = 106; OnButton1Click : Max + 15 = 116;

    Comment est-ce possible?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Plein de raisons :
    FormShow ou FormCreate sont des évènements appelés avant le premier OnDrawCell/OnSelectCell de ta grille, or ces autres évènements peuvent modifier le contenu de la grille, ou le style de la police (et du coup le textwidth), alors que ton OnButtonClick sera appelé après.

    Regarde plus en détail dans quel ordre tu initialises le contenu de ta StringGrid.
    *LeGEC*

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    J'ai cité FormCreate comme exemple mais j'avoue que ce n'était pas réfléchis ...

    Pour le FormShow, je ne touche pas au StringGrid par la suite donc, il ne devrait pas y avoir de problème. (Du moins, pas par ma faute).

    Sinon, comment pourrais-je contourner le problème? (De façon propre)

    Merci de votre réponse.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Ta procedure AutoSizeCol doit être appelée depuis l'événement OnResize de la fiche.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Pour ce qui est de l'évènement OnResize, après test, aucun changement.
    J'ai encore une largeur différente une fois la fenêtre affiché vs le button.
    De plus, l'évènement OnResize se déclenche 4 fois à la création de la fiche...

    Si vous avez d'autres idées, je suis preneur.

    Merci à vous Andnotor et LeGEC

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par pepi22 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         Width := fStringGrid.Canvas.TextWidth(fStringGrid.Cells[Col,i]);
    Cette ligne de code te renvoie la taille du texte avec la configuration en cours du Canvas. En particulier, si Delphi exécute ce code avant d'affecter la propriété Font de ton fStringGrid, la taille ne sera pas la même.

    Si tu as des lignes qui ont des styles différents - par exemple une ligne de titre en [fsBold] et les autres lignes en [] - les valeurs du Canvas au moment où tu appelles ta fonction AutoWidth ne s'adapteront pas aux différents styles.

    Tu as vérifié, en mettant un point d'arrêt ici, si le fStringGrid et le fStringGrid.Canvas avaient bien les propriétés que tu voulais au moment où tu calcules ta largeur?

    A priori, le contenu du dfm (donc en particulier la valeur fStringGrid.Font) est assigné avant l'appel à ton FormShow. Par contre, je ne sais pas comment est établi le lien entre "fStringGrid.Font" et "fStringGrid.Canvas.Font" ...

    Je te suggèrerais d'utiliser un Canvas local pour être sûr qu'il corresponde à ce que tu veux :
    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
     
      lCanvas := TCanvas.Create;
      lCanvas.Font := laFontQueJeVeuxUtiliser; //y compris Taille, Style...
     
      Max := 0;
     
      for i := 0 to fStringGrid.RowCount - 1 do
      begin
        lCanvas.Font.Style := modifDeStylePropreACetteLigne;
        Width := lCanvas.TextWidth(fStringGrid.Cells[Col,i]);
     
        if Width > Max then
         begin
           Max := Width;
         end;
      end;
     
      lCanvas.Destroy;
    *LeGEC*

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Merci pour cette très brillante idée ...

    Je test aussitôt arrivé chez moi

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Finalement tout fonctionne ...

    La différence venait du TFont de fStringGrid ...

    Donc j'ai seulement ajouté les deux lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fStringGrid.Canvas.Font.Name='NomDeLaFont';
    fStringGrid.Canvas.Font.Size=9;
    Merci LeGEC pour vos précieux conseils

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    De rien
    *LeGEC*

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

Discussions similaires

  1. TStringGrid et édition
    Par nomdutilisateur dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/04/2004, 14h22
  2. comment gerer une TStringGrid
    Par madison59 dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/03/2004, 15h03
  3. Delete dans la propriété Rows d'un TStringGrid ???
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/02/2004, 23h55
  4. Delphi 7 et les TStringGrid
    Par Claude HENRY dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/05/2003, 09h18
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

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