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 :

Remplir Une ListView DynamicAppearance par programmation


Sujet :

Composants FMX Delphi

  1. #1
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut Remplir Une ListView DynamicAppearance par programmation
    Bonjour,
    j'ai une TListView nommé ListView1
    avec le paramètre ItemAppearance en DynamicAppearance
    qui contient 4 Text nommé 'Text1', 'Text2' 'Text3' 'Text4'
    j'aimerais remplir la liste avec 2 item par programmation
    Le premier item avec
    'ListView1_Item1_Text1';
    'ListView1_Item1_Text2';
    'ListView1_Item1_Text3';
    'ListView1_Item1_Text4';
    Le deuxième avec
    'ListView1_Item2_Text1';
    'ListView1_Item2_Text2';
    'ListView1_Item2_Text3';
    'ListView1_Item2_Text4';

    Je pensais que c’était simple mais je bloque après l'ajout de l'item
    J'ai bien sur (mal) cherché sur internet et la doc mais je n'ai pas trouvé.
    Comment affecter un string a un "champ" text de la ListView?

    Voici un résumé du Code du Form
    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
     
    object Form1: TForm1
      Caption = 'Form1'
      object ListView1: TListView
        ItemAppearanceClassName = 'TDynamicAppearance'
        ItemAppearanceObjects.ItemObjects.ObjectsCollection = <
          item
            AppearanceObjectName = 'Text1'
          end
          item
            AppearanceObjectName = 'Text2'
          end
          item
            AppearanceObjectName = 'Text3'
          end
          item
            AppearanceObjectName = 'Text4'
          end>
      end
    end
    ET LE CODE ACTUEL DE L’UNITÉ
    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
     
    unit Unit1;
    interface
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes,
      System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
      FMX.ListView;
    type
      TForm1 = class(TForm)
        ListView1: TListView;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.fmx}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to 1 do
      begin
        ListView1.Items.Add();
        //et là je bloque
        // ListView1.Item.Text1 := 'ListView1_Item1_Text1';
        // ListView1.Item.Text2 := 'ListView1_Item1_Text2';
        // ListView1.Item.Text3 := 'ListView1_Item1_Text3';
        // ListView1.Item.Text4 := 'ListView1_Item1_Text4';
      end;
    end;
    end.
    Merci d'avance de votre aide.

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut Une réponse possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      with ListView1.items.Add do Text := 'a' ;

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    N'est-ce pas dans la documentation : FMX.ListView.TListView ?

    Exemple
    Vous pouvez ajouter des éléments à TListView par la liaison à une source de données ou par code (TListView.Items.Add).

    Voici un exemple de code montrant comment ajouter des éléments à une TListView :

    Delphi :

    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
    var
      LItem: TListViewItem;
      I: Integer;
    begin
      for I := 1 to 10 do
      begin
        LItem := ListView1.Items.Add;
        LItem.Text := IntToStr(I); 
     end;
    end;
     
    // To achieve the best performance use BeginUpdate and EndUpdate.
     
    var
      LItem: TListViewItem;
      I: Integer;
    begin
      ListView1.BeginUpdate;
      try
        for I := 1 to 10 do
        begin
          LItem := ListView1.Items.Add;
          LItem.Text := IntToStr(I);
        end;
      finally
        ListView1.EndUpdate;
      end;
    end;


    C'est un bon début pour avoir des Items mais vous semblez vous ajouter des colonnes ?
    Il faut donc créer manuellement des TTextObjectAppearance et voir comment jouer avec TListViewItem.Objects.AccessoryObject
    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

  4. #4
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut
    Merci ALWEBER et ShaiLeTrol
    ShaiLeTroll c'est la seule page d'exemple que j'avais trouvé avant de poster ma question.
    Je dois être idiot, car je n'ai pas réussi à l'adapter à mon cas.
    dois-je mettre 4 LItem.Text := ' ';?
    dois-je faire LItem.Text[J] := ' '; où J est un entier de 0 à 3?
    dois-t-on faire un fieldbyname ?
    J'avoue que je suis perdu.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Voir le tutoriel FMX : TListView, apparence dynamique et image

    Si tu as déjà défini Text1 à Text4 en ajoutant les TTextObjectAppearance a ton TListView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      LItem: TListViewItem;
    begin 
       LItem := ListView1.Items.Add; 
       LItem.Objects.FindObjectT<TListItemText>('Text1').Text := 'Text1';
       LItem.Objects.FindObjectT<TListItemText>('Text2').Text := 'Text2';
       LItem.Objects.FindObjectT<TListItemText>('Text3').Text := 'Text3';
       LItem.Objects.FindObjectT<TListItemText>('Text4').Text := 'Text4';   
    end;
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      LItem: TListViewItem;
    begin 
       LItem := ListView1.Items.Add; 
       Listview1.Items.AppearanceItem[LItem.Index].Data['Text1'] := 'Text1';
       Listview1.Items.AppearanceItem[LItem.Index].Data['Text2'] := 'Text2';
       Listview1.Items.AppearanceItem[LItem.Index].Data['Text3'] := 'Text3';
       Listview1.Items.AppearanceItem[LItem.Index].Data['Text4'] := 'Text4';  
    end;
    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
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut Toujours pas
    Voici ce que j'ai essayé sur la community 10.3.3
    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 TForm1.FormCreate(Sender: TObject);
    var
      i: integer;
      LItem: TListViewItem;
      AListItemText : TListItemText;
    begin
      for i := 0 to 1 do
      begin
        ListView1.Items.Add();
        // ListView1.Item1.Text1
        AListItemText:=LItem.Objects.FindObjectT<TListItemText>('Text1');
        AListItemText.Text := 'ListView1_Item1_Text1';
        // ListView1.Item1.Text2
        AListItemText:=LItem.Objects.FindObjectT<TListItemText>('Text2');
        AListItemText.Text := 'ListView1_Item1_Text2';
        //ListView1.Item1.Text3
        AListItemText:=LItem.Objects.FindObjectT<TListItemText>('Text3');
        AListItemText.Text := 'ListView1_Item1_Text3';
        // ListView1.Item1.Text4
        AListItemText:=LItem.Objects.FindObjectT<TListItemText>('Text4');
        AListItemText.Text := 'ListView1_Item1_Text4';
      end;
    end;
    Cela me provoque une Erreur sur Windows 10
    L'instruction 0x0000000000098911 emploie l'adresse mémoire 0x0000000044200000.
    L'état de la mémoire ne peut pas être read.

    En plus le tutoriel indique que FindObjectT est Obsolète.
    Donc merci de me mettre sur la bonne voie.

  7. #7
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut Ca y est
    Merci ShaiLeTroll
    Ta réponse c’était croisé avec la mienne
    Comment tu as trouvé [LItem.Index].Data['Text1'] ?

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par popoy Voir le message
    En plus le tutoriel indique que FindObjectT est Obsolète.
    Mal lu, j'indique que FindObject est obsolète et doit être remplacée par FindDrawable ou FindObjectT<T>

    Je suis moins "chaud" pour l'utilisation de AppearanceItem[LItem.Index].Data['Text1'] car cela ne peut s'appliquer qu'à des objets text et uniquement sur la propriété text.
    Il y a aussi d'autres contre indications pour cette utilisation, mais je n'en ai plus une souvenance exacte, il faudrait en retrouver la trace dans mes divers posts (section FMX) ou billets blog.

    C'est un chapitre , ou, pour être plus exact un futur chapitre d'un fasicule, en cours de rédaction, que je suis en train d'écrire sur les styles. De même qu'il y en a un de prévu sur les Listes (listbox/listview). Pour tout écrire, je pensais utiliser une heure ou deux par jour durant mes vacances, l'oubli de mon transfo et une connexion internet faible m'ont fait rennoncer
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Citation Envoyé par popoy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ListView1.Items.Add();
        // ListView1.Item1.Text1
        AListItemText:=LItem.Objects.FindObjectT<TListItemText>('Text1');
        ...
    Cela me provoque une Erreur sur Windows 10
    L'instruction 0x0000000000098911 emploie l'adresse mémoire 0x0000000044200000.
    L'état de la mémoire ne peut pas être read.
    Normal, faut récupérer le résultat du Add
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LItem := ListView1.Items.Add();
    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

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Citation Envoyé par popoy Voir le message
    Comment tu as trouvé [LItem.Index].Data['Text1'] ?
    Même ça doit aussi pour être écrit comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      LItem: TListViewItem;
    begin 
       LItem := ListView1.Items.Add; 
       LItem.Data['Text1'] := 'Text1';
       LItem.Data['Text2'] := 'Text2';
       LItem.Data['Text3'] := 'Text3';
       LItem.Data['Text4'] := 'Text4';  
    end;
    En fait, j'ai cherché des property tableau qui contiennent des TListViewItem c'est comme ça que je suis tombé sur AppearanceItem
    C'est totalement théorique, juste en naviguant d'objet en objet dans la documentation.


    Ensuite, j'ai trouvé le tutoriel de Sergio donc j'ai supposé que FindObjectT étant plus propre puisque l'on travaille sur les objets qui me semblait plus simple qu'un TValue des RTTI pouvant être plus musclé dans l'utilisation.
    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

  11. #11
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut
    Grand merci pour les explications.
    Je débute sur Delphi
    Et autant le livebinding est simple autant on s'aperçoit de la complexité du code.
    Mais il n'est pas toujours possible d'utiliser le livebinding.

  12. #12
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut
    J'ai voulu modifier le text par un bouton text
    ca ne fonctionne plus.
    Bien sur j'ai essayé de modifier le code en conséquence
    Merci de me fournir svp les autres cas possible
    voici le code fmx de la listview
    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
    object ListView1: TListView
        ItemAppearanceClassName = 'TDynamicAppearance'
        ItemEditAppearanceClassName = 'TDynamicAppearance'
        HeaderAppearanceClassName = 'TListHeaderObjects'
        FooterAppearanceClassName = 'TListHeaderObjects'
        Position.X = 24.000000000000000000
        Position.Y = 16.000000000000000000
        Size.Width = 209.000000000000000000
        Size.Height = 257.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 1
        ItemAppearanceObjects.ItemObjects.ObjectsCollection = <
          item
            AppearanceObjectName = 'TextButton2'
            AppearanceClassName = 'TTextButtonObjectAppearance'
            Appearance.Font.StyleExt = {00070000000000000004000000}
            Appearance.TextColor = claBlack
            Appearance.TintColor = claBlack
            Appearance.PressedTextColor = claBlack
            Appearance.TextShadowColor = claBlack
            Appearance.Text = 'POOO'
          end>
        ItemAppearanceObjects.ItemEditObjects.ObjectsCollection = <
          item
            AppearanceObjectName = 'Text1'
            AppearanceClassName = 'TTextObjectAppearance'
          end>
      end
    je veut remplacé Appearance.Text = 'POOO' par un autre text
    J'ai vraiment du mal a comprendre les listview
    Voici le code qui ne fonctionne pas
    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
    procedure TForm1.FormCreate(Sender: TObject);
    var
      LItem: TListViewItem;
    begin
      // execution de la requete
      FDQuery1.Active := True;
      // ShowMessage('Records found = ' + FDQuery1.RecordCount.ToString);
      // efface la liste
      ListView1.Items.Clear;
      // se mettre au début de la requête
      FDQuery1.first;
      // tant que pas fin alors
      while not FDQuery1.Eof do
      begin
        // ajoute un item a la liste
        LItem := ListView1.Items.Add;
        // ListView1.Item
        // showmessage(FDQuery1.FieldByName('Element').AsString);
        // LItem.Objects.FindObjectT<TListItemTextButton>('TextButton2').Text :=
        // LItem.Objects.FindObjectT<TTextButtonObjectAppearance>('TextButton2').Text :=
        LItem.Objects.FindObjectT<TListItemText>('TextButton2').Text :=
          FDQuery1.FieldByName('Element').AsString;
        // passe a l'enregistrement suivant
        FDQuery1.Next;
      end;

  13. #13
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Quand je vois que le code implique une requête je me dis qu'il est anormal de ne pas utiliser les livebindings (surtout pour un TlistView )
    maintenant, puisqu'il s'agit du libellé d'un TButtonObject j'ai un doute, il va falloir que je fasse un petit test avant de me prononcer.

    [Edit] Petit test effectué et qui me conforte dans mes positions Livebindings => no code

    Nom : Capture.PNG
