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 :

ListView avec bouton more et un bloc "expandable"


Sujet :

Composants FMX Delphi

  1. #1
    Membre averti Avatar de hector94
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut ListView avec bouton more et un bloc "expandable"
    Bonjour,

    J'utilise de plus en plus les TListView et la création de nouveau Appearance.

    Je cherche à faire un item avec un bouton more qui permet de déployer (rendre visible) un texte supplémentaire dans l'item de la listView

    J'ai créé un nouvel objet Appearance avec bouton More et un TTextObjectAppearance (MoreText) pour le contenu texte du more.

    Par défaut cet objet n'est pas visible et si on clique sur le bouton more je voudrais que l'objet texte devienne visible.

    J'ai bien le bouton, j'ai l'événement du clic sur le bouton mais je n'arrive pas à rendre l'objet MoreText visible.
    Je ne trouve pas à quel endroit je peux accéder à cet objet.

    J'ai le clic sur le bouton via l'événement : (et je peux changer le texte du bouton)
    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
     
    procedure TFrameShowOperations.lbEventsItemClickEx(const Sender: TObject;
      ItemIndex: Integer; const LocalClickPos: TPointF;
      const ItemObject: TListItemDrawable);
    begin
      //...
          if (ItemObject.Name = 'MoreButton') then
             begin
               item := lvEvents.Items[itemindex];
               ItemObject.BeginUpdate;
               try
               if tlistitemtextbutton(ItemObject).text = 'ReadMore' then
                  tlistitemtextbutton(ItemObject).text := 'ReadLess'
                else
                  tlistitemtextbutton(ItemObject).text := 'ReadMore';
               finally
                 ItemObject.EndUpdate;
               end;
      //...
    end;
    A ce niveau il n'est pas possible d'obtenir l'objet MemoText

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            item := lvEvents.Items[itemindex];
            Item.View.FindDrawable('MoreText') // vaut nil
    L'événement procedure TFrameShowOperations.lvEventsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); n'est pas appelé.

    Peut-être y a t il un défaut de compréhension du fonctionnement des tlisview et appearance ?

    Une idée ou une piste de recherche .

    Delphi 10.2
    fmx

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 596
    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 596
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    J'utilise de plus en plus les TListView et la création de nouveau Appearance.
    Je présume qu'il fallait lire Dynamic Appearance
    Peut-être y a t il un défaut de compréhension du fonctionnement des tlisview et appearance ?
    de l'évènement OnItemClickEx et de ses paramètres plutôt. En faisant des tests je me suis fait avoir sur ce que signifiait ItemIndex croyant qu'il s'agissait de l'index de l'élément de la liste


    Voilà ce que je propose qui fonctionne (j'en ai profité pour jouer aussi sur la hauteur de l'élément)
    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
    procedure TForm54.ListView1ItemClickEx(const Sender: TObject;
      ItemIndex: Integer; const LocalClickPos: TPointF;
      const ItemObject: TListItemDrawable);
    var Item : TListItem;
    begin
    if SameText(ItemObject.Name,'btnDetail') then  
     begin
       ShowMessage(Sender.ClassName);
       Item:=ListView1.Selected;
       if tlistitemtextbutton(ItemObject).Text='?'  
         then begin
            tlistitemtextbutton(ItemObject).Text:='-';
            Item.View.FindDrawable('MoreData').Visible:=true;
            Item.Height:=80;
         end
         else begin
                 tlistitemtextbutton(ItemObject).Text:='?';
                 Item.View.FindDrawable('MoreData').Visible:=False;
                 Item.Height:=40;
              end;
     end;
    end;
    N.B. perso, pour ce genre de chose j'aurais utilisé une TListBox et un style personnalisé pour l'item, quelque chose comme
    Nom : Capture.PNG
