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

Delphi Discussion :

ajuster automatiquement la largeur d'une colonne dans une DBGrid


Sujet :

Delphi

  1. #21
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    +1 Je rejoins EricBoisVert, et Andry.

    Peut etre sur le OnChange des Fields, plutot que sur le OnGetText.
    Mais c'est un détail...

    Plus l'utilisateur va naviguer dans la BD, plus la valeur de la longueur max. de la colonne va être précise.

    Ca peut être un bon compromis.

  2. #22
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    c'est très prometteur tout ça..
    mais juste un détail..
    sur quels champs tu vas faire ton OnGetText??
    Comment accèder à cet évènement alors que mes champs ne sont pas encore crées??

  3. #23
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par freestyler
    sur quels champs tu vas faire ton OnGetText??
    Comment accèder à cet évènement alors que mes champs ne sont pas encore crées??
    Tu peux associer dynamiquement la routine OnGetText...et pourquoi pas sur tout les champs?

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    //=====================================================================
    //=== Fonction de Resize column Selectionnee
    procedure ResizeColumn(Grid: TDbGrid);
    var
        DS:TDataSet;
    begin
        DS:=Grid.DataSource.DataSet;
        with Grid do
        begin
            Columns[SelectedIndex].Width:=DS.FieldByName(SelectedField.FieldName).Tag;
        end;
    end;
    //=====================================================================
    //=== Fonction de Resize de Toutes Les colones
    procedure ResizeAllColumns(Grid: TDbGrid);
    var
        DS:TDataSet;
        i:integer;
    begin
        DS:=Grid.DataSource.DataSet;
        for i:=0 to DS.FieldCount-1 do
        begin
            with Grid do
            begin
                Columns[i].Width:=DS.FieldList.Fields[i].Tag;
            end;
        end;
    end;
     
    //=====================================================================
    //== Fonction GenericOnGetText
    procedure TForm1.GenericOnGetText(Sender: TField; var Text: String;
      DisplayText: Boolean);
    begin
        Text:=Sender.AsString ;
        //Memorise rapidement le text le plus large affiché dans la colonne
        Sender.Tag:=Max(Sender.tag,DBGrid1.Canvas.TextWidth(Text)+5);
    end;
     
     
    //=====================================================================
    //== Fonction AfterOpen (d'une table ou d'un query)
    procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
    var
        i:integer;
    begin
        for i:=0 to DataSet.FieldCount-1 do
        begin
            with DataSet.FieldList.Fields[i] do
            begin
                //Met deja le .tag à la largeur du titre
                Tag:=DBGrid1.Canvas.TextWidth(DisplayName)+5;
                //Associe OnGetText Generique au champs
                OnGetText:=GenericOnGetText;
            end;
        end;
    end;
    En plus, maintenant on prend aussi en considération le titre des champs....
    En fait, là... c'est presque Plug and Play!

  4. #24
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par freestyler
    mais comment font ils sous EXCEL?? ou sous Access?? ou sur n'importe quelle application qui gère l'affichage de tableaux??

    un double-clic sur la bordure et la colonne se redimensionne par rapport au champ le plus large...

    Bonjour !

    Comment font-ils ? Sans pretention, j'ai peut etre une idee : ils doivent stocker la longueur maxi de chaque champ quelque part lors des INSERT ! Et ils se referent a ca pour redimensionner instantanement les colonnes.

  5. #25
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Est ce que quelquechose a été essayé dans le OnDrawColumnCell ?
    On pourrait peut être tenter qqchose comme :
    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
     
    procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
    //
    DBGrid1.DoubleBuffered := true;
      if DataCol = 0 then
      begin
        //
        twidth := DBGrid1.Canvas.TextWidth(DBGrid1.Fields[DataCol].AsString );
        if twidth > taille then
        begin
          taille := twidth + 5;
        end;
        //
      end;
    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    if DBGrid1.DataSource.DataSet.RecNo = Query1.RecordCount then
    begin
      DBGrid1.Columns.Items[0].Width := taille;
    end;
     
    //
    end;
    ou 'taille' et 'twidth' sont des integer déclarées dans 'var' ...
    (et DefaultDrawing a false).

    En espérant t'aider,
    @ +


    //EDIT : dans ce cas, je teste pour une colonne bien sur ...

  6. #26
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Eric t'es génial.. Merci bp..

    j'ai réussi à adapter ton code et ça fonctionne Nickel..

    Je le conseille vivement.. c très rapide..
    on peut même récupérer la somme des tailles de toutes les colonnes pour que la taille du form qui contient la Grid soit idéale!

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Tant mieux que tu ai trouvé
    Mais en vous lisant je me demande si faire une pré requete ne serai pas plus rapide ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(champ1), max(champ2) etc... from TABLE
    et le tour serai jouer en travaillant sur la taille de cette requete.
    Bon par contre c'est une requete pas simple en plus sur le serveur alors que l'on peut l'éviter. Mais c'est une simle sugestion.

  8. #28
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    J'ai des doutes avec un champs texte...

    Si le champs Prenom de la table Employes contient ces 3 enregistrements:
    'LePlusLongPrenomAuxMonde'
    'Yvon'
    'Eric'

    la requete:
    select max(Prenom) from Employes

    retourne 'Yvon'

    ce n'est pas exactement l'effet désiré...

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Oui effectivement, j'avais zappé ça.

    Dans ce cas il faut peut jouer sur le length, mais donc faire des sous requete. C'est effectivement pas le plus simple et galère à écrire.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 11h52
  2. Réponses: 4
    Dernier message: 05/05/2008, 16h16
  3. Récupérer le nom d'une colonne d'une table dans une variable
    Par mimi51340 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/03/2008, 15h23
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48
  5. Postionnement dans une colonne dans un DBGrid
    Par Jeankiki dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/01/2005, 01h05

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