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

Delphi Discussion :

[TListView] Ajout d'un nouvel élément avec ListView.items.addItem


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut [TListView] Ajout d'un nouvel élément avec ListView.items.addItem
    Bonjour,

    j'ai un TListview en mode Icon dans lequel je veux ajouter un nouvel élément,
    seulement j'observe des comportements que je ne comprends pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //CAS1
    var
      item:TListItem;
    begin
      item:=Listview.items.add;
      item.Caption:='Test';
    end;
    Dans ce cas-ci, RAS l'élément est bien ajouté au Listview et le libellé 'Test' apparaît bien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //CAS2
    var
      item:TListItem;
    begin
      item:=TListItem.Create(ListView.Items);
      item.Caption:='Test';
      item.subitems.add('sub1');
      ListView.items.addItem(item);
    end;
    Dans ce cas-ci l'élément et son sous élément 'sub1', sont bien ajouté au Listview mais le libellé 'Test' n'apparaît pas, est-ce normal ?


    Si je pousse un peu plus loin en ajoutant un gestionnaire CustomDrawItem que je debuggue, je m'aperçois que dans le CAS2 :
    - Item.caption n'est pas vide , malgré qu'il ne soit pas affiché
    - Item.caption peut être remplacé par une nouvelle valeur qui là s'affichera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TfrmMain.listviewCustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      str:string;
    begin
      //un test en debug m'indique bien que Item.caption est initialisé à 'Test' 
      //comme prévu pourtant le libellé ne s'affiche pas.
      //si j'affecte à Item.caption une autre valeur que 'Test' alors 
     //celle-ci s'affiche (?)
      item.Caption:='valeur';
    end;

    Vous y comprenez quelque chose ?

    Etes-vous déjà arrivé à insérer un nouvel élément comme dans le cas 2 mais en ayant l'affichage du libellé de l'élément ?
    Mobile first !
    Développeur & co-fondateur de appSoluce ! - développement de solutions mobiles cross-platform

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 823
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 823
    Points : 15 244
    Points
    15 244
    Par défaut
    Salut !

    Perso, j'utilise ça avec bonheur (lvwl m'affiche les différentes fenêtres d'un process, wl est la liste de ces fenêtres (GetWindowList))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      ...
      lvwl.Items.BeginUpdate;
      for i := 0 to high(wl) do begin
        items := Lvwl.Items.Add;
        Items.Caption := inttostr(wl[i].window);
        Items.SubItems.Add (inttostr(wl[i].parent));
        Items.SubItems.Add (inttostr(wl[i].owner));
        if wl[i].visible   then Items.SubItems.Add ('Yes') else Items.SubItems.Add ('No');
        if wl[i].enabled   then Items.SubItems.Add ('Yes') else Items.SubItems.Add ('No');
        if wl[i].inTaskbar then Items.SubItems.Add ('Yes') else Items.SubItems.Add ('No');
        Items.SubItems.Add (wl[i].title);
        Items.SubItems.Add (wl[i].className);
      end;
      lvwl.Items.EndUpdate;
    HTH,
    JP
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    Merci Jipété mais ma question n'est pas comment inséré un nouvel item dans un Listview mais si quelqu'un a déjà inséré dans un Listview avec cette méthode ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //CAS2
    var
      item:TListItem;
    begin
      item:=TListItem.Create(ListView.Items);
      item.Caption:='Test';
      item.subitems.add('sub1');
      ListView.items.addItem(item);
    end;
    Mobile first !
    Développeur & co-fondateur de appSoluce ! - développement de solutions mobiles cross-platform

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 823
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 823
    Points : 15 244
    Points
    15 244
    Par défaut
    Oups, j'ai lu trop vite (fait trop chaud......)

    Bon, alors je sais pas...

    Desoled,
    JP
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Je n'ai pas entendu que des compliments sur les composant TListView (existence de bug), ce composant est un habillage d'un composant de Windows, donc la VCL n'est peut-être pas en cause. Il faut ruser si un problème se présente.
    Je l'utilise dans le cadre de mon travail.

    Je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //CAS1
    begin
      with Listview.items.add do
      begin
        Caption:='Test';
        SubItems.Add('sub1');
      end;
      Listview.Update; // facultatif
    Ce n'est pas la structure que tu cherches mais cela devrait fonctionner.

    PS: Dans le même ordre d'idée, méfie-toi de ListView.Items.Clear et ListView.Clear; ces méthodes ne fonctionnent pas rigoureusement de la même façon.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 823
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 823
    Points : 15 244
    Points
    15 244
    Par défaut Demande de précision
    'Soir !

    Je me permets de faire remonter ce fil car j'aimerais une précision sur cette phrase :
    PS: Dans le même ordre d'idée, méfie-toi de ListView.Items.Clear et ListView.Clear; ces méthodes ne fonctionnent pas rigoureusement de la même façon.
    Qu'en est-il exactement ? Problème de performances ? De fuite mémoire ? De ... ?

    Car je n'ai pas vu de différences en jouant avec ça :
    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
    // 1 Listview (name : LV) avec 3 colonnes en mode vsReport
    // et 3 boutons (btn_Fill, btn_Clear_LV, btn_Clear_Items
     
    procedure TForm1.btn_FillClick(Sender: TObject);
    var
      i : integer;
      items : TListItem;
    begin
      lv.Items.BeginUpdate;
      for i := 0 to 5 do begin
        Items := lv.Items.Add;
        Items.Caption := IntToStr(i);
        Items.SubItems.Add (IntToStr(i));
        Items.SubItems.Add (IntToStr(i));
      end;
      lv.Items.EndUpdate;
    end;
     
    procedure TForm1.btn_Clear_LVClick(Sender: TObject);
    begin
      lv.Clear;
    end;
     
    procedure TForm1.btn_Clear_ItemsClick(Sender: TObject);
    begin
      lv.Items.Clear;
    end;
    Merci pour toute précision,
    JP
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

Discussions similaires

  1. ajout d'un nouvel élément dans une collection
    Par sasuma dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/05/2008, 18h15
  2. Ajouter un élément avec 2 listes VB6
    Par alighieri dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 17/04/2008, 16h05
  3. [Oracle] erreur quand je veux ajouter un nouvel élément
    Par sarahG dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/04/2008, 16h48
  4. Réponses: 3
    Dernier message: 18/11/2007, 14h42
  5. Macro pour ajouter un nouvel élément dans un tableau
    Par dudu134 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/02/2007, 16h31

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