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 :

TStringGrind FMX : pas de FixedCols ?


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut TStringGrind FMX : pas de FixedCols ?
    Utilisant depuis très peu les composants FMX, je cherche avec fébrilité les propriétés très naturelles de la VCL, comme FixedCols, qui est la moindre des choses à fournir sur un composant Grid...
    Et ça n'existe pas semble-t-il ?
    Après quelques échanges avec SergioMaster, je pense utile d'ouvrir un sujet.

    Merci de toutes vos lumières et astuces

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Je remets ici partie de nos échanges
    Citation Envoyé par SergioMaster
    Là, c'est une colle, car je ne sais même plus à quoi correspond ce fixedcol (même si j'en ai une idée )
    En première réaction : non, je ne crois pas, mais je n'ai jamais fait
    en seconde :
    - hum, un challenge à relever ?
    - TMS FMX Grid semble le faire, ils parlent de Freezing Column ou Line, (bien que j'ai plus ou moins abandonné l'utilisation de TMS FMX ) donc c'est du domaine du possible
    Nom : Capture.PNG
Affichages : 617
Taille : 33,5 Ko

    Citation Envoyé par SergioMaster
    Dans mon tutoriel https://serge-girard.developpez.com/...rilles/#LVII-B j'ai bien fait une sorte de colonne fixe pour le curseur, mais je n'ai jamais songé à des colonnes données fixes
    Citation Envoyé par SergioMaster
    Il y a quand même une astuce possible, 2 grilles synchronisées (ou plus) séparées par un Splitter avec Livebindings c'est assez facile, il suffit ensuite de déclarer les colonnes de chaque grille.
    Plus compliqué la couleur de fond, il faudra passer par les styles pour plus de facilité
    Citation Envoyé par navyg
    ça serait le plus pratique pour moi un tableau dont on peut adresser les cellules par un couple (x,y)
    Donc, je ne parlerai pas de mon essai avec livebindings, sauf si ça intéresse quelqu'un.

    Citation Envoyé par SergioMaster
    C'est sans conteste StringGrid, j'ai moins travaillé dessus.
    voici un essai perfectible.
    Nom : Capture_1.PNG
