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

Turbo Pascal Discussion :

[BP7]Tri de boîte liste Windows


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut [BP7]Tri de boîte liste Windows
    Bonjour à tous et toutes !

    Je suis confronté à un tout petit problème dans la gestion d'une boîte liste.

    Dans mon programme, j'ai une liste chaînée d'éléments dont les pointeurs ont été communiqués à une boîte liste Windows (attributs lbs_OwnerDrawFixed mais pas lbs_HasStrings).
    Mon programme s'occupe donc de dessiner lui-même les éléments de la boîte liste (messages wm_DrawItem - pas de problème) et de les trier (messages wm_CompareItem - pas de problème non plus).

    Ma boîte liste peut être triée de deux façons différentes et c'est là qu'intervient mon problème : lorsque je change de méthode de tri, je voudrais immédiatement re-sélectionner l'élément qui était sélectionné avant le tri.

    Là, je sèche : comment faire, puisque les index de départ sont perdus et puisque je ne peux faire appel ni à lb_FindString ni à lb_SelectString (vu que la boîte liste ne possède pas les données qu'elle doit afficher).

    Quelqu'un aurait-il une idée ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Le mieux serait de stocker la string sélectionnée dans une variable, puis de rechercher cette string dans la liste et de la sélectionner. Mais j'imagine que tu as déjà essayé cette méthode !!
    Au fait, que veux-tu dire par "la boîte liste ne possède pas les données qu'elle doit afficher" ???
    a+

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Je veux dire que la boîte liste ne possède que des pointeurs vers les données qu'elle doit afficher.
    Ces données sont en fait des enregistrements stockés dans une liste chaînée qui, eux-mêmes, possèdent des pointeurs vers d'autres données stockées dans une autre liste chaînée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    pFonction = ^tFonction;
    tFonction = Record
      NomFonction : pChar;   (* A afficher *)
      pSuiv : pFonction;
    end;
     
    pPersonne = ^tPersonne;
    tPersonne = Record
      NomPersonne : pChar;   (* A afficher *)
      Fonction : pFonction;
      pSuiv : pPersonne;
    end;
    La boîte liste ne possède que des pointeurs pPersonne. Il faut en fait afficher le nom d'une personne puis sa fonction : ma méthode WMDrawItem va rechercher les données dans les 2 listes chaînées et les affiche.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Trier ta liste n'implique une perte des pointeurs. Il te suffit donc de récupérer le pointeur PPersonne contenant la chaîne sélectionnée. A supposer que tu puisses récupérer ce pointeur...

    Sinon, tout est à revoir. Après tout, pourquoi n'y aurait-il pas deux chaînes identiques ?

    Mais comme tu utilises une TListBox, tu peux obtenir l'index de l'élément sélectionné avec SelIndex. Donc, en suivant ta liste de pointeurs un nombre donné de fois, tu devrais retomber sur ton pointeur. Ensuite, il te suffira de rechercher notre ami le pointeur dans ta liste fraîchement triée

    A+

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Pourquoi rechercher une string alors qu'on peut rechercher un pointeur ?
    Si la réorganisation par le tri ne modifie pas les pointeurs sur les strings, il suffit de rechercher ce pointeur puis de le sélectionner !!
    a+

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    J'y ai déjà pensé, mais il est impossible de faire une recherche sur la valeur d'un pointeur si la boîte liste a l'attribut lbs_Sort, car dans ce cas c'est la méthode WMCompareItem qui se charge de la recherche et WMCompareItem me sert déjà pour le tri de la boîte liste (par comparaison de plusieurs strings situées dans des listes chainées différentes). Je me vois mal assigner deux fonctions aussi différentes à la même méthode.

    La seule manière de récupérer la valeur des pointeurs serait lb_GetText. Il faudrait donc parcourir toute la boîte liste avec ce message jusqu'à trouver un pointeur identique à celui que je dois sélectionner.

    Peut-être est-ce la seule possibilité ? Mais le temps de traitement risque d'être long.

    Si quelqu'un a une autre idée, je suis preneur !
    Merci pour vos réponses, en tout cas !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Je ne vois pas trop là...

    Tu te sers d'un type PPersonne, qui contient un pointeur vers le suivant... Alors où se situe le problème ? Tu dois bien avoir accès à SelIndex, et dans ce cas, tu dois pouvoir parcourir ta liste chaînée de PPersonne sans avoir à t'appuyer sur les méthodes de ta TListBox, non ?

    Sinon, je sèche...

    A+

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Comme l'a dit HDD34, tu devrais essayer de parcourir la liste chainée non pas avec les fonctions de ta ListBox, mais en cherchant toi-même dans ta liste chainée. Une petite fonction suffira !!
    a+

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Je pense que je n'ai pas bien exprimé mon problème au départ.

    Pour résumer, ma boîte liste a les attributs lbs_DrawFixed (donc, c'est mon programme qui doit dessiner les éléments de la boîte liste) et lbs_Sort (donc, c'est mon programme qui doit fournir la routine de comparaison permettant à Windows de trier les éléments). Pour finir, la boîte liste n'a pas l'attribut lbs_HasStrings (donc, elle n'a en sa possession que des pointeurs vers mes données).

    A un moment donné, l'élément n° 14 de la boîte liste est sélectionné.
    A ce moment, l'option de tri change. Je demande donc à la boîte liste de se retrier et de se réafficher.

    Mon élément précédemment sélectionné ne porte plus (sauf hasard) le n° 14. Ma question était : comment le retrouver ?

    - Je ne peux évidemment pas me servir de l'index (14), puisqu'il a changé.
    - Je ne peux pas faire de recherche par les messages lb_FindString, lb_FindStringExact ou lb_SelectString, puisque Windows doit faire appel à la méthode WMCompareItem (à cause de lbs_Sort), qui fait tout autre chose.
    - La seule solution trouvée jusqu'ici a été proposée par Wormful_Sickfoot et consiste à rechercher directement le pointeur dans la boîte liste (en parcourant cette dernière avec des messages lb_GetText).

    Je pense m'arrêter à cette solution, à moins que quelqu'un ait une idée lumineuse.

    Merci, en tout cas !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  10. #10
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Je stoppe tout !

    Ma boîte liste, par souci d'ergonomie pour les utilisateurs de mon programme, est à présent remplacée par une boîte combo "drop down list".

    Là, j'ai dû changer mon fusil d'épaule car, lorsque la boîte combo ne possède pas les chaînes qu'elle doit afficher, elle ne peut réagir aux caractères tapés dans la zone d'édition (sélection automatique par Windows de l'élément de la liste correspondant au début du texte tapé).
    Tout se plante lamentablement !

    Bref, je vais en revenir à une gestion plus classique et fournir des chaînes à la boîte combo, et non plus seulement des pointeurs.

    Merci à ceux qui ont eu la gentillesse de se creuser les méninges.

    A bientôt !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Je propose une autre solution ( qui vaut ce qu'elle vaut, puisque je ne connait pas entièrement ce qu'Alcatîz a dans la tête !! ) : pour proposer deux façons de trier les éléments de la list box ? Si il n'y a plus qu'une façon de trier la list box alors plus de pointeurs, plus de perte de focus, etc ....
    a+

  12. #12
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    En passant, la recherche du pointeur, l'idée était de moi en premier...

    Mais je ne vois pas où se situait le problème. Puisque le changement de méthode de tri passait nécessairement par l'appel d'un procédure, qui avait jsute à récupérer l'index de la sélection (14 ici), parcourir la liste des pointeurs en sauvant le 14ème. Ensuite, on trie la liste avec la nouvelle méthode, et on recommence notre manège en recherchant le pointeur précédemment sauvé et en comptant le nombre de pointeurs déjà passés en revue.

    Mais bon, le sujet est clos...

  13. #13
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Pour clore tout-à-fait le sujet, je tiens à préciser que ce n'était pas ma liste chaînée qui était triée, mais uniquement les éléments de la boîte liste Windows. Donc, pas de "comptage" possible en parcourant la liste chaînée.

    Le principe que j'ai utilisé ici (et que j'ai pris l'habitude d'utiliser) était de confier entièrement à Windows la gestion de ma liste chaînée. Simplement, je récupère les modifications (y compris les éléments ajoutés) à la fermeture du dialogue.
    Mais en cours de traitement, je ne touche pas à ma liste.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  14. #14
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Ouais, enfin tu n'avais pas dû choisir au départ la gestion la plus appropriée aux problèmes qui allaient se poser par la suite.

    Tu t'en es rendu compte par la suite.

    A+

  15. #15
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Hé oui ! Il arrive que l'on se casse les dents.
    Mais c'est ce qui fait tout le charme de la programmation !
    Et puis, on apprend quelque chose à chaque fois.

    A bientôt et merci pour tes réponses.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

Discussions similaires

  1. [PC] Tri COBOL ne tourne pas sous Windows VISTA
    Par sleretrif dans le forum Cobol
    Réponses: 3
    Dernier message: 15/05/2007, 15h02
  2. Tri d'une zone de liste
    Par syldudu dans le forum IHM
    Réponses: 7
    Dernier message: 19/01/2007, 17h06
  3. Tri par rapport à une liste de clés primaires
    Par yoyot dans le forum Langage SQL
    Réponses: 10
    Dernier message: 23/06/2006, 12h48
  4. Tri d'une zone de liste par bouton
    Par illight dans le forum Access
    Réponses: 7
    Dernier message: 09/11/2005, 19h39
  5. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34

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