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 :

Grid (FMXGrid) , Table et Multiselection


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 603
    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 603
    Billets dans le blog
    65
    Par défaut Grid (FMXGrid) , Table et Multiselection
    Bonjour,

    Dans mes essais de passage a FMX (version XE4) , je transpose un "simple" programme de sélection d'enregistrements (via case a cocher) et je bute sur la navigation dans la sélection .

    1°Constatation quelle galère pour tailler les colonnes au design

    Dans un premier temps , j'avais ajouter un champ booléen à la liste de mes champs pour avoir une colonne case à cocher : dans ce cas ci , je dirais pas de soucis , il suffit de naviguer dans la table pour se positionner sur les enregistrements 'sélectionnés'


    Puis j'ai voulu faire un essai (dans l'esprit : simplifions , simplifions) en mettant la case a cocher dans une colonne fixe sans champ supplémentaire (après avoir pas mal fouillé dans la doc de TMSFMXGrid)

    j'ai là aussi pas mal galérer avec l'option SelectionMode pour finalement avoir une solution simple : sans utiliser le système de sélection de TMS (smNone)
    pour les curieux
    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
     
    // Ajout de la checkbox dans la colonne fixe
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Grid.AddCheckBoxColumn(0);
    end;
     
    // changement d'état , selection/déselection
    procedure TForm1.GridCellCheckBoxClick(Sender: TObject; ACol, ARow: Integer;
      Cell: TFmxObject);
    begin
      Grid.RowSelect[ARow]:=not Grid.RowSelect[ARow];
    end;
     
    // Colorisation des lignes selectionnées
    procedure TForm1.GridGetCellLayout(Sender: TObject; ACol, ARow: Integer;
      ALayout: TTMSFMXGridCellLayout; ACellState: TCellState);
    begin
    if Grid.RowSelect[Arow]
      then begin
           ALayout.Fill.Color := Grid.StylesData['SelectedCellLayout.Layout.Fill.Color'].AsUInt64;
      end
      else begin
          ALayout.Fill.Color := Grid.StylesData['NormalCellLayout.Layout.Fill.Color'].AsUInt64;
      end;
    end;
    J'en arrive à ma question : Maintenant j'ai ma sélection multiple , cela doit être tout simple mais comment je navigue dedans enfin , plus exactement comment je sélectionne l'enregistrement correspondant !?
    Dans un DBGrid VCL Classique il y a le GotoBookMark mais avec le FMXStringGrid et les LiveBindings y a pas ou alors je ne sais pas où ?

    [Edit] Suite , j'indique la version au cas où XE4
    Par hasard , je suis "tombé" sur un autre problème de grille (TMSFMXGrid comme StringGrid)
    J'ai voulu faire une lecture de toute ma table , le classique 'First .. While Not EOF ... Next, et là surprise au niveau de la grille en première ligne , je retrouve mon dernier enregistrement !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    //Grid.BeginUpdate;
    ADTable1.DisableControls;
    adtable1.First;
    while not ADTable1.EOF do
    begin
     if Adtable1Checked.asBoolean then
     showmessage(ADTable1LIBELLE_APPOSE.AsString);
     ADTable1.Next;
    end;
    ADTable1.EnableControls;
    //Grid.EndUpdate;
    end;
    J'ai bien sur essayé les disablecontrols /EnableControls rien n'y fait
    Y a t'il une astuce supplémentaire , un truc ?
    voilà les images en illustration
    1- au design "normal"
    2- à l'ouverture , j'ai fait un First juste après le onCreate
    3- apres clic sur le bouton voir code , la "fameuse" boucle
    Images attachées Images attachées    

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 603
    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 603
    Billets dans le blog
    65
    Par défaut Au temps pour moi
    Il semblerait que le problème vienne de Firedac , j'ai essayé avec un TDataSet DBexpress et je n'ai pas la surprise d'affichage !

    reste que je ne sais toujours pas passer de RowSelected à Enregistrement de la Table !

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 603
    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 603
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Il semblerait que le problème vienne de Firedac
    Pour Firedac , il fallait que je mette l'option LiveWindowParanoic a true
    ce nom est tellement bizarre que je n'avais même pas lu la doc a ce sujet !
    Heureusement Dmitry Arefiev , le FireDAC Architect chez Embracadero répond très vite aux Questions sur le
    Embarcadero Discussion Forums » Delphi » Database » FireDAC


    je continue mes explorations ....

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 603
    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 603
    Billets dans le blog
    65
    Par défaut
    Bonjour, après moultes galères j'ai réussi a faire ce que je voulais de la manière suivante .

    Tout d'abord je tiens à signaler que la TMSFMXGrid est encore très jeune et a beaucoup de , oserai-je le dire, bugs les tests réussis ont été réalisé avec la mouture 2.0.0.4 , certains événements ce cette dernière ne fonctionnent toujours pas (par exemple les onFixedCellxxxxxx , déclarées mais non codifiées) .
    De même FireDac lié avec des LiveBindings a certains comportements que je jugerai "étranges" (enfin je débute avec les livebindings) d'où les options LiveWindowParanoic par exemple (et je ne parle pas de mes tentatives pour lier un Table Temporaire a un Grid )

    finalement voilà la solution qui fonctionne :

    tout d'abord , le Datasource , j'ai utilisé une TADQuery plutôt qu'une TADTable pour avoir une colonne SELECTION

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CHAMP1,CHAMP2,CAST('FALSE' AS VARCHAR(5)) AS SELECTION FROM TABLE
    Notez le type et la valeur de cette Colonne , important car dans TMSFMXGrid les Valeurs pour cocher/décocher les cases semblent être TRUE/FALSE uniquement (à vérifier)

    Après avoir réussi a lier la TADQuery a une TMSFMXGrid (croyez moi ce n'est pas tout à fait du wyseewyg loin de là , par rapport a la DBGrid VCL quelle régression à mon avis) j'ai forcé la colonne SELECTION avec cette instruction
    dans le OnCreate de la Forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMSFMXGrid1.AddDataCheckBoxColumn(0);
    où le zéro est la colonne SELECTION . J'avais beau essayer en indiquant que la colonne était de type case à cocher cela ne fonctionnait pas , Bug ou mauvaise manip ?

    pour la sélection de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.TMSFMXGrid1CellCheckBoxClick(Sender: TObject; ACol,
      ARow: Integer; Cell: TFmxObject);
    begin
      (Sender as TTMSFMXGrid).RowSelect[ARow]:=not (sender  as TTMSFMXGrid).RowSelect[ARow];
    end;
    pour le 'dessin' des lignes sélectionnées , la routine que j'avais déjà indiquée et qui me permet de travailler avec les styles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.GridGetCellLayout(Sender: TObject; ACol, ARow: Integer;
      ALayout: TTMSFMXGridCellLayout; ACellState: TCellState);
    begin
    if ACellState = csFocused then exit;
    if (Sender as TTMSFMXGrid).RowSelect[Arow]
      then begin
           ALayout.Fill.Color := (Sender as TTMSFMXGrid).StylesData['SelectedCellLayout.Layout.Fill.Color'].AsUInt64;
      end
      else begin
          ALayout.Fill.Color := (Sender as TTMSFMXGrid).StylesData['NormalCellLayout.Layout.Fill.Color'].AsUInt64;
      end;
    end;
    restait a récupérer les enregistrements 'cochés' , là je me heurtais a l'absence du Bookmark , j'ai donc fait différemment ! en ne browsant pas le datasource mais la Grille qui , étant lièe via livebindings va sur le bon enregistrement (le monde à l'envers )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.TestClick(Sender: TObject);
    var i : Integer;
        ACell : TCell; // une cellule 
    begin
     for I := 1 to TMSFMXGrid1.RowCount do
      begin
        Acell.Col:=0;
        ACell.Row:=I;
        TMSFMXGrid1.SelectCell(ACell); // se positionne a la ligne
        if TMSFMXGrid1.AllCells[0,I]='TRUE' then
           Showmessage(ADQuery1CHAMP1.AsString);
      end;
    end;
    Avantage : un tri de colonne via un clic sur un entête de colonne reste nickel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm19.TMSFMXGrid1FixedCellClick(Sender: TObject; ACol,
      ARow: Integer);
    begin
    if ARow=0 then
       TMSFMXGrid1.SortColumn:=Acol;
    end;
    reste quand même un inconvénient , je ne suis pas sur de savoir traiter un déplacement de colonne . Cependant je considère que mon premier objectif est

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

Discussions similaires

  1. Différences entre GRID et TABLE
    Par rouletabille63 dans le forum BIRT
    Réponses: 1
    Dernier message: 18/05/2012, 12h16
  2. [Dojo] Remplir un Grid à partir d'une table SQL
    Par lagoule dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 10/06/2009, 11h13
  3. Réponses: 2
    Dernier message: 14/01/2009, 10h21
  4. Formulaire de multiselection avec plusieurs tables
    Par Guillaume 78 dans le forum IHM
    Réponses: 2
    Dernier message: 21/05/2008, 10h51
  5. Fenêtre popup avec table en multiselection
    Par gbrion dans le forum WinDev
    Réponses: 5
    Dernier message: 18/03/2007, 19h23

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