Delphi ordonner combobox [Résolu]

Signaler
Messages postés
25
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 novembre 2009
-
Messages postés
25
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 novembre 2009
-
Bonjour à tous,
j'explique mon probleme :
j'ai une liste déroulante générée automatiquement.
Cette derniere contient des dates :
01/04/09
05/06/09 etc...
Le probleme est que Delphi les ordonnent avec le premier chiffre qu'il rencontre :
ainsi j'obtiens
01/04/09
05/04/09
06/04/08
07/04/09

je voudrais donc savoir si il existait un moyen de la triée par années dans un premier temps puis par mois, comme la logique le voudrait.

Par avance Merci.

12 réponses

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
au temps pour moi :

type
  TDateOrder = (doDMY, doDYM, doYMD, doYDM, doMYD, doMDY);

procedure ConvertDates(Strings: TStrings; const InOrder,OutOrder: TDateOrder);
var N : integer;
    ST, Dy, Mo, Ye: String;
begin
  Strings.BeginUpdate;
  try
    for N := 0 to Strings.Count-1 do
    begin
      if length(Strings[N]) = 6 then
      begin
        ST := Strings[N];
        case InOrder of
          doDMY : begin Dy := ST[1]+ST[2]; Mo := ST[3]+ST[4]; Ye := ST[5]+ST[6]; end;
          doDYM : begin Dy := ST[1]+ST[2]; Mo := ST[5]+ST[6]; Ye := ST[3]+ST[4]; end;
          doYMD : begin Dy := ST[5]+ST[6]; Mo := ST[3]+ST[4]; Ye := ST[1]+ST[2]; end;
          doYDM : begin Dy := ST[3]+ST[4]; Mo := ST[5]+ST[6]; Ye := ST[1]+ST[2]; end;
          doMYD : begin Dy := ST[5]+ST[6]; Mo := ST[1]+ST[2]; Ye := ST[3]+ST[4]; end;
          doMDY : begin Dy := ST[1]+ST[2]; Mo := ST[1]+ST[2]; Ye := ST[5]+ST[6]; end;
        end;
 
        case OutOrder of
          doDMY :Strings[N] := Dy+'/'+Mo+'/'+Ye;
          doDYM :Strings[N] := Dy+'/'+Ye+'/'+Mo;
          doYMD :Strings[N] := Ye+'/'+Mo+'/'+Dy;
          doYDM :Strings[N] := Ye+'/'+Dy+'/'+Mo;
          doMYD :Strings[N] := Mo+'/'+Ye+'/'+Dy;
          doMDY :Strings[N] := Mo+'/'+Dy+'/'+Ye;
        end;
      end;
    end;
  finally
    Strings.EndUpdate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var TSL : TStringList;
begin
  TSL := TStringList.Create;
  try
    TSL.Add('091223');
    TSL.Add('091023');
    TSL.Add('991012');
    TSL.Add('990112');
    TSL.Add('071117');
    TSL.Add('041228');
    TSL.Add('040128');
    TSL.Sorted := true;
    TSL.Sorted := false;
    ConvertDates(TSL, doYMD, doDMY);
    ListBox1.Items.Assign(TSL);
   finally
    TSL.Free;
  end;
end;

<hr size="2" width="100%" />
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
salut
A toi de trier ta liste avant de nourrir la combobox
L'autre solution serait de choper les dates "à l'envers" : 09/04/01
a+
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
bonjour,

dates "à l'envers" : 09/04/01

09/04/01
88/04/05

cantador
Messages postés
25
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 novembre 2009

Extraire les dates à l'envers de m'intéresse pas puisquequ'à la base avant d'envoyer ces dates dans la liste déroulante je les converties déjà au format FR
Avant d'être dans la combobox elles sont sous cette forme:
090426 (26 avril 2009)
puis je les transforme pour plus de lisibilité pour l'utilisateur en
26/04/09

Une autre idée?
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
35
Salut,

eh ben ... t'as tout ce qu'il faut ... il suffit de le faire dans le bon sens:

1) tu récupères les dates sans en changer le format
2) tu tries la liste (StringList .Sorted := True)
3) tu modifies le format pour avoir une date "Fr"
4) et tu renvois la liste au ComboBox

voilà c'est tout ....

 
@+
Cirec

<hr siz="" />
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
ce qui donne :

type
  TDateOrder = (doDMY, doDYM, doYMD, doYDM, doMYD, doMDY);

procedure ConvertDates(String: TStrings; const InOrder,OutOrder: TDateOrder);
var N : integer;
    ST, Dy, Mo, Ye: String;
begin
  Strings.BeginUpdate;
  try
    for N := 0 to Strings.Count-1 do
    begin
      if length(Strings[N]) = 6 then
      begin
        ST := Strings[N];
        case InOrder of
          doDMY : begin Dy := ST[1]+ST[2]; Mo := ST[3]+ST[4]; Ye := ST[5]+ST[6]; end;
          doDYM : begin Dy := ST[1]+ST[2]; Mo := ST[5]+ST[6]; Ye := ST[3]+ST[4]; end;
          doYMD : begin Dy := ST[5]+ST[6]; Mo := ST[3]+ST[4]; Ye := ST[1]+ST[2]; end;
          doYDM : begin Dy := ST[3]+ST[4]; Mo := ST[5]+ST[6]; Ye := ST[1]+ST[2]; end;
          doMYD : begin Dy := ST[5]+ST[6]; Mo := ST[1]+ST[2]; Ye := ST[3]+ST[4]; end;
          doMDY : begin Dy := ST[1]+ST[2]; Mo := ST[1]+ST[2]; Ye := ST[5]+ST[6]; end;
        end;
 
        case OutOrder of
          doDMY :Strings[N] := Dy+'/'+Mo+'/'+Ye;
          doDYM :Strings[N] := Dy+'/'+Ye+'/'+Mo;
          doYMD :Strings[N] := Ye+'/'+Mo+'/'+Dy;
          doYDM :Strings[N] := Ye+'/'+Dy+'/'+Mo;
          doMYD :Strings[N] := Mo+'/'+Ye+'/'+Dy;
          doMDY :Strings[N] := Mo+'/'+Dy+'/'+Ye;
        end;
      end;
    end;
  finally
    Strings.EndUpdate;
  end;
end;

procedure Form1.EvenementQuelconque(Sender: TObject);
var TSL : TStringList;
begin
  TSL := TStringList.Create;
  try
    TSL.LoadFromFile('dates.txt');
    TSL.Sorted := true;
    TSL.Sorted := false;
    ConvertDates(TSL, doYMD, doDMY);
    ComboBox1.Items.Assign(TSL);
   finally
    TSL.Free;
  end;
end;

<hr size="2" width="100%" />
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Il est fort ce foxi, il est fort ... ^^
Messages postés
25
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 novembre 2009

Pas tout compris au message de f0xi... en plus Delphi en veut pas...


Cirec, tu disais de faire un stringlist.sorted


seulement j'ai toutes mes dates dans un tableau de type string


et les commandes la_liste_date.sorted ne fonctionne pas étant donné que ça s'applique a des objet et pas a des tableaux.


Une autre idée? Merci 
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Une autre idée ? Reessaie la soluce de foxi qui est 100% bonne !
"Delphi en veut pas" si tu veux mon avis, le problème se situe entre le clavier et la chaise ...
Messages postés
25
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 novembre 2009

Oh oh la touche d'humour, j'ai jamais dit que j'étais un professionnel... et j'suis tout à fait d'accord, le problème est bien la, seulement j'ai beau faire un vulgaire copier coller (en adpatant biensur...) il refuse de me le compiler.
Alors pourriez vous s'il vous plait m'expliquer ce qu'il faut faire (faut rajouter un truc dans les uses?).
Merci.
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
^^ PEBKAC comme on dit :p
euh et bien deja, y a t-il un message d'erreur de compilation ? si oui, je voudrais le connaitre.
Le type, est-il bien déclaré avec les autres types ?
L'evenementquelquonque est placé/lancé comment sur ton code ?
Messages postés
25
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
6 novembre 2009

Au temps pour moi également, j'avais fait quelqus erreurs ^^
Cette solution est tout à fait adaptée et de plus permet de convertir avec le format que l'on souhaite.
Excellent!
Merci.