Affichages : 605
Taille : 19,5 Ko

  3. #3
    Membre averti Avatar de hector94
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Bonjour,

    Je vais essayer l'utilisation de
    Item:=ListView1.Selected;
    plutôt que itemIndex

    dans d'autres situations j'utilise itemindex pour obtenir l'item cliqué ? cela ne me paraissait pas erroné ...

    je vais vérifier !

  4. #4
    Membre averti Avatar de hector94
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Une recherche dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        /// <summary>OnItemClickEx event</summary>
        /// <param name="Sender">event source</param>
        /// <param name="ItemIndex">index of item</param>
        /// <param name="LocalClickPos">click position in item local coordinates</param>
        /// <param name="ItemObject"><c>TListItemDrawable</c> that received the click</param>
        TListItemClickEventEx = procedure(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF;
          const ItemObject: TListItemDrawable) of object;
    C'est ok pour le fonctionnement de itemindex

    De plus ma listview est en AllowSelection = false dons pas de selected !

    Ce que je voudrais faire c'est déclencher l'événement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure TFrameShowOperations.lvEventsUpdateObjects(const Sender: TObject; const AItem: TListViewItem);
    C'est dans cet évement que je redimensionne le height de l'item en fonction du contenu des différents objets (Text, detail, comment, more, ... plus des images) de ItemAppearance.
    https://community.idera.com/develope...in-10-1-berlin

  5. #5
    Membre averti Avatar de hector94
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    le code fonctionne maintenant

    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 TFrameShowOperations.lbEventsItemClickEx(const Sender: TObject;
              ItemIndex: Integer; const LocalClickPos: TPointF;
              const ItemObject: TListItemDrawable);
    ...
     
          if (ItemObject.Name = 'MoreButton') then
             begin
               ItemObject.BeginUpdate;
               try
                 item := lvEvents.Items [itemindex];
                 if Item.View.FindDrawable('More') <> nil then
                    begin
                      Drawable := TListItemText(Item.View.FindDrawable('More'));
                      if not Drawable.Visible then
                         tlistitemtextbutton(ItemObject).text := _(csReadLess)
                       else
                         tlistitemtextbutton(ItemObject).text := _(csReadMore);
                  end;
               lvEventsUpdateObjects(Sender,Item);
     
               finally
                 ItemObject.EndUpdate;
               end;
    avec appel de l'événement dans le code pour redimensionner l'item et rendre visible le texte supplémentaire de l'item

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lvEventsUpdateObjects(Sender,Item);
    Il y a surement un défaut dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure TListViewBase.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
    pour passer le bon itemindex à l'événement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    procedure TFrameShowOperations.lbEventsItemClickEx(const Sender: TObject;
              ItemIndex: Integer; const LocalClickPos: TPointF;
              const ItemObject: TListItemDrawable);
    quand on clique sur un TTextButtonObjectAppearance ajouté dans un nouveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TOperationListItemAppearance = class(TPresetItemObjects)
    Un peu chinois ...

    J'ai du modifier
    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 TListViewBase.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
    ...
     
        if not (TStateFlag.ScrollingMouseTouch in FStateFlags) then
        begin
          if FMouseEventIndex <> -1 then
          begin
            Adapter[FMouseEventIndex].MouseUp(Button, Shift, TPointF.Create(X, Y));
    //modif HE
            FClickEventItemIndex := FMouseEventIndex;
    //
            FMouseEventIndex := -1;
          end
    pour recevoir le bon itemindex

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

Discussions similaires

  1. Activité avec Bouton et ListView.
    Par thiosard dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 20/09/2016, 22h38
  2. Listview avec 3 boutons
    Par jacko842 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/01/2012, 08h36
  3. ListView avec bouton
    Par ludo86 dans le forum Composants graphiques
    Réponses: 14
    Dernier message: 15/04/2010, 17h05
  4. [WPF] ListView avec colonnes et boutons
    Par Chris_LaFouine dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 30/05/2008, 16h16
  5. Nouvelle form avec bouton dans barre taches
    Par DarkChamallo dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/05/2004, 20h44

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