Affichages : 858
Taille : 36,6 Ko

    de fait un TTextButtonObjectAppearance est de type TListItemTextButton donc le lien se fait sur la propriété text du bouton facilement.

    donc déjà dans le code indiqué il y a un pb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        LItem.Objects.FindObjectT<TListItemText>('TextButton2').Text :=
          FDQuery1.FieldByName('Element').AsString;
    sans tester j'aurais écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     LItem.Objects.FindObjectT<TListItemTextButton>('TextButton2') :=
          FDQuery1.FieldByName('Element').asString;

    Ok, dans mon test j'ai utilisé un TProtypeBindSource mais il en aurait été de même avec un TQuery en voilà un exemple, toujours sans code si l'on excepte deux customformats (SubString(%s, 0, 1))
    Nom : Capture_1.PNG
Affichages : 847
Taille : 16,8 Ko
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut
    D'accord pour le livebinding et il est vrai que c'est simple.
    Mais je cherche à comprendre le codage Pascal avec Delphi.
    J'ai déjà essayé le code que tu proposes
    Il est d'ailleurs en commentaire
    Mais ça fonctionne pas.
    Merci quand même mais j'aimerais comprendre le remplissage des listeview par programmation
    Quel que soit l'élément (image, bouton, texte, texte bouton etc)
    De plus, j'ai mis la requête pour me simplifier le test, mais ce ne sera pas toujours le cas
    Après les listeview, je pense m'attaquer au TGrid

  15. #15
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par popoy Voir le message
    Mais ça fonctionne pas.
    ...
    Quel que soit l'élément (image, bouton, texte, texte bouton etc)
    si cela ne fonctionne pas c'est parce qu'il y manque quelque chose d'important : le dessin du TListView

    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 TForm127.btnFillClick(Sender: TObject);
    var
      LItem: TListViewItem;
    begin
       ListView1.BeginUpdate;
       while not FDQuery1.EOF do
       begin
       LItem := ListView1.Items.Add;
       LItem.Objects.FindObjectT<TListItemText>('Libelle').Text := fdQuery1.FieldByName('LIBELLE_APPOSE').asString;
       LItem.Objects.FindObjectT<TListItemTextButton>('Button').text := fdQuery1.FieldByName('CODE_APPOSE').asString;
       fdQuery1.Next;
       end;
       ListView1.EndUpdate;
    end;
    Nom : Capture.PNG
Affichages : 840
Taille : 27,3 Ko

    Bien sûr dans ce code, je n'ai pas codé la partie ItemHeader, mais ce n'est pas excessivement compliqué à écrire, la preuve en image
    Nom : Capture_1.PNG
Affichages : 826
Taille : 10,7 Ko

    j'aimerais comprendre le remplissage des listeview par programmation
    par programmation, sans livebindings, j'aurais tendance à écrire qu'il faiut mieux utiliser un TListBox et un style, d'ailleurs j'ai écrit un tutoriel en ce sens. Au début des versions XE TListView n'existait pas et même ainsi, l'apparence dynamique n'est venu qu'en second lieu

    De plus, j'ai mis la requête pour me simplifier le test, mais ce ne sera pas toujours le cas
    ça a brouillé mes cartes plus qu'autres choses

    Après les listeview, je pense m'attaquer au TGrid
    Là encore j'ai écrit pas mal de choses que ce soit dans mon blog ou en tutoriel cependant, toujours en utilisant les Livebindings car je n'ai jamais vu l'intérêt de remplir "à la main" une grille à partir d'un ensemble de données. Je ne doute pas que cela soit faisable mais :
    1- dans mes nouvelles applications pros je n'utilise quasiment plus les grilles
    2- je suis mitigé quant à l'association grille/concepteur de liaison (je lui préfére la méthode décrite dans le tuto cité)
    3- je n'ai pas une idée claire d'un test de remplissage et synchronisation par programmation (AMHA sujet à erreurs)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut Rien ne change
    Après ce 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
    procedure TForm2.FormCreate(Sender: TObject);
    var
      LItem: TListViewItem;
    begin
      // execution de la requete
      FDQuery1.Active := True;
      ShowMessage('Records found = ' + FDQuery1.RecordCount.ToString);
      // efface la liste
      ListView1.Items.Clear;
      // se mettre au début de la requête
      FDQuery1.first;
      ListView1.BeginUpdate;
      // tant que pas fin alors
      while not FDQuery1.Eof do
      begin
        // ajoute un item a la liste
      LItem := ListView1.Items.Add;
      ShowMessage(FDQuery1.FieldByName('Element').AsString);
      LItem.Objects.FindObjectT<TListItemTextButton>('TextButton2').Text :=
      FDQuery1.FieldByName('Element').AsString;
        // passe a l'enregistrement suivant
      FDQuery1.Next;
      end;
      ListView1.EndUpdate;
    end;
    J'obtient cela
    Nom : Capture.PNG
Affichages : 832
Taille : 2,6 Ko

  17. #17
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Alors là, je ne vois pas.
    Mon code fonctionne donc cela vient du vôtre.


    Vous remarquerez que mon code de remplissage est séparé du onCreate, j'ai donc testé s'il n'y avait pas ici une cause et, il semblerait que oui !

    Nom : Capture.PNG
Affichages : 817
Taille : 10,2 Ko

    du coup je me suis dit qu'il y avait un problème de style non appliqué au niveau du onCreate
    j'ai donc ajouté (avant le ListView1.BeginScene dans le onCreate) ListView1.ApplyStyleLookup;
    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
    procedure TForm127.FormCreate(Sender: TObject);
    var
      LItem: TListViewItem;
      H : String;
    begin
       fdQuery1.Active:=True;
       ListView1.ApplyStyleLookup;
       FDQuery1.First;
       while not FDQuery1.EOF do
       begin
       if copy(fdQuery1.FieldByName('CODE_APPOSE').asString,0,1)<>H then
        begin
          H:=copy(fdQuery1.FieldByName('CODE_APPOSE').asString,0,1);
          LItem := ListView1.Items.Add;
          LItem.Purpose:=TListItemPurpose.Header;
          LItem.Text :=H;
        end;
       LItem := ListView1.Items.Add;
       LItem.Objects.FindObjectT<TListItemText>('Libelle').Text := fdQuery1.FieldByName('LIBELLE_APPOSE').asString;
       LItem.Objects.FindObjectT<TListItemTextButton>('Button').text := fdQuery1.FieldByName('CODE_APPOSE').asString;
       fdQuery1.Next;
       end;
    end;
    et j'ai obtenu le résulta escompté.



    Enfin, en puriste, si vous effacez la liste (ListView1.Items.Clear) autant que ce soit dans le BeginUpdate/EndUpdate
    Si c'est fait dans le onCreate vous remarquerez que dans mon dernier code je me suis permis de les oublier (en effet la liste est vide et l'affichage se fait après)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  18. #18
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut
    Merci Sergio,
    c’était bien ça.
    du coup j'ai encore 3 questions.
    J'avais mis mon code sur le oncreate du form car je n'ai pas compris quel était l’événement d’initialisation du composant Listview.
    Donc quel est le nom de cet événement?
    Existe t'il une page web qui recense l'ordre d’exécution des événements pour chaque composant?
    Et enfin, le problème de style non appliqué existe t'il sur l’événement d'initialisation de listview?
    Merci Encore

  19. #19
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par popoy Voir le message
    Merci Sergio
    un petit pour marquer la pertinence de la solution aidera les autres lecteurs

    Citation Envoyé par popoy Voir le message
    J'avais mis mon code sur le oncreate du form car je n'ai pas compris quel était l’événement d’initialisation du composant Listview.
    Donc quel est le nom de cet événement?
    je ne comprends pas trop la question
    Citation Envoyé par popoy Voir le message
    Existe t'il une page web qui recense l'ordre d’exécution des événements pour chaque composant?
    je n'en suis pas sûr (et, a vrai dire n'ai jamais cherché), généralement quand je me pose cette question je passe d'abord par une lecture de l'unité du composant puis, si besoin par un debug . Bien sûr il faut avoir les sources
    Citation Envoyé par popoy Voir le message
    Et enfin, le problème de style non appliqué existe t'il sur l’événement d'initialisation de listview?
    ce n'est le cas, me semble t-il que pour l'apparence dynamique, un bogue non signalé ? Possible, il faut dire qu'un remplissage par code d'un TListView dans l'évènement OnCreate c'est quand même pas courant. Avant d'en faire un retour dans le Quality Control il faudrait faire plus de tests
    1- ajouter tous les types d'itemobject
    2- vérifier ceux qui ne sont pas pris en compte (on a au moins le TextButtonObject) [Edit] c'est égalment le cas pour TAccessoryObject
    3- regarder l'unité spécifique pour dégager l'endroit de "l'oubli" (n'oublions pas que pour les textes cela fonctionne)


    N.B. un petit détail mais à bien prendre en compte, comme dans le code proposé l'existance de l'objet n'est pas vraiment faite, attention, le nom de l'objet est sensible à la casse
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  20. #20
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 370
    Points : 622
    Points
    622
    Billets dans le blog
    1
    Par défaut
    Salut,
    Le oncrate de la form, c'est le code d'initialisation de la form (enfin je crois).
    C'est l'événement qui remplit la fiche.
    Je cherche donc l'équivalent pour la listeview.
    Donc le premier événement de la listeview si on peut dire ainsi.
    Je ne connais pas les termes utilisés pour Delphi.

Discussions similaires

  1. [WD14] remplir une Table Fichier par programmation
    Par burndev dans le forum WinDev
    Réponses: 3
    Dernier message: 14/08/2009, 18h16
  2. onchange d'une zone remplie par programmation
    Par japz dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/05/2006, 14h58
  3. [Interbase]Comment créer une source ODBC par programme ?
    Par touhami dans le forum Bases de données
    Réponses: 1
    Dernier message: 13/03/2006, 17h40
  4. [VBA-Excel]Problème pour remplir une listview
    Par Le Djé dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/01/2006, 17h27
  5. Remplir une ListView avec une BD
    Par manikou dans le forum MFC
    Réponses: 1
    Dernier message: 17/05/2005, 10h48

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