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

Lazarus Pascal Discussion :

Comportement différent entre ListBox et CheckListBox [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut Comportement différent entre ListBox et CheckListBox
    Re-Bonjour,

    je remplis une ListBox et une CheckListBox avec les mêmes valeurs (parce que je suis en test et que j'envisage, à terme, de remplacer la première par la seconde), le seul événement mis en service à l'heure actuelle c'est le OnSelectionChange, il contient exactement la même instruction pour les deux composants (à part son nom) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMainForm.lb1SelectionChange(Sender: TObject; User: boolean); // la listbox
    begin
      caption := lb1.Items[lb1.ItemIndex];
    end;
     
    procedure TMainForm.clbFilesSelectionChange(Sender: TObject; User: boolean); // la checklistbox
    begin
      caption := clbFiles.Items[clbFiles.ItemIndex];
    end;
    et pourtant et c'est pour ça que je poste, leur comportement est différent : la ListBox réagit bien au clic ou aux flèches vers le bas/vers le haut, la CheckListBox ne réagit à rien...

    Bon, ok, il a fallu que j'applique le patch dont il est question ici, mais juste rajouter une ligne et faire recréer l'EDI, c'est pas la mer à boire, hein.

    Vous voulez tester ?
    Rien de plus simple : posez une TListBox (onglet standard) et une TCheckListBox (onglet Additional -- trop compliqué de les mettre côte à côte ? -- il a fallu que je google pour découvrir qu'elle existait) sur une fiche, il faut les remplir un peu comme montré dessous et activer l'événement OnSelectionChange comme montré plus haut et c'est tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMainForm.FormCreate(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to 10 do begin
        lb1.AddItem(inttostr(i),nil);
        clbFiles.AddItem(inttostr(i),nil);
      end;
    end;
    Ensuite vous cliquez ou vous jouez avec les flèches, et vous vous demandez "Pourquoi ? Mais mon Dieu pourquoi ? Pourquoi tant de haine et d'épreuves et de souffrance ?"

    À moins que ça ne soit corrigé avec la toute dernière version de Lazarus ? C'est sûr que le patch n'est pas bien vieux (fin juillet 2016), alors merci de me dire, parce qu'avec la 1.6.2 le canard est toujours vivant...
    PS : le n° indiqué, r52754 je ne l'ai pas trouvé dans les pages listant les fixes, ni concernant les 1.6.x, ni la nouvelle 1.8.rcX...
    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

  2. #2
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : février 2014
    Messages : 429
    Points : 1 882
    Points
    1 882
    Par défaut
    Salut JP.

    Dans la version 1.6.4 : dans un checklistbox, l'événement OnSelectionChange n'est pas publié.
    Mais il est public, donc en l'assignant par code, il réagit bien.

    Amicalement
    Thierry

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    septembre 2003
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2003
    Messages : 710
    Points : 1 575
    Points
    1 575
    Billets dans le blog
    7
    Par défaut
    Je viens de faire le test avec la dernière version (Lazarus 1.8.0RC1 r54912 FPC 3.0.2 i386-win32-win32/win64)
    Le problème que vous décrivez ne se produit pas (ou ne se produit plus !). La TListBox et TCheckListBox réagissent normalement.

    NB : l'Evènement OnSelectionChange est publié (visible et accessible dans l'inspecteur objets, onglet Evènement), et ce, pour les 2 classes TListBox et TCheckListBox

    Nom : 2017-06-01_15-15-58.png
Affichages : 133
Taille : 13,4 Ko
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Merci de vos retours.

    Ce que tu dis, Thierry, ne me rassure pas du tout quant à la qualité de l'environnement Lazarus, puisqu'à priori le patch a donc été mis en place mais ce n'est pas documenté.
    Et moi je me fie aux release notes pour savoir quand la Listview sera terminée : chuis mal barré...

    De toute façon, quand on ouvre un fichier issu de la 1.4.0 et le même issu de la 1.6.4, je vous laisse deviner qui est où (à gauche c'est dans Geany, d'où la différence de hauteur) :
    Nom : stdctrls.pp.png
Affichages : 136
Taille : 79,0 Ko

    Une piste ? L'un des deux a une trentaine de lignes en plus...

    Si c'est pas du foutage de gueule, en termes de suivi, de versioning, etc.

    Bon, merci pour les retours, je ne sais pas encore comment je vais gérer ça (la ListView a d'autres problèmes qui font qu'elle est inemployable là).
    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
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 624
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Bon,

    j'avais dit, une fois ou deux, que Linux était le parent pauvre de Lazarus.
    Ce soir je le confirme, et même je précise que gtk est le plus pauvre des pauvres parents...

    Démonstration :
    j'ai récupéré les sources de la 1.6.4 et de la 1.8.rc1, je suis allé dans le dossier lcl et j'ai appelé un petit script qui me cherche dans les fichiers .pas, .pp, .inc la string que je lui passe, et donc j'ai exécuté, dans un terminal, findinfiles OnSelectionChange et ça m'a sorti ça pour la 1.6.4 (je ne mets pas tout, ça concerne aussi d'autres composants) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # findinfiles OnSelectionChange
    stdctrls.pp:    FOnSelectionChange: TSelectionChangeEvent;
    stdctrls.pp:    property OnSelectionChange: TSelectionChangeEvent read FOnSelectionChange write FOnSelectionChange;
    interfaces/win32/win32wsdialogs.pp:    function OnSelectionChange(pfd: IFileDialog): HResult; stdcall;
    interfaces/qt/qtwidgets.pas:  // OnSelectionChange event (listbox)
    et une ligne de plus pour la 1.8.rc1 :
    interfaces/qt5/qtwidgets.pas: // OnSelectionChange event (listbox).

    Voilà.
    Et moi je suis avec gtk. Vous voyez du gtk quelque part, vous ?

    Par contre, le coup de mettre le patch dans la 1.6.0 sous XP et de recompiler l'EDI --> ça fonctionne très bien.

    Mais moi sous Linux, il ne me reste plus que mes yeux pour pleurer.
    Ou changer de machine et installer une distro avec qt. Je vais y songer intensément...

    Je coche à contre-cœur, vraiment. Et je ne suis pas prêt d'installer la 1.8 quand elle sortira, désolé, Gilles.
    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Salut,

    je poste ici car, même si ce n'est pas le même compo, c'est pour le même projet, alors bon.

    Quand je dis que la ListView sous Linux n'est pas finie, je ne rêve pas.
    N'est pas finie tout court, je viens de tester sous XP, j'ai le même comportement loufoque.

    Démonstration avec cette magnifique erreur qui n'a pas lieu d'être :

    Nom : bug_lv.png
Affichages : 183
Taille : 115,9 Ko

    En haut à gauche une ListBox contenant des dossiers qui contiennent des fichiers image ; pour le moment, seul le premier en contient, les 2 autres sont vides.
    Au changement de dossier c'est la proc sur la copie d'écran qui est appelée, en gros on recharge une TStringList avec les fichiers présents dans le dossier sélectionné, on remet la ListView à zéro et on la remplit avec la nouvelle liste.

    Et ce que vous voyez dans la ListView en bas à gauche c'est ce qui reste après Items.Clear et Clear ! Si je comprends bien l'image, ce qui est au-dessus de la ligne sélectionnée (par moi avant de changer de dossier en haut) n'a pas été effacé : c'est quand même dément, quoi...
    (et notez au passage le magnifique tri alphabétique que j'ai demandé dans l'inspecteur d'objets )

    Le même principe avec une CheckListBox fonctionne très bien, donc mon algo est correct, le seul souci c'est la CheckListBox qui ne fonctionne pas sous Linux avec OnSelectionChange.
    Et ça c'est catastrophique
    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

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 934
    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 : 2 934
    Points : 4 816
    Points
    4 816
    Par défaut
    salut

    Le trie ne se fait pas a l'insertion des données
    appel la methode Alphasort(true) pour declencher le trie

    pour effacer c'est un peut différent d'une liste
    puisque tu créer des objets a chaque items
    Assure toi que tu n'as rien dans les data

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TMaForm.ClearListView;
    Var
      i : integer;
    Begin
      for i := 0 to lvFiles.Items.Count-1 do
        TObject(llvFiles.Items[i].Data).Free;
      lvFiles.Items.Clear;
    End;
    le n'est pas recommendé ici

    PS en ce qui concerne le GTK3 il y a des éléments intéressant sur le wiki
    http://wiki.freepascal.org/gir2pascal
    http://wiki.freepascal.org/Gtk%2B3
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Citation Envoyé par anapurna Voir le message
    appelle la méthode Alphasort(true) pour déclencher le tri
    Ah oui, tu t'es basé sur la copie d'écran avec la ListView, mais cette saleté a fini à la poubelle, et la ListBox supporte le tri demandé dans l'inspecteur d'objets, tout va bien de ce côté-là, ouf !

    Citation Envoyé par anapurna Voir le message
    puisque tu crées des objets a chaque items
    Mais pas du tout ! Je me contente de mettre des strings dans la propriété Caption du ListItem et c'est tout.

    Citation Envoyé par anapurna Voir le message
    le n'est pas recommendé ici
    Oui mais ça, c'est quand on (je !) essaye tout et n'importe quoi à partir du moment où le code sensé fonctionner ne fonctionne pas, ou très mal.

    Citation Envoyé par anapurna Voir le message
    PS en ce qui concerne le GTK3 il y a des éléments intéressant sur le wiki
    Merci pour le tuyau, mais si le TCheckListBox n'est pas supporté par GTKx, ça ne me sert à rien.


    De mon côté, j'ai migré un EDI dans une machine virtuelle Debian de Gtk2 à Qt4.5 et le problème qui fait que je ne vais même pas étudier le reste, c'est que dans mon projet actuel, le zoom sur l'image affichée (un Canvas, un Timer, du basique) me fait un flickering dément à raison d'une image noire 1/4 de seconde et le morceau zoomé visible 1/4 de seconde, et ça recommence.
    Totalement inexploitable,

    Et puis, cette méthode sympathique OnSelectionChange non disponible pour moi, je l'ai réinventée avec un compteur global et la gestion du OnClick. De la sale bidouille diront certains, mais au moins ça fonctionne !
    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

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 934
    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 : 2 934
    Points : 4 816
    Points
    4 816
    Par défaut
    salut,

    comme ça il est difficile de répondre, je développe plus pour Windows qu'autre chose
    je sais qu'une chose j’évite d'utiliser les timer pour l'affichage je préfère cent fois utiliser les événements
    qui déclenche une action exemple un onclick , oncheck ... au moins tu maîtrise ton affichage

    va peut être falloir qu'un jour je m'attaque a linux ...
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Bonsoir,

    je remonte ce vieux truc juste pour dire que je n'ai pas trouvé l'option concernant les ScrollBars de la CheckListBox dans l'inspecteur d'objets.
    Alors à l'exécution la ScrollBar verticale s'affiche automatiquement si nécessaire, mais la horizontale point nenni.
    Et je n'ai rien trouvé dans le code de la 1.8rc1 concernant cette option.

    Le plus rigolo, c'est quand on consulte la roadmap : elle est "working", la TCheckListBox...

    Après l'affaire du bug concernant OnSelectionChange corrigé en 2009 mais vraiment corrigé en 2017, ça la fout mal, je trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fixes for 1.8 RC2 (merged)
    r54697 Gtk2: fixed triggering selection change in TCheckListBox. Issue #0031697
    Fixes for 1.8 RC1 (merged)
    r54696 Qt, Qt5: fixed triggering of selection change in TCheckListBox. Issue #0031697

    Nom : roadmap_checklistbox.png
Affichages : 101
Taille : 22,2 Ko
    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

  11. #11
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    juin 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : juin 2012
    Messages : 1 036
    Points : 2 021
    Points
    2 021
    Par défaut
    je remonte ce vieux truc juste pour dire que je n'ai pas trouvé l'option concernant les ScrollBars de la CheckListBox dans l'inspecteur d'objets.
    Il n'y en a pas. Mais cette vielle astuce ( 2011 ) pour delphi fonctionne toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormShow(Sender: TObject);
    begin
      CheckListBox1.ScrollWidth:=400;
      CheckListBox1.ClientWidth:=150; // Doit toujours être plus petit que ScrollWidth pour avoir la barre.
    end;

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Citation Envoyé par mm_71 Voir le message
    Il n'y en a pas. Mais cette vielle astuce ( 2011 ) pour delphi fonctionne toujours:
    Merci pour cette piste que je ne connaissais pas, mais ça va générer beaucoup de calculs si je veux une scrollbar visible uniquement en cas de besoin ; me demande si je ne vais pas basculer sur une ListView en mode Report, moi...

    Enfin, si j'arrive à la faire fonctionner :
    lv.ScrollBars:=ssAutoHorizontal; dans l'inspecteur d'objets et li.Caption:='Test_listview_avec_une_loooooooongue_caption';, plus longue que lv.Width en tout cas, et pas de scrollbar affichée : impossible de voir la fin de la ligne

    Nom : lv_bad.png
Affichages : 75
Taille : 2,7 Ko

    Je dois être maudit...
    Ou j'ai oublié quelque chose ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.FormCreate(Sender: TObject);
    var
      li: TListItem;
    begin
      li := TListItem.Create(lv.Items);
    //  li.Caption:='Test_listview';
      li.Caption:='Test_listview_avec_une_loooooooongue_caption';
      lv.Items.AddItem(li);
    end;
    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

  13. #13
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    juin 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : juin 2012
    Messages : 1 036
    Points : 2 021
    Points
    2 021
    Par défaut
    Merci pour cette piste que je ne connaissais pas, mais ça va générer beaucoup de calculs si je veux une scrollbar visible uniquement en cas de besoin ;
    Non, tout ce que tu as à faire pour virer la scrollbar c'est de mettre ScrollWidth à 0 et pour la remettre tu y remet une valeur > ClientWidth ( ClientWidth définit la largeur d'affichage de ta liste quoi que tu aie mis au moment de la conception graphique.
    me demande si je ne vais pas basculer sur une ListView en mode Report, moi...

    Enfin, si j'arrive à la faire fonctionner :
    A mon avis c'est la même chose pour tout ce qui relève de ListBox.

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Citation Envoyé par mm_71 Voir le message
    A mon avis c'est la même chose pour tout ce qui relève de ListBox.
    Sauf que la LV ne relève pas de la ListBox, mais de la TCustomListView, qui descend de TWinControl directement, ouf !

    En fait, la nuit porte conseil, c'est bien connu, et il fallait juste modifier une propriété, à False par défaut : lv.Columns[0].AutoSize:=True; dans l'inspecteur d'objets et voilà :
    Nom : scrollbar_ok.gif
Affichages : 91
Taille : 6,5 Ko

    Me demande bien comment j'ai fait pour ne pas la voir, hier...
    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 624
    Points : 12 288
    Points
    12 288
    Par défaut
    Bonjour,

    la ListView étant égale à elle-même, c'est-à-dire catastrophique (genre un click sur une ligne bascule l'état de la case-à-cocher, si si !, alors qu'on veut juste sélectionner la ligne ), force est de retourner à la CheckListBox, mais grâce à l'ami mm_71 et à un peu de farfouillage dans les sources (plus un coup de chance, je l'avoue), la solution s'est mise en place assez facilement.

    Soit une CheckListBox nommée clb, voilà comment les choses se passent :
    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
    procedure TForm1.Button5Click(Sender: TObject);
    begin
      clb.Items.Add('autre ligne bien looooongue');
      SetupHorizScrollbar;
    end;
     
    procedure TForm1.SetupHorizScrollbar;
    var
      i, LongestLine: integer;
     
      function ComputeLineWidth(s: string): Integer; inline;
      var // dérive de TCustomListBox.CalculateStandardItemHeigh dans customlistbox.inc
        B: TBitmap;
      begin
        // Paul: This will happen only once if Style = lbStandard then CheckListBox is
        // OwnerDrawFixed in real (under windows). Handle is not allocated and we
        // can not use Canvas since it will cause recursion but we need correct font height
        B := TBitmap.Create;
        try
          B.Canvas.Font := Font;
          Result := B.Canvas.TextWidth(s);
        finally
          B.Free;
        end;
      end;
     
    begin
      LongestLine := 0;
      for i := 0 to clb.Items.Count-1 do // cherche la longueur de la ligne la plus longue
        LongestLine := Max(LongestLine, ComputeLineWidth(clb.Items[i])); // uses Math pour Max
      //if LongestLine > clb.ClientWidth then clb.ScrollWidth := LongestLine;
      // encore plus simple :
      clb.ScrollWidth := LongestLine;
    end;
    et ma foi, ce bout de code fait exactement ce qu'il doit faire, tout en prenant en compte la présence ou pas de la Vertical Scrollbar.
    Impec !

    Merci à toi, mm_71
    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

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

Discussions similaires

  1. Comportement différent entre IE6 et IE7
    Par Zeo34 dans le forum Intégration
    Réponses: 1
    Dernier message: 12/11/2008, 13h24
  2. ComboBox.DropDownCount, comportement différent entre 2000 et XP
    Par Jipété dans le forum Composants VCL
    Réponses: 4
    Dernier message: 10/11/2007, 19h32
  3. Réponses: 12
    Dernier message: 26/10/2007, 17h27
  4. [AJAX] Comportement différent entre IE et FF2
    Par pacopau dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/02/2007, 20h18
  5. Comportement différent entre un bouton et une image
    Par MicheMTP13 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/11/2005, 09h47

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