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

 Delphi Discussion :

Afficher les fichiers d'un dossier par le critère mois sous Windows 10 avec D6 !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut Afficher les fichiers d'un dossier par le critère mois sous Windows 10 avec D6 !
    Bonjour à toutes et à tous,

    Avec une procédure, j'affiche dans un Tmemo, la liste de mes fichiers par ordre du jour 01, 02, 03, etc.… :

    01/10/2019 14:47:50
    02/09/2019 07:29:35
    02/10/2019 14:50:43
    02/10/2019 14:50:44
    03/09/2019 13:15:46
    Cette méthode fait que les fichiers sont classé par le jour et non par le mois donc le fichier du 03/09/2019 se situe après ceux du 02/10/2019.

    Ma demande consiste à obtenir la liste de mes fichiers sur le mois.

    Voici mon code :

    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
     
    var
    FL: TStringList;
     
    fichier, chemin : string;
     
    begin
    chemin := 'C:\Test' ;
    fichier := opd1.filename;
    if opd1.Execute then begin
    FL := TStringList.Create;
    FL.Sorted := True;
    GetFileList( FL, chemin, '*' );
    Memo1.Lines.Assign(FL);
    FL.Free;
     
    end;
     
    end;
    Si c'est possible, merci d'une aide éventuelle.

    @+,

    cincap

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,

    je suppose que les informations de base sont toutes de type string
    et qu'elles ne contiennent que des Dates:
    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
     
    function CompareDate(Date1, Date2: TDateTime): Integer;
    begin
      Result := -1;
      if Date1 = Date2 then Result := 0
      else
        if Date1 > Date2 then Result := 1;
    end;
     
    function MyCompareFunc(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      Result := CompareDate(StrToDateTime(List[Index1]),  StrToDateTime(List[Index2]));
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
      SL: TStringList;
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile('Dates.txt');
        Memo1.Lines.AddStrings(SL);
        Memo1.Lines.Add('');
        SL.CustomSort(@MyCompareFunc);
        Memo1.Lines.AddStrings(SL);
        Memo1.Lines.Add('');
      finally
        SL.Free;
      end;
    end;
    Cordialement,

    @+

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    @ Cirec, tu passes aussi le dimanche décidément tu mérites un autre statut !

    J'ai testé mais j'obtiens une erreur, alors je précise l'objet.

    Dans mon dossier Data j'ai une liste de fichier photos .jpg.

    Avec mon premier code j'obtiens un résultat mais par ordre basé sur le jour.

    Avec ton code, j'ai peut être fait une erreur de transcription ?

    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
     
    var
      SL: TStringList;
      chemin, fichier : string;
    begin
    chemin := 'C:\Data\';
    fichier := opd1.filename;
    if opd1.Execute then begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile(chemin);
     
        Memo1.Lines.AddStrings(SL);
        Memo1.Lines.Add('');
        SL.CustomSort(@MyCompareFunc);
        Memo1.Lines.AddStrings(SL);
        Memo1.Lines.Add('');
      finally
        SL.Free;
    end;
    end;
    Je cherche aussi de mon côté.

    @+,

    cincap

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Il manque au minimum un appel à la fonction Sort, non ?
    Et la liste ne me semble pas peuplée...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Il manque au minimum un appel à la fonction Sort, non ?
    Et la liste ne me semble pas peuplée...
    non le fait d'affecter une valeur à CustmSort déclenche le tri

    et le code fonctionne parfaitement testé sous D6 pour être certain

    si le code plante c'est à cause du format des items
    j'ai bien précisé en début de message:
    je suppose que les informations de base sont toutes de type string
    et qu'elles ne contiennent que des Dates:
    ce qui veut dire que le StringList contient ceci(par ex.):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    01/10/2019 14:47:50
    02/09/2019 07:29:35
    02/10/2019 14:50:43
    02/10/2019 14:50:44
    03/09/2019 13:15:46 
    02/01/2016 14:50:44
    22/06/2018 14:50:44
    et le code donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    02/01/2016 14:50:44
    22/06/2018 14:50:44
    02/09/2019 07:29:35
    03/09/2019 13:15:46 
    01/10/2019 14:47:50
    02/10/2019 14:50:43
    02/10/2019 14:50:44
    le code correspond aux infos données.
    @Cincap
    donne moi 2 ou 3 lignes contenues dans ton SL avant tri
    que je vois pourquoi
    si tu as le chemin et le nom du fichier devant c'est normal que ça ne fonctionne pas

    Cordialement,

    @+

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    @ Cirec, merci de ta réponse.

    Dans le libellé du topic, j'indiquais qu'il y avait des fichiers dans un dossier et que j'aimerai les afficher par le mois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
    FL: TStringList;
     
    fichier, chemin : string;
     
    begin
    chemin := 'C:\Test' ; //mon dossier de test
    fichier := opd1.filename;
    if opd1.Execute then begin //je choisis Photo_1.jpg
    …..
    Voici ce que contient mon dossier "Data" dans mon Tmemo avec le 1er code du topic et après avoir choisi la 1ère photo :

    Les photos sont bien classées par l'ordre mais des jours !

    01/09/2019 11:30:41 Photo_1.jpg
    01/09/2019 11:30:41 Photo_2.jpg
    01/10/2019 14:47:50 Photo_3.jpg
    01/10/2019 14:47:50 Photo_4.jpg
    02/09/2019 07:29:35 Photo_5.jpg
    02/10/2019 14:50:43 Photo_6.jpg
    02/10/2019 14:50:44 Photo_7.jpg
    03/09/2019 13:15:46 Photo_8.jpg
    03/09/2019 13:15:47 Photo_9.jpg
    04/10/2019 05:39:11 Photo_10.jpg
    Cette solution j'envisage de l'adapter au code du topic concernant les vignettes représentant les photos du dossier.

    Si je me rend dans ce dossier, je pourrai faire avec le click droit et choisir "Trier par date".

    @+,

    cincap

  7. #7
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    dans ce cas tu utilises cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function MyCompareFunc2(List: TStringList; Index1, Index2: Integer): Integer;
    var
      S1, S2: string;
    begin
      S1 := Copy(List[Index1], 1, 19);
      S2 := Copy(List[Index2], 1, 19);
      Result := CompareDate(StrToDateTime(S1),  StrToDateTime(S2));
      if Result = 0 then
        Result := CompareStr(List[Index1], List[Index2]);
    end;
    Mais il serait plus "souple" de réutilisation de procéder autrement.

    Il faudrait, lors de la création du stringlist, ajouter un objet qui contient les données du SearchRec du fichier.
    partant de là on peut alors trier la liste sous les différents critères contenu dans le SearchRec (Date de creation , date d'écriture, taille, nom ...)
    avec simplicité.

    Ici le code ne fonctionnera que si les données correspondent au format attendu (Date Time FileName)!

    Cordialement,

    @+

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    Bonjour à toutes et à tous,

    @ Cirec, merci de tes propositions mais avec la fonction telle quelle, cela ne fonctionne pas.

    De plus dans mon ListBox ou Memo, j'aimerai que les items s'affichent avec la dernière date du moment et qui dénomme le dernier fichier présent dans le dossier, c'est aussi difficile d'avoir le résultat à cause de la date avant le nom du fichier:

    01/09/2019 11:30:41 Photo_1.jpg
    01/09/2019 11:30:41 Eaaghjtyu.jpg
    01/10/2019 14:47:50 Photo_3.jpg
    Maintenant je pourrai faire en sorte que dans un 2ième Tedit j'afficherai uniquement le nom du fichier avec "LastDelimiter".

    Je laisse ce topic pour l'instant car je testerai avant les ordres croissant ou décroissant.

    @+,

    cincap

  9. #9
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bon,
    je ne sais pas ce que tu fais exactement mais
    avec "MyCompareFunc2" en partant de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    01/09/2019 11:30:41 Photo_1.jpg
    01/09/2019 11:30:41 Photo_2.jpg
    01/10/2019 14:47:50 Photo_3.jpg
    01/10/2019 14:47:50 Photo_4.jpg
    02/09/2019 07:29:35 Photo_5.jpg
    02/10/2019 14:50:43 Photo_6.jpg
    02/10/2019 14:50:44 Photo_7.jpg
    03/09/2019 13:15:46 Photo_8.jpg
    03/09/2019 13:15:47 Photo_9.jpg
    04/10/2019 05:39:11 Photo_10.jpg 
    01/09/2019 11:30:41 Photo_1.jpg
    01/09/2019 11:30:41 Eaaghjtyu.jpg
    01/10/2019 14:47:50 Photo_3.jpg
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    01/09/2019 11:30:41 Eaaghjtyu.jpg
    01/09/2019 11:30:41 Photo_1.jpg
    01/09/2019 11:30:41 Photo_1.jpg
    01/09/2019 11:30:41 Photo_2.jpg
    02/09/2019 07:29:35 Photo_5.jpg
    03/09/2019 13:15:46 Photo_8.jpg
    03/09/2019 13:15:47 Photo_9.jpg
    01/10/2019 14:47:50 Photo_3.jpg
    01/10/2019 14:47:50 Photo_3.jpg 
    01/10/2019 14:47:50 Photo_4.jpg
    02/10/2019 14:50:43 Photo_6.jpg
    02/10/2019 14:50:44 Photo_7.jpg
    04/10/2019 05:39:11 Photo_10.jpg
    ce qui est juste !!!

    pour le tri Croissant Décroissant
    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
    var
      FSortAscending: Boolean = False;
    function MyCompareFunc2(List: TStringList; Index1, Index2: Integer): Integer;
    var
      S1, S2: string;
      Idx1, Idx2   : Integer;
    begin
      if FSortAscending then
      begin
        Idx1 := Index1;
        Idx2 := Index2;
      end
      else
      begin
        Idx1 := Index2;
        Idx2 := Index1;
      end;
      S1 := Copy(List[Idx1], 1, 19);
      S2 := Copy(List[Idx2], 1, 19);
      Result := CompareDate(StrToDateTime(S1),  StrToDateTime(S2));
      if Result = 0 then
        Result := CompareStr(List[Idx1], List[Idx2]);
    end;
    Cordialement,

    @+

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    @ Cirec, merci de ta réponse,

    Voici ma commande :

    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
     
    var
      SL: TStringList;
    begin
      SL := TStringList.Create;
      try
        if opd1.Execute then begin
        SL.LoadFromFile(opd1.filename);
        Memo1.Lines.AddStrings(SL);
        Memo1.Lines.Add('');
        SL.CustomSort(@MyCompareFunc2);
        Memo1.Lines.AddStrings(SL);
        Memo1.Lines.Add('');
        end
      finally
        SL.Free;
      end;
    J'obtiens naturellement dans le mémo des caractères farfelus.

    J'ai l'intention d'utiliser un TlistBox car au niveau de l'item sélectionné c'est plus facile d'afficher le nom complet du fichier .jpg dans le Tedit.

    Je vais voir avec le tri croissant/décroissant.

    @+,

    cincap

  11. #11
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bon il y a vraiment quelque chose que je n'ai pas compris ou que tu ne m'as pas dit

    sur quoi pointe opd1.filename ?
    que contient le SL après SL.LoadFromFile(opd1.filename); ?
    parce que les codes que j'ai donnés fonctionnent tous à condition de respecter la trame d'entrée (cf. messages précédents)
    Le tout a été fait et compilé avec D6 !!!

    Cordialement,

    @+

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    @ Cirec voici :

    sur quoi pointe opd1.filename ?
    sur des photos .jpg contenues dans le dossier "C:\Data\"

    que contient le SL après SL.LoadFromFile(opd1.filename); ?
    ceci :

    ÿØÿà

    ÿØÿà
    Forcément, je ne sais pas tester le Tri croissant/Décroissant.

    Je continue mes tests ouf…

    @+,

    cincap

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    Ça sent le marqueur jpeg FFD8 !

    Pour lister les fichiers d'un répertoire, comme l'évoquait Cirec, rien ne vaut un FindFirst/FindNext (après un SelectDirectory, ou un ExtactFilePath sur OpenFileDialog.FileName) et l'exploitation des données de taille, de date, etc.

    Du coup, il faut stocker les différentes données dans un Record, utiliser une Liste de Records et faire un CustomSort dessus sur le seul champ pertinent du Record.

    On peut utiliser un TStringList pour loger le FileName dans Strings[] et le Record des autres champs dans Objects[].
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    @ Tourlourou, merci de ta suggestion, je vais tester cela avec un TListBox car plus facile à manier comme je dois aussi afficher l'item sélectionné dans un TImage.

    Je placerai un TChekBox pour le choix du fichier photo.jpg avec date ou pas avant le tri.

    Après on verra pour le tri croissant/décroissant.

    @+,

    cincap

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 444
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 444
    Points : 1 331
    Points
    1 331
    Par défaut
    @ tous, avec la suggestion de Tourlourou c'est ok, j'utilise un TListBox, avec choix de l'affichage de la date (propriété du fichier .jpg) et tri croissant/décroissant (TSearchRecObj).

    Encore une petite amélioration de ma fonction à mon retour pour l'affichage de la photo suivant le click sur l'item.

    Je serai absent pendant 8 jours à partir de demain matin.

    Merci à ceux qui ont donné des solutions.

    @+,

    cincap

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

Discussions similaires

  1. Problème pour trier les fichiers d'un dossier par date
    Par Stephane_br dans le forum VB.NET
    Réponses: 7
    Dernier message: 24/07/2012, 16h34
  2. Afficher les fichiers d'un dossier
    Par A_cube dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 16/03/2012, 09h18
  3. parcourir les fichiers d'un dossier, fichier par fichier
    Par gregcat dans le forum Windows Forms
    Réponses: 9
    Dernier message: 18/04/2008, 15h40
  4. Réponses: 7
    Dernier message: 08/01/2007, 19h18
  5. Lister les fichiers d'un dossier par page
    Par bwatex dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 17/08/2006, 19h09

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