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 :

[Tokyo] TGrid, couleur d'une cellule mais selon la valeur d'un autre champ


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 619
    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 619
    Billets dans le blog
    65
    Par défaut [Tokyo] TGrid, couleur d'une cellule mais selon la valeur d'un autre champ
    Bonjour,

    suite à cette discussion il est assez simple de mettre une couleur de fond (ou autre personnalisation) sur une cellule.

    La question qui se pose est maintenant la suivante : comment faire cette même "coloration" en fonction d'une autre donnée que celle de la cellule ?

    par exemple : ma table contient un libellé, un montant (qui peut être négatif) etc... je veux que dans ma grille la ligne entière soit en rouge si le montant est négatif

    j'ai tenté bien évidemment de tester à partir de la source de données style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
        If TableMontant.asCurrency<0 then  Canvas.Fill.Color:=TAlphaColors.Red
                                                 else  Canvas.Fill.Color:=TAlphaColors.White;
    ....
    mais ça ne semble pas fonctionner le "chargement" de la grille ne fait pas déplacer le curseur dans la table

    j'ai bien pensé à un test sur la cellule contenant le montant mais si on respecte l'ordre libellé/montant alors cette cellule est remplie après donc sa vealur est encore à null quand je rempli la cellule libellé

    j'ai testé les évènements sur le lien OnAssignedValue, OnAssigningValue même problème c'est cellule par cellule et non enregistrement par enregistrement

    D'autres pistes ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 619
    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 619
    Billets dans le blog
    65
    Par défaut Question posée autrement
    Bonjour,

    après avoir testé à partir d'une TMSFMXLiveGrid je pose la question autrement :
    Quel moyen pour obtenir la valeur d'une cellule de la grille, en gros un bon vieux Grille.Cells[col,row] du StringGrid

    j'ai tenté l'utilisation de TGridModel ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         if (row>0) AND (column.index=0)  then
           begin
             AValue:=TGridModel(Grid1).GetValue(1,Row,false);
             if not AValue.IsEmpty then
                ShowMessage(AValue.ToString);
           end;
    mais je plante sur l'obtention AValue

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 619
    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 619
    Billets dans le blog
    65
    Par défaut Suite du monologue
    Bon, personne (sur ce forum ou ailleurs) ne semble pouvoir répondre.

    La liste des problèmes s'allonge car après moultes recherches la non obtention de la valeur d'une cellule dans un TGrid du au fait que TGrid (contrairement à StringGrid) ne mémorise pas le contenu des cellules
    Pour une TGrid remplie "à la main" il y avait la possibilité d'utiliser un tableau à remplir via l'évènement onSetValue mais cette possibilité m'est refusée car j'utilise les Livebindings pour remplir la dite grille.
    Citation Envoyé par Delphi
    Erreur
    Impossible de changer cette propriété los de l'utilisation de LiveBinding
    Je suis donc passé à un plan B en utilisant l'évènement OnAssigningValue du BindGridLink qui semblerai être l'équivalent de OnSetValue, problème : je n'ai aucune idée pour retrouver la ligne de la grille
    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
    A : Array of TValue;
    NRow : Integer;
    
    procedure TForm15.FormCreate(Sender: TObject);
    begin
    cds.LoadFromFile('F:\Livebindings\FMX\DBGrid\Win32\Debug\PecheurMenteur.cds');
    cds.IndexFieldNames:='DatePrise;Heure';
    cds.Active:=True;
    SetLength(A, Grid1.RowCount);
    nrow:=0;
    end; 
    
    procedure TForm15.BindGridLink1AssigningValue(Sender: TObject;
      AssignValueRec: TBindingAssignValueRec; var Value: TValue;
      var Handled: Boolean);
    var ACol : Integer;
    begin
    // Touver la colonne : OK 
    if AssignValueRec.OutObj.ClassNameIs('TGridDataObject')
      then
           ACol:=TGridDataObject(AssignValueRec.OutObj).Column
      else ACol:=-1;
    
    if ACol=1 then
     begin
      // comment trouver la ligne ?  
      A[nRow]:=Value;
      inc(nRow);  // ne fonctionne pas car débordement prévisible
     end;
    end;

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    c'est dans le dbgrid que tu doit chercher la valeur
    je vois plus un truc dans le genre
    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 TMainForm.GridBisFrame1Grid1DrawColumnCell(Sender: TObject;   const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;   
    const Row: Integer; const Value: TValue; const State: TGridDrawStates);
    var
      Ds : TDataset;
    begin
      with Column do
      begin
         if Index= MaCol then
         begin
            Ds := (Sender as DBGRID).DataSource.dataset 
            if Ds.FieldBtName('LE CAHAMP').asInteger = 18 Then 
            begin  
              Canvas.Fill.Color:=TAlphaColors.Red;
              Canvas.FillRect(Bounds,0,0,[],1);
              Canvas.Fill.Color:=TAlphaColors.Black;
              Canvas.FillText(Bounds,Value.ToString,false,1,[],TTextAlign.Leading);
           end
           else 
             DefaultDrawCell(Canvas,Bounds,Row,Value,State) ; 
        end
        else DefaultDrawCell(Canvas,Bounds,Row,Value,State) ;
     end;
    end;

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Citation Envoyé par anapurna Voir le message
    c'est dans le dbgrid que tu doit chercher la valeur
    Tu voulais surement dire le TGridModel qui effectivement une propriété DataSource

    Mais on peut penser que Sergio a commencé par ça, c'est si typique effectivement de la TDBGrid de la VCL (qui n'existe qu'en VCL) et l'espoir de voir une propriété DataSource a du rapidement le décevoir car FMX étant conçu différemment avec LiveBindings qu'il fallait s'y attendre que cela n'aurait aucun rapport

    Ce FMX.Controls.Model.TDataModel.TDataSource est en fait un TDictionary qui n'a strictement rien à voir avec le Data.DB.TDataSource !

    Sergio, on ne trouve même pas la documentation du TGridDataObject ( normal pour un type caché qu'un développeur ne devrait pas utiliser ) et Google me propose que ça Fait troublant autour d'une déclaration, tu es un pionner dans cette recherche

    Dans les LiveBindings, on peut si j'ai bon souvenir gérer aussi la coloration des Edit en fonction de valeur
    J'aurais à penser que c'est via un Livebindings que tu gérer la coloration


    Autre proposition, créer manuellement la colonne en code via une classe héritée de TColumn et via CreateCellControl (peut-être disparu depuis Seattle et remplacé par ce TGridDataObject) qui fournis ta propre classe de TStyledControl, tu ne pourrais pas récupérer les informations de ligne\colonne pour suite lire les données (au moment du SetData)

    ou encore en suivant la proposition d'Anapurna BindDBGridLink.DataSource.DataSet depuis TForm15.BindGridLink1AssigningValue mais pour cela il faut un TBaseBindDBGridLink et je ne sais si ton BindGridLink1 peut y être associé dans BindComps[].
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 619
    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 619
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    @Anapurna le TGrid n'est pas relié sensu stricto au DataSet (si ce n'est par les LiveBindings) donc ta proposition "faire comme DBGrid" ne fonctionne pas, cela eut été trop simple

    Selon mes enquêtes, TGrid ne stocke aucune données exploitable du Dataset, juste une représentation de ces données

    Citation Envoyé par ShaiLeTroll
    on ne trouve même pas la documentation du TGridDataObject, tu es un pionnier dans cette recherche
    c'est ce que je craignais
    On dirait que TGrid n'agit en fait que comme un immense canvas, TMSFMXLiveGrid y ajoute donc sa propre pseudo StringGrid pour accéder aux données.
    En y réfléchissant, ce qui serait un moyen contourné de faire le boulot une StringGrid cachée livebindée de la même manière que la Grid (ne contenant que les données dont on a besoin), pas très académique mais simple et efficace (je vais tester)

    Citation Envoyé par ShaiLeTroll
    BindDBGridLink.DataSource.DataSet depuis TForm15.BindGridLink1AssigningValue
    je n'avais pas pensé au Datasource.Dataset mais à mon avis (encore une fois je vais tester) cela ne fonctionnera pas, les Bindings ne semble pas fonctionner de cette manière (trop "VCL"). Et, la lacune de AssigningValue c'est que je ne vois pas comment accéder au numéro de grille de la ligne s'il y avait un moyen de faire appel à l'expression poscontrol ....


    Citation Envoyé par ShaiLeTroll
    J'aurais à penser que c'est via un Livebindings que tu gérer la coloration
    oui, mais pas de tout les composants hélas et dans mon cas, pas d'une cellule de TGrid et de ses colonnes, on a accès par exemple à la largeur de la colonne (width), ce qui me permet de gérer une colonne "élastique" ou encore avec un méthode à ajouter au moteur, une colonne "au plus juste" (tu te souviens peut être de ma question sur la taille d'un caractère) mais pas à la cellule sensu stricto

    j'ai aussi fait des tests en ce sens en tentant de Lier des tags mais non, peine perdue, en bref je n'ai aucun accès sur le canvas de la grille au moment de la liaison
    quoique j'ai encore des pistes à explorer après tout si FormatControl est une collection il doit y a moyen d'initialiser plusieurs choses avec un même lien !

    En fait, dés que l'on pose des points d'arrêts dans le OnDrawCell on s'aperçoit que cette méthode est très très souvent (beaucoup trop à mon avis) utilisée (le moindre déplacement et c'est parti)

    Merci pour vos deux réponses qui m'ont quand même fait envisager d'autres choix au cours de la rédaction de ma réponse

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/09/2015, 10h09
  2. [AC-2003] Remplir un champ selon la valeur d'un autre champ
    Par jeanpierre67 dans le forum IHM
    Réponses: 2
    Dernier message: 31/07/2011, 17h55
  3. [XL-2007] Coloriser une courbe selon la couleur d'une cellule
    Par ievtohs dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/04/2011, 20h16
  4. Cacher un champ selon la valeur d'un autre champ
    Par pascale86 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 19/02/2007, 15h54
  5. Réponses: 8
    Dernier message: 22/03/2006, 17h16

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