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

API, COM et SDKs Delphi Discussion :

[FindNext] Probleme de resultat inattendus !


Sujet :

API, COM et SDKs Delphi

  1. #21
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par sjrd
    Citation Envoyé par Clorish
    C'ets pour ca que souvent Windows se trouve avant les autres car si une fontion existe en double, seulle la derniere trouvee dans l'ordre de parcours des unitees declarees est utilise par defaut.

    Cet ordre permet donc d'utiliser par defaut celles de Borland par rapport a celle de Windows.
    Aaaarrrrgggg ! Non c'est tout le contraire justement. C'est la première trouvée qui est utilisée ! Donc par défaut celle de Windows...
    Désolé, mais je doit donner raison a Clorish, en effet si l'on mets Windows en premier, SysUtils devient prioritaire, et si l'on fait l'inverse c'est a dire Uses : SysUtils, Windows ..., hé bien le code invoquer vient bien de la procedure Windows, c'est trés facile a voir avec l'invoquation du code.

    Maintenant j'ai essayer en mettant la procedure SysUtils en premier, cela ne fonctionnne toujour pas, et pour dire j'ai même essayer avec les appel au fonction précédé de Windows. ! résultat, cela ne fonctionne toujour pas, voici le code avec la fonction fournis par edam (et en entier !):

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    unit Unit1;
     
    interface
     
    uses
      Messages, SysUtils, Windows, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
        string4 = String[4];
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        Function  Recherche(mot:string;ext:string4;list:TStrings):integer;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Files: String; PropF: TSearchRec;
    label FNext;
    begin
        Memo1.Clear;
        Recherche(Edit1.Text,'.txt',Memo1.Lines);
    end;
     
    Function  TForm1.Recherche(mot:string;ext:string4;list:TStrings):integer;
    var
         h:Thandle ;
         sr: TWin32FindData;
         c:integer;
    begin
         h:=Windows.FindFirstFile(pchar(mot+ext), sr);
         //sr.dwFileAttributes :=$3F;
         c:=0;
         if h <> INVALID_HANDLE_VALUE then
          begin
            repeat
              if ((sr.dwFileAttributes or 3)=3) or (sr.dwFileAttributes =$20) then
               begin
                inc(c);
                List.Add(string(sr.cFileName) );
               end;
            until not Windows.FindNextFile(h,sr);
            Windows.FindClose(h);
          end;
         result:=c ;
    end;
     
    end.
    Le résultat pour la chaine rechercher " *1.txt "
    Est : LISEZMOI2.TXT et README1.TXT

    hors moi j'attendait plutot LISEZMOI1.TXT, mais je peut dire, que la, ça fonctionne nul part, contrairement a ma premiére procédure qui elle fonctionnait au moin dans 1 dossier. En toute franchise je comence a désespérer.

  2. #22
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par cpdump
    Peut être que la recherche se base aussi sur le nom en au format DOS (8.3), affiche aussi le short name qui est dans TSearchRec.TWin32FindData.cAlternateFileName
    C'est encore moi, je vient d'essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    var Files: String; PropF: TSearchRec; 
    label FNext; 
    begin 
        Memo1.Clear;
        Memo2.Clear;
        Files:=Edit1.Text;
        if SysUtils.FindFirst(Files,faAnyFile,PropF) = 0 then
            repeat
                Memo1.Lines.Add(PropF.Name);
                Memo2.Lines.Add(PropF.FindData.cAlternateFileName);
            until SysUtils.FindNext(PropF) <> 0;
        SysUtils.FindClose(PropF);
    end;
    Le 1er dossier est G:\README\Norton\ et contient les fichiers :
    - Lisezmoi1.txt
    - LISEZMOI2.TXT
    - lisezmoi3.txt
    - lisezmoi4.txt
    - README1.TXT
    - README2.TXT
    - Readme3.txt

    Le 2eme dossier est G:\README\README\ et contient les même fichiers, en clair c'est une copie, j'ai juste renommé "Norton" en "README" : - Lisezmoi1.txt
    - LISEZMOI2.TXT
    - lisezmoi3.txt
    - lisezmoi4.txt
    - README1.TXT
    - README2.TXT
    - Readme3.txt

    Pour la chaine rechercher " 1*.txt "

    Le resultat est pour le 1er dossier :

    nom long______________nom court
    Lisezmoi1.txt___________LISEZM~4.TXT
    LISEZMOI2.TXT__________LISEZM~1.TXT
    README1.TXT

    Le resultat est pour le 2eme dossier :

    nom long______________nom court
    Lisezmoi1.txt___________LISEZM~1.TXT
    README1.TXT

    J'ai l'impression que dans les nom court il en manque ! c'est vraiment bizarre que cela fonctionne dans le dossier 2 et pas dans le dossier 1, non ?
    Moi perso, je sais c'est plus quoi faire, est-ce que ça fait le même chose chez vous ? moi j'ai delphi7, j'espére que c'est pas un bug ?

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Les noms courts ne sont pas forcément les mêmes en cas de copie du répertoire, cela dépend de plusieurs choses, mais je ne rentrerai pas dans le détail.

    Ce que tu dois faire, c'est une recherche avec '*.*', puis ajouter un test sur le nom long avec l'expression '1*.txt ' dans ta boucle.

    http://www.latiumsoftware.com/en/delphi/00018.php
    http://www.latiumsoftware.com/en/delphi/00019.php

  4. #24
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par cpdump
    Ce que tu dois faire, c'est une recherche avec '*.*', puis ajouter un test sur le nom long avec l'expression '1*.txt ' dans ta boucle.
    Merci pour l'info, mais mon probleme est que ce petit bout de code vient en fait d'une application, que j'essaye de réalisé, et dans cette application j'ai une option de recherche de fichier qui prend en compte des commande personnaliser, en clair il s'agit d'une petite ligne de commande, et l'utilisateur pourra donc mettre différente commande associer au caractéré générique, il en resultera donc un format finale assez complexe au niveau de la chaine rechercher, par exemple : " Fichier* du ??/??/??*save.* " J'ai bien entendus éxagérer, mais je pense qu'il faut prévoir ce que l'utilisateur va mettre dans ça ligne de com, et tout ça pour dire que je n'aurais surement pas 1 seul caractére générique mais plusieur, et la ça devient assez compliquer, c'est pour ça que FindNext était pratique, enfin bref si je doit corriger FindNext il va falloir detecter les position des différent caractére générique etc...

    J'aurai voulus savoir par hasard, si cela se reproduit sur une autre machine ? cela me permetrait de tirer un trait sur tout ça, et de faire la procédure de recherche moi même !

Discussions similaires

  1. probleme de resultat avec requete possedant des jointures
    Par JUSTIN Loïc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2006, 16h13
  2. [XSLT] probleme de resultat retourné par une variable
    Par coucouA dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 16/08/2006, 11h05
  3. [SGBD] probleme de résultat mysql_fetch_object
    Par griese dans le forum Administration
    Réponses: 3
    Dernier message: 08/06/2006, 12h05
  4. Problemes de resultats d'une procédure stockées
    Par gregb34 dans le forum Oracle
    Réponses: 16
    Dernier message: 09/05/2006, 12h54
  5. Probleme UPDATE resultat trop long
    Par Tonio_1394 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/10/2004, 11h50

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