Affichages : 571
Taille : 19,9 Ko

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    unit TestStringGridmain;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti,
      FMX.Grid.Style, FMX.Grid, FMX.Controls.Presentation, FMX.ScrollBox,
      FMX.Layouts, Data.Bind.EngExt, Fmx.Bind.DBEngExt, Data.Bind.Components;
     
    type
      TForm4 = class(TForm)
        StringGrid1: TStringGrid;
        StringColumn1: TStringColumn;
        StringColumn2: TStringColumn;
        StringColumn3: TStringColumn;
        StringColumn4: TStringColumn;
        StringColumn5: TStringColumn;
        StringColumn6: TStringColumn;
        StringColumn7: TStringColumn;
        StringGrid2: TStringGrid;
        Layout1: TLayout;
        BindingsList1: TBindingsList;
        procedure FormCreate(Sender: TObject);
        procedure StringGrid2DrawColumnBackground(Sender: TObject;
          const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
          const Row: Integer; const Value: TValue; const State: TGridDrawStates);
        procedure StringGrid1SelectCell(Sender: TObject; const ACol, ARow: Integer;
          var CanSelect: Boolean);
        procedure StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
          const Column: TColumn; const Bounds: TRectF; const Row: Integer;
          const Value: TValue; const State: TGridDrawStates);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form4: TForm4;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm4.FormCreate(Sender: TObject);
    var
      I: Integer;
      X: Integer;
    begin
    StringGrid1.RowCount:=20;
    StringGrid2.RowCount:=20;
     
    for x:=0 to StringGrid1.RowCount-1 do
    begin
    for I := 0 to Stringgrid2.ColumnCount-1 do
      Stringgrid2.Cells[I,X]:='FFFF '+I.ToString+'/'+X.ToString;
     
    for I := 0 to Stringgrid1.ColumnCount-1 do
      Stringgrid1.Cells[I,X]:='AAAA '+I.ToString+'/'+X.ToString;
     
    end;
    Stringgrid2.ShowScrollBars:=False;
     
     
    end;
     
    procedure TForm4.StringGrid1DrawColumnCell(Sender: TObject;
      const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
      const Row: Integer; const Value: TValue; const State: TGridDrawStates);
    begin
    // permet de garder le positionnement de grille (synchro)
    StringGrid2.TopRow:=StringGrid1.TopRow;
    end;
     
    procedure TForm4.StringGrid1SelectCell(Sender: TObject; const ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
    StringGrid2.Row:=ARow;  // synchro
    end;
     
    procedure TForm4.StringGrid2DrawColumnBackground(Sender: TObject;
      const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
      const Row: Integer; const Value: TValue; const State: TGridDrawStates);
    var  RowColor : TBrush;
    begin
      // dessin colonnes fixes
      RowColor := Tbrush.Create(TBrushKind.Solid,TAlphaColors.Gray);
      Canvas.FillRect(Bounds, 0, 0, [], 1, RowColor); // agrandir bounds ?
      Column.DefaultDrawCell(Canvas,bounds,row,value,state);
    end;
     
    end.
    Note :
    la grille de gauche est en Defaultdraw:=false;
    la colonne 3 (première de la grille de droite) est déclarée invisible, sujet d'un autre essai non codé ici

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    La synchronisation entre grille n'étant pas terrible, j'ai modifié le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm4.StringGrid1DrawColumnCell(Sender: TObject;
      const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
      const Row: Integer; const Value: TValue; const State: TGridDrawStates);
    begin
    if VpositionGrid<>Stringgrid1.VScrollBar.Value then
     begin
       VpositionGrid:=StringGrid1.VScrollBar.Value;
       StringGrid2.ViewportPosition:=TPointF.Create(0,VpositionGrid);
     end;
     
    end;
    VpositionGrid est une variable privée initialisée à 0 dans le onformCreate (à changer pour une propriété de la forme)

    j'en ai profité pour améliorer le rendu de la grille de gauche
    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 TForm4.FormCreate(Sender: TObject);
    var
      I: Integer;
      X: Integer;
    begin
    StringGrid1.RowCount:=20;
    StringGrid2.RowCount:=20;
     
    for x:=0 to StringGrid1.RowCount-1 do
    begin
    for I := 0 to Stringgrid2.ColumnCount-1 do
      Stringgrid2.Cells[I,X]:='FFFF '+I.ToString+'/'+X.ToString;
    for I := 0 to Stringgrid1.ColumnCount-1 do
      Stringgrid1.Cells[I,X]:='AAAA '+I.ToString+'/'+X.ToString;
    end;
    VpositionGrid:=0;
     
    Stringgrid2.ShowScrollBars:=False;
    StringGrid2.Width:= StringColumn1.width+StringColumn2.width;
    StringGrid2.Margins.Bottom:=16;  // todo : obtenir la hauteur de la barre horizontale 
    end;

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Je viens d'essayer et ce n'est pas tout à fait concluant.
    dès que je peux je m'y remets.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    comme je l'ai déjà écrit, j'estime que FMX ne sait pas nativement gérer les Grids à un niveau équivalent de l'ancienne VCL (Delphi 7), qui évidemment de nos jours serait largement inférieure à l'actuel composant équivalent natif de Lazarus (LCL).

    Évidemment pour régler votre problème, il est possible de synchroniser des grilles Cela me rappelle d'autres approches toutes aussi alambiquées pour résoudre des problèmes usuels sur ce composant dont l'usage serait (?) de nos jours totalement obsolète dans le développement moderne. Remarquez que si vous ne pouvez pas fixer les colonnes dans vos Grid FMX, vous pouvez par contre faire tourner vos Grids FMX sur les 3 axes. Je suppose que c'est cela la modernité !

    Les composants TMS ont des limites certes... à cause des styles principalement utilisés par FMX (et je suppose également avec l'actuel VCL que je n'ai jamais utilisée avec les versions XE et suivantes). Comme Serge, je n'apprécie pas les TMS FMX composants dédiés à FMX et donc, avec une approche FMX imposée y compris pour les développeurs de TMS... mais il existe également les TMS FNC composants qui fonctionnent très correctement sous Lazarus et sont compatibles Delphi. Ils fonctionnent un peu moins bien sous FMX que sous Lazarus. Ils gèrent mal les styles (enfin je dis cela mais je n'ai jamais réussi à utiliser et accepter les styles) et il manque certains évènements, mais cela n'est pas de la faute de TMS.

    Pour répondre à votre question, voici ce que je fais en Lazarus en 2 modifications dans l'inspecteur d'objet d'une TMSFNCGrid :
    Nom : Capture d’écran 2023-01-19 184338.png
Affichages : 534
Taille : 7,0 Ko
    Ici, les 2 premières colonnes de gauche sont fixes ainsi que la dernière colonne de droite. Je peux loquer de la même façon des lignes en haut et en bas de la grille simplement avec une propriété dans l'inpecteur d'objet. Le code ressemble beaucoup à celui de l'antique VCL (Delphi 7)
    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
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: integer;
    begin
      with TMSFNCGrid1 do
      begin
        RowCount := 4;
        for i := 1 to  RowCoun -1 do
        begin
          Cells[0, i] := IntToStr(i);
          cells[1, i] := 'Nom prénom ' + IntToStr(i);
          cells[2, i] := 'Bla bla bla bla bla bla bla bla bla bla bla bla bla bla ' + IntToStr(i);
        end;
      end;
    end;
    Je ne l'ai pas récemment testé sous Delphi que je n'installe que très périodiquement, pour une courte période, pour me rendre au compte au fil des versions, de ma compatibilité avec la gymnastique imposée par FMX

    Il existe une version de démonstration chez TMS Software uniquement pour Delphi (pas pour Lazarus). L'installation est possible sous la version Community de Delphi par contre la désinstallation est souvent délicate... Enfin c'est ce que j'ai constaté sur une des premières version 10. Si vous êtes étudiant ou enseignant, je crois qu'il existe une version à petit prix. Si vous êtes un professionnel, le coût est à mon avis vite amorti d'autant que ce pack permet par exemple de gérer le HTML dans les champs, des exports à partir des grids...

    Je n'ai aucune action chez TMS Software, ni chez Devart (unidac), mais leurs composants pallient des difficultés rencontrées sous Delphi et Lazarus tout en les modernisant. A tester à mon avis.
    En espérant vous avoir été utile. Cordialement. Gilles
    Dernière modification par Invité ; 20/01/2023 à 12h30.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Merci pour cette réponse.
    Je suis entièrement d'accord avec votre estimation sur les composants FMX ... Beaucoup des fonctionnalités ne servent à rien .. notamment la 3D (pour quoi faire ?)
    Mais à l'heure actuelle je n'ai que ça pour faire du multiplateforme donc j'essaye de m'adapter.

    Quand à étudier ho oui j'étudie et j'apprends mais je ne suis pas étudiant et ne l'ai jamais vraiment été puisque j'ai arrêté mes études au bac ... quand à reprendre des études, à 65 ans il est vrai que c'est possible mais je suis largement assez occupé comme ça

    J'avais essayé d'installer lazarus il ya quelques années, mais je m'étais heurté à une foule de dysfonctionnement et de bugs en tout genre lors du simple fonctionnement d'un hello world donc j'avais tout désinstallé ... Ca fait de l'android lazarus ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par navyg Voir le message
    Ca fait de l'android lazarus ?
    Comme dans le sketch,cibler android avec Lazarus, je répondrais : "Il y en a qui ont essayé". Théoriquement c'est possible, mais à quel niveau de productivité et de fonctionnalité ? Je l'ignore. Par contre avec Lazarus, il est impossible de cibler iOS.

    Je ne développe plus beaucoup pour les mobiles actuellement. Dans une autre discussion, je disais que si je devais re-cibler les OS mobiles (android et iOS), j'apprendrais à utiliser -je l'avais déjà essayé- Android studio et pour iOS, j'utiliserais (comme pour mac OS) Swift et ses outils UI. Comme je suis un ancien développeur Delphi/Lazarus, je n'ai pas pu m'adapter à FMX. J'ai opté pour un environnement sans faux-frères qui finalement possède une approche identique même si le langage est différent évidemment : Qt

    Je ne le regrette pas. Mais même si Qt permet de cibler les mêmes OS que FMX (Dektops et mobiles), je me suis rendu compte qu'un framework "à tout cibler" fait moins bien que les outils (souvent natifs) dédiés à chaque OS. C'est un discours un peu iconoclaste sur ce forum. Cependant Delphi reposait essentiellement sur les API de Windows, c'est pour cela qu'il était excellent pour cibler cet OS. Maintenant, gérer les "API" de tous les OS en une seule approche dans un framework, je trouve cela brillant. Mais est-ce possible sans concessions, sans complications à outrance ? Théoriquement, l'usage de tels produits devrait être un gain de temps. Même IDE, mêmes objets, même langage,... Mais dans la réalité, j'ai trouvé cela très chronophage et même très compliqué dès qu'on veut obtenir les mêmes résultats et fonctionnalités sur des OS équivalents, c'est à dire d'une part pour Windows Linux et mac OS ou d'autre part, android, iOS et iPadOS. Ensuite un autre problème est l'évolution des OS. La sortie des versions d'android ne coïncide pas avec celle de iOS et l'intégration des nouveautés qui ne sont pas forcément les mêmes est délicate dans de tels IDE. Cela nécessite au moins des patches. Maintenant si vous utilisez Android Studio pour android ou Swift/UI pour iOS, iPadOS, mac OS, vous collez aux OS, à leurs nouveautés et pour les OS mobiles, aux "nouveautés" imposées par les stores. Cela fait évidemment des IDE et des langages différents à maitriser mais comme je l’ai écrit, passer de Delphi/lazarus à Qt m'a été plus facile, moins frustrant que de m'adapter aux nouveaux Delphi. Franchement quand je suis sous Swift, cela n'interfère absolument pas avec mes connaissances et mes habitudes Qt.

    Si vous testez les TMSFNC (notamment les Grids) sous FMX, j'ai stocké au fil des tests des versions de Delphi pas mal de codes... Et effectivement en regardant sur le site de TMS, le TMSFNC UI pack cible les OS mobiles :
    Nom : Capture d’écran 2023-01-19 200029.png
Affichages : 554
Taille : 45,3 Ko

    Cordialement. Gilles
    Dernière modification par Invité ; 19/01/2023 à 20h25.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/05/2020, 13h34
  2. Réponses: 4
    Dernier message: 29/04/2020, 12h00
  3. Réponses: 1
    Dernier message: 27/09/2019, 15h45
  4. Réponses: 0
    Dernier message: 06/09/2018, 10h24
  5. FMX.Platform.IFMXLoggingService , comprend pas
    Par Papy214 dans le forum Langage
    Réponses: 5
    Dernier message: 02/04/2015, 10h07

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