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

MFC Discussion :

[CListCtrl] Tri de fichiers


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut [CListCtrl] Tri de fichiers
    Avez vous eja essayé de faire un tri d'une liste de fichiers selon une date.
    Les fichiers sont ajoutés un a un en utilisant la date de creation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    SYSTEMTIME localTime, fileTime
    FileTimeToSystemTime(&fileTime, fileFindData.ftLastWriteTime);
    SystemTimeToTzSpecificLocalTime(NULL, &fileTime, &localTime);
     
    m_ctlSeq.SetItemData(nItem, (DWORD_PTR)&localTime);
    ...
     
    m_ctlSeq.SortItems(MyCompareProc, 0);
    Avec la procédure de tri :

    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
    static int CALLBACK  MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
      SYSTEMTIME  * time1 = (SYSTEMTIME*) lParam1;
      SYSTEMTIME  * time2 = (SYSTEMTIME*) lParam2;
     
      if ( memcmp(time1, time2, sizeof(SYSTEMTIME)) == 0 ) return 0;
     
      if ( (time1->wYear < time2->wYear) || (time1->wMonth < time2->wMonth) || (time1->wDay < time2->wDay) ||
           (time1->wHour < time2->wHour) || (time1->wMinute < time2->wMinute) || (time1->wSecond < time2->wSecond) )
      {
        if ( lParamSort == 0 ) { return -1; }
        else  { return 1; }
      }
      else if ( lParamSort == 0 )  { return 1; }
      else { return -1; }
     
    }
    Mais il m'est impossible de faire un tri correct. j'ai essayé plein de solutions...

    avez vous une meilleure solution ? merci d'avance !

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    moi je convertirai les deux dates en chaine de caracteres ou objets CString.
    en mettant dans l'ordre: l'année le mois le jour.
    apres tu renvois le retour de strcmp des deux chaines suivant les cas...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Ta fonction de comparaison de date n'est pas correct.

    Tu peux changer tes SYSTEMTIME en FILETIME puis utiliser la fonction CompareFileTime pour faire la comparaison
    http://msdn.microsoft.com/library/de...refiletime.asp

    cordialement

  4. #4
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    Farscape :
    j'ai essayé plein de solutions possibles, en passant par le nom du fichier puis faire un CFile::GetStatus().

    J'ai essayé la solution proposée par ricky...
    pour l'instant, ca ne semble pas marcher... le résultat est le méme quelque soit ma valeur de lParamSort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      FILETIME * time1 = (FILETIME *) lParam1;
      FILETIME * time2 = (FILETIME *) lParam2;
     
      long result = CompareFileTime(time1, time2);
     
      if ( lParamSort == 0 )
        return -result;
      return result;
    En fait, je crois que le mieux, c'est d'avoir une représentation numérique de la date et de l'heure, en passant par un long par exemple... y a t il quelque chose qui permette ca ?

    [edit] je vais devenir gaga avec leurs fonctions sur les heures...
    RtlTimeToSecondsSince1970() et consors

    [edit2] la doc MFC parle de 32-bit value qui est fournie a SetItemData().
    je peux bien passer un ULARGE_INTEGER *, non ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Citation Envoyé par Rupella
    En fait, je crois que le mieux, c'est d'avoir une représentation numérique de la date et de l'heure, en passant par un long par exemple... y a t il quelque chose qui permette ca ?

    [edit] je vais devenir gaga avec leurs fonctions sur les heures...
    RtlTimeToSecondsSince1970() et consors
    Inutile de réinventer la roue,

    la classe CTime implémente tous les opérateurs de comparaison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      CTime t1 (* reinterpret_cast<const FILETIME*> (lParam1));
      CTime t2 (* reinterpret_cast<const FILETIME*> (lParam2));
     
      if (t1 == t2)
        return 0;
      else
        return (t1 < t2 ? - 1 : 1);

  6. #6
    Membre expérimenté Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Par défaut
    Ca ne fonctionne pas non plus
    Par exemple pour deux valeurs que je stocke, elles sont différentes, mais lors de l'appel à la fonction de tri, lParam1 et lParam2 sont identiques...

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    bon je viens de faire une recherche dans mes codes la solution de ricky doit fonctionner j'ai un code similaire.
    tu dois te planter sur ton InsertItem en precisant le itemdata...

Discussions similaires

  1. Tri de fichier selon type d'extension et nom
    Par Aliveli dans le forum Visual C++
    Réponses: 11
    Dernier message: 17/11/2006, 11h35
  2. tri de fichier
    Par sondess dans le forum C
    Réponses: 6
    Dernier message: 17/10/2006, 14h34
  3. Tri de fichier avec le "sort"
    Par LFC dans le forum Langage
    Réponses: 1
    Dernier message: 08/03/2006, 07h55
  4. Tri de fichier
    Par difficiledetrouver1pseudo dans le forum Linux
    Réponses: 2
    Dernier message: 22/02/2006, 16h47
  5. [langage] tri de fichier
    Par jj77 dans le forum Langage
    Réponses: 7
    Dernier message: 16/11/2004, 16h35

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