cs_f6dqm1
Messages postés62Date d'inscriptionlundi 8 novembre 2004StatutMembreDernière intervention25 mai 2013
-
19 déc. 2007 à 15:58
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
20 déc. 2007 à 19:06
Existe t'il une possibilité de tri numérique automatique sur une ListBox dont tous les items commencent par des chiffres ?
La fonction sorted ne marche pas car elle classe d'abord tous les chiffres qui commencent par 1 puis tous les chiffres qui commencent par 2 etc. Pas réellement ce que je cherche Hi !
Merci pour l'aide
Gabriel
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 19 déc. 2007 à 19:04
Une autre façon serait de trier avant de passer les items dans ta liste.
Pour cela, tu peux passer par un Record et un Array:
type
monRecord=Record
Valeur: Integer; // Valeur qui permettra de trouver le plus petit
MaString; // String qui sera passée dans ta listBox
Passé: Boolean; // permet de savoir si on l' a déjá passé dans le listbox
end;
Tu déclares un aArray comm suit:
Array_Items: Array of monRecord;
Ensuite tu remplies Array_Items avec les différents Items. (N' oublie pas le SetLength de l' array).
"Passé" devra être initialisé à false bien sûr ...
Enfin, tu cherches dans l' array le plus petit (oú Passé = "false") et tu le passes dans ta ListBox.
N' oublie pas de mettre "Passé" à True.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 19 déc. 2007 à 22:28
Dans ma derniere phrase de mon 1er commentaire j' ai écrit:
"Tu dois juste remplacer StrToFloat() par une fonction qui te renvoie l' integer de l'item!!!"
Mon 2eme commentaire fonctionnerait aussi très bien ...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 19 déc. 2007 à 22:52
Pourquoi faire simple quand on peut faire compliqué
J'avais bien lu ton message
et j'ai même fait les testes qui s'imposent
StrToInt (par exemple) te renvoie une belle exception si la chaine contient des lettres !
ce qui implique qu'il faudrait créer une fonction qui récupère que les chiffres ... mais le trie ne sera pas juste puisque les lettres ne seront pas prise en compte !!!!
Alors que le simple fait d'ajouter des zéros en début permet d'utiliser la méthode de trie interne et sans code supplémentaire avec un résultat trier correctement jusqu'au dernier caractère
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 19 déc. 2007 à 23:04
çà me fait penser au coup du gars qui veut se faire un diaporama avec ses photos de vacances avec un logiciel tout fait..(photo1, photo2..photo12 etc etc)
et surprise lorsqu'il le lance tout est mélangé !
Alors que si bien sur il se dit tiens j'en ai 999 (il en raté une..) et il nomme ses fichiers :
photo001, photo002, photo047..photo238...photo999.
et là ca va nettement mieux..
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 20 déc. 2007 à 00:26
Salut,
« Qu'il y ait des gens beaucoup plus savants que d'autres n'est pas très intriguant. Ce qui est extraordinaire, et diablement instructif, c'est à quel point deux personnes ayant des connaissances proches peuvent diverger dans la façon dont elles les interprètent. »
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 20 déc. 2007 à 09:20
Quelle que soit la manière dont on va traiter le problème, dans tous les cas, il va bien falloir une routine pour récupérer le nombre qui se trouve en début d'item et qui détermine le classement de la liste.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 20 déc. 2007 à 09:46
@Caribensila:
Le problème n'est pas là ... peut importe de quel manière on interprète la chose ... ce que je soulignai c'est qu'il n'est pas utile de réécrire ce qui existe déjà !!! (la fonction de trie)
@Japee:
Pas forcément ... on peut le prévoir à l'avance
Soit c'est l'utilisateur qui les rentre dans ce cas on utilise un MaskEdit
Soit c'est le programmeur qui les rentre dans ce cas c'est à lui de les mettre
Il ne reste plus que la machine c'est le seul cas ou il faudrait écrire du code
ça ne fait que 1 cas sur 3
Et en plus dans méthode de ce type (ou l'on extrait que les chiffres pour le trie) le résultat risque de ne pas être correcte
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 20 déc. 2007 à 10:13
Salut Cirec,
ta méthode est bonne puisque le chiffre est en début de string.
Par contre s' il était à la fin,il y aurait un chtit problème...
C' est pour cela qu' en utilisant un Array de type Record on peut ordonner de la manière que l' on veut, même sans montrer les chiffres dans la listBox.
C' est vrai que c' est plus complexe mais serait 100% réutilisable et cela permet aussi d' ordonner avec d' autres critères que du plus petit au plus grand...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 20 déc. 2007 à 10:45
Salut Mauricio:
il faut que je regarde ça de plus près ...
ou j'ai loupé un truc ou j'y ai rien compris.
Mais jusqu'à preuve du contraire une chaine '123 abc'
avec n'importe quel StrTo... provoque une erreur de conversion ... non ?
et c'est là que je ne comprend pas ta logique :
Puisque même si tu arrives à extraire les chiffres le trie ne se fera que sur les chiffres et non sur l'ensemble des caractères
En attendant que je teste le code je vous offre une fonction qui ajoute les zéros manquants (uniquement devant)
Uses StrUtils;
Function LeadingZero(Const S : String;
Const Len : Integer = 3): String ;
Var PbS : PByte;
Cnt : Integer;
Begin
PbS : = PByte(S);
SetLength(Result, Length(S));
Result := S;
Cnt := 0;
While (PbS^ > 47)
And (PbS^ < 58)
Do Begin
Inc(PbS);
Inc(Cnt);
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 20 déc. 2007 à 12:49
"C'est bien ce que je disais
ton code ne fonctionne que si les données sont uniques ...
{ Voici le contenu de la ListBox
1 zdhr
2 acabd
1 dbdgh
1 abc
11 aabccd
2 aabccd
111 dkfjgu
}"
Désolé Cirec, mais si tu testes ma source avec ces éléments lá, mes 2 méthodes fonctionnent très bien (c' est la 3ème fois que je te dis que ça marche) ...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 20 déc. 2007 à 13:07
Je ne vois pas ce qu'il y a de juste la dedans !!!!!!!
En rouge c'est le résultat que tu devrais obtenir
Alors ... ou ça marche !!!!!
Et non j'utilise pas mal ta fonction
C'est justement là ou je voulais en venir
Si j'ai mis 1 et 2 dans le texte avec 999 pour les deux c'est que justement la méthode de trie devrait en tenir compte (ce qu'elle ne fait pas)
Si tes chiffres sont unique alors oui ta méthode fonctionne
Mais si il y a des doublons dans les chiffres ... c'est la pagaille
cs_f6dqm1
Messages postés62Date d'inscriptionlundi 8 novembre 2004StatutMembreDernière intervention25 mai 2013 20 déc. 2007 à 13:21
Bjr à tous.
Ne vous battez pas pour si peu !
J'avais bien trouvé la méthode de Cirec consistant à mettre tous le nombres au même format à 3 chiffres mais celà devenait contraignant pour les utilisateurs qui saisissent le contenu des items dans une boite de dialogue.
Chaque item est composé de plusieurs champs séparés par des tabulations, le premier champ étant un nombre de longueur quelconque.
WORD possède une possibilité de tri numérique sur ce type de texte en "tableau" et je m'imaginais qu'il y avait peut-être la même possibilité de tri numérique en Delphi sur une ListBox constituée de la même façon.
Je vais prendre mon courage à deux mains.
Bonne journée à tous
gabriel
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 20 déc. 2007 à 13:23
Bem c' est sûr que ça marche pas, il faut reparamétrer la fonction pour tenir compte d' un autre paramètre qui est le texte (qui pourrait être du texte ou un autre integer d' ailleurs dans ma fonction), elle tient compte que de l'integer dans l' exemple.
Il faut juste adapter ici:
else // *** Ici on compare des integers, mais on peut comparer tout ce que l' on veut *** //
if Array_Items[i].Value < Array_Items[RESULT].Value
then RESULT := i; // Nouveau item plus petit trouvé !!!
Je vois que tu veux à tout prix avoir raison alors que ta fonction ne fonctionne pas si les chiffres sont à la fin et ainsi, tu imposes le visuel de chaque élément.
A+
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 20 déc. 2007 à 13:30
Pas de soucis ... on ne se bat pas
Mais c'est toujours difficile de se faire comprendre
"J'avais bien trouvé la méthode de Cirec consistant à mettre tous le
nombres au même format à 3 chiffres mais celà devenait contraignant
pour les utilisateurs qui saisissent le contenu des items dans une
boite de dialogue.
"