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 FMX Delphi Discussion :

Customiser une Grille (encore)


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut Customiser une Grille (encore)
    Bonjour,

    La discussion initiée par Selzig m'ayant fourni matières à réflexion je me suis lancé sur plusieurs pistes voir ce billet dans mon blog pour vous allécher une petite image.
    (ce n'est encore qu'une ébauche d'où les icônes utilisées mais montre que c'est possible)
    Nom : Capture.PNG
Affichages : 493
Taille : 26,1 Ko

    Reste bien sûr encore pas mal de points en suspend comme :
    Est-il possible de changer un type de colonne à l'exécution ?
    Comment modifier le style d'un ItemHeader toujours à l'exécution pour ne pas modifier le ItemHeaderStyle principal ?
    , etc.
    N'hésitez pas à me fournir des pistes ou mieux des solutions soit dans ce fil soit via le blog

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Comment modifier le style d'un ItemHeader toujours à l'exécution pour ne pas modifier le ItemHeaderStyle principal ?
    Hé bien ce point là est résolu
    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
     
    procedure TForm41.Grid1HeaderClick(Column: TColumn);
    begin
    // où voilà mon idée d'utilisation du tag qui se concrétise 
    Column.Tag:=Column.Tag+1;
    if Column.tag>1 then Column.Tag:=-1;
    Grid1.NeedStyleLookup;
    case Column.Tag of     // le Tri  merci Firedac
      -1 : FDQuery1.IndexFieldNames:='';
      0 : FDQuery1.IndexFieldNames:=FDQuery1.Fields[Column.Index].FieldName+':A';
      1 : FDQuery1.IndexFieldNames:=FDQuery1.Fields[Column.Index].FieldName+':D';
    end;
    end;
     
    procedure TForm41.GridApplyStyleLookup(Sender: TObject);
    var H : THeader;
        HI : THeaderItem;
        G : TGlyph;
        i : Integer;
        AColumn : TColumn;
    begin
    if Grid1.FindStyleResource<THeader>('Header',H) then
     begin
       H.Height:=40;
       for I := 0 to H.Count-1 do
        begin
          HI:=H.Items[i];
          HI.StyleLookup:='headeritemstyleglyph';  // c'est ici que ça se passe 
          if HI.FindStyleResource<TGlyph>('Glyph1Style',G) then
           begin
            G.Visible:=True;
            AColumn:=Grid1.ColumnByIndex(i);
            if Assigned(AColumn) then G.ImageIndex:=AColumn.Tag
                                 else G.ImageIndex:=0;
           end;
        end;
     end;
    end;
    une petite video de démo ?
    https://serge-girard.developpez.com/...ridheader.webm

    Ok, il y a encore du boulot mais l'idée de base est jetée. Un plus serait de pouvoir indiquer l'ordre de tri des colonnes si plusieurs colonnes sont triées etc..
    En amélioration je pense aussi que, plutôt qu'un glyph, je mettrai un TPath ce qui permettrait de jouer sur la couleur

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Est-il possible de changer un type de colonne à l'exécution ?
    À cette question, une réponse positive voici un petit bout de code très simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm43.Button2Click(Sender: TObject);
    begin
    if SameText(LinkGrid.Columns[0].ColumnStyle,'StringColumn')
      then LinkGrid.Columns[0].ColumnStyle:='CheckColumn'
      else LinkGrid.Columns[0].ColumnStyle:='StringColumn';
    end;
    La première colonne de la grille est une colonne liée à un champ booléen, en cliquant sur le bouton je bascule de la case à cocher à du texte.
    Attention, ColumnStyle n'a strictement rien à voir avec les styles (cela aurait été trop simple) ! Cette fois-ci c'est sur les liens que l'on joue contrairement à mon post précédent.

    Prochaine étape, créer d'autres types de colonnes et voir si cette manip peut fonctionner.

    Je laisse ce fil ouvert

  4. #4
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Merci pour toutes ces idées...effectivement alléchantes...

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    2021 et cela n'a pas bougé
    Aujourd'hui j'ai eu à faire à un stringgrid et le problème s'est posé un peu différement, il me faut (faut car pas encore résolu) aligner le texte d'un Header de colonne.

    Pour ce faire, il faut passer par l'évènement OnDrawColumnHeader
    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
     
    procedure TFormPrestaStocks.GrilleDrawColumnHeader(Sender: TObject;
      const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF);
    var TL : TTextLayout;
         rf : TRectF;
    begin
    if Column.Index<>0 then
     begin
        tl := TTextLayoutManager.DefaultTextLayout.Create;
      try
        tl.BeginUpdate;
        try
          // Effacer 
          Canvas.Fill.Color := TAlphaColors.Lightgray;
          Canvas.FillRect(Bounds, 0, 0, [], 1);
          // Mettre le texte
          tl.TopLeft := Bounds.TopLeft;
          tl.MaxSize := PointF(Column.Width, Column.Height);
          tl.Font.Size := 15;
          tl.Text := Column.Header; // Value
          tl.HorizontalAlign := TTextAlign.Center;
        finally
          tl.EndUpdate;
        end;
        tl.RenderLayout(Canvas);
      finally
        tl.Free;
      end;
     end;
    end;
    Sauf que voilà, il faut effacer le Header pour un mettre un autre, une fois de plus frustration : si je change mon style celui-ci ne sera pas appliqué puisque j'utilise une constante.
    illustration :
    Nom : Capture.PNG
Affichages : 319
Taille : 50,1 Ko

    La frustration encore plus grande qu'en FMX on n'a pas d'accès vraiment direct aux couleurs "systèmes" tel qu'en VCL.

    N.B. ce qui est vrai pour cet exemple avec THeader s'applique aussi pour le contenu des cellules (onDrawColumnBackGround, onDrawColumnCell).

    Il va falloir que je joue avec le style en cours pour obtenir la même chose que pour la première colonne

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Il va falloir que je joue avec le style en cours pour obtenir la même chose que pour la première colonne
    Alzheimer quand tu me tiens !
    J'avais déjà suivi le même cheminement mais avec un TGrid (cf. mon tutoriel sur les Grilles FMX)
    Seulement cela s'appliquait à un Grid, est-ce que cela allait s'appliquer sur mon stringgrid?
    j'ai donc modifié mon code

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    procedure TFormPrestaStocks.GrilleDrawColumnHeader(Sender: TObject;
      const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF);
    var TL : TTextLayout;
        rf : TRectF;
     
        StyleBrush : TBrush;
        ABackColor,ATextColor : TAlphaColor;
     
     
        function GetHeaderColors(Sender: TObject; var BackGroundColor,TextColor : TAlphaColor) : TBrush;
        var Header : THeader;
            HeaderItem : THeaderItem;
            aFMXObj : TFMXObject;
        begin
          // valeurs par défaut fournies avant l'appel
          BackGroundColor:=0;
          TextColor:=TAlphaColors.Black;
          // recherche dans les styles
          Header:=THeader((Sender as TStringGrid).FindStyleResource('header'));
          if Assigned(Header) then
            begin
              // obtention d'un élément
              HeaderItem := Header.Items[1];
              // accès au style du texte
              AFMXObj:=THeaderItem(HeaderItem).FindStyleResource('Text');
              TextColor:=TText(AFMXObj).TextSettings.FontColor;
              // accès au style du fond
              AFMXObj:=THeaderItem(HeaderItem).FindStyleResource('background');
              Result:=TRectangle(AFMXObj).Fill;
              if Assigned(result) then
                begin
                  if (Result.Kind=TBrushKind.Gradient)
                  then begin
                      BackGroundColor:=Result.Gradient.InterpolateColor(50);
                      // de horizontal à vertical ? (Pas concluant)
                      Result.Gradient.StartPosition.X:=1;
                      Result.Gradient.StartPosition.Y:=1;
                  end
                  else BackGroundColor:=Result.Color;
                end;
            end;
        end;
     
    begin
    if Column.Index<>0 then
     begin
       // aBackColor:=TAlphaColors.Lightgray;
       // ATextColor:=TAlphaColors.Black;
       Stylebrush:= GetHeaderColors(Sender,aBackColor,aTextColor);
       tl := TTextLayoutManager.DefaultTextLayout.Create;
          try
            tl.BeginUpdate;
            try
              rf:=Bounds;
              InflateRect(rf,-1,-1);
              canvas.ClearRect(rf,ABackColor);
     
              tl.TopLeft := Bounds.TopLeft;
              tl.MaxSize := PointF(Column.Width, Column.Height);
              tl.Font.Size := 15;
              tl.Text := Column.Header; // Value
              tl.HorizontalAlign := TTextAlign.Center;
            finally
              tl.EndUpdate;
            end;
            tl.RenderLayout(Canvas);
          finally
            tl.Free;
          end;
         end;
    end;
    pour l'instant c'est un flop, puisque j'ai les valeurs par défaut
    Nom : Capture.PNG
Affichages : 310
Taille : 26,0 Ko
    du coup, gros doute sur la manière de récupérer l'élément : HeaderItem := Header.Items[1];

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Pour continuer mon monologue sur cette question, de fait, je me heurte à la notion de TxxxxStyleObject (dans le cas d'un Header un TButtonStyleObject) qui récupèrent l'image dans la ressource.
    Je n'ai jamais rien réussi de bon avec cette chose
    avec un style plus "classique" utilisant un TRectangle je récupére bien les couleurs nécessaires
    Nom : Capture.PNG
Affichages : 295
Taille : 12,9 Ko
    mais avec les styles objects je sèche.

Discussions similaires

  1. [Débutant] Affichage d'une grille
    Par Mathieu.J dans le forum OpenGL
    Réponses: 25
    Dernier message: 13/06/2004, 19h38
  2. : Adapter la taille d'une grille
    Par SteelBox dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/07/2003, 07h08
  3. Désactiver la multi-sélection d'une grille
    Par Riko dans le forum Composants VCL
    Réponses: 6
    Dernier message: 17/06/2003, 09h47
  4. jaimerais savoir commen creer une grille.......
    Par zephyr dans le forum Flash
    Réponses: 5
    Dernier message: 29/04/2003, 12h14

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