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

Composants VCL Delphi Discussion :

Problème pour purger une TListBox


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 9
    Par défaut Problème pour purger une TListBox
    Salut a toutes et a tous !

    Je suis débutant sous Delphi, voici mon problème, j'ai créer un petit programme qui télécharger une page web (HTML, PHP, Etc...) et l'enregistre au format *.txt sur le PC, j'ai ensuite fait en sorte que toutes les URL de cette page aille se loger dans une ListBox, le problème est que je veus ne garder que les URL menant vers une page web, donc j'ai fait une boucle while pour "purgé" cette ListBox des .gif, .jpg, .exe, .zip, etc, le problème est que quand la ListBox est asser conséquente cette boucle fonctionne trés mal est quelle dois être exécuter plusieurs fois pour TOUT purger enlevant a chaque fois quelques "intrus" mais pas tous a mon grand regret.

    Voici le code utilisé sur un bouton pour viré les .gif par exemple :
    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.BtnPurgerUrlClick(Sender: TObject);
    var i:integer;
    begin
      i:=0;
      while i < ListUrlFind.Items.Count do
      begin
        if Pos('.gif', ListUrlFind.Items.Strings[i]) <> 0 then
        begin
          ListUrlFind.Items.Delete(i);
        end;
        i := i + 1;
      end;
    end;
    Là par exemple je dois appuyer 5 fois sur le bouton pour une ListBox contenant 134 Items, dont une quarantaine de .gif a viré et a chaque fois que j'appuis a la place de viré tous les .gif ça n'en vire que quelqu'un ?

    Si quelqu'un a une solution a mon problème je lui en serait trés reconnaissant !

    Merci par avance de votre aide !

    Cordialement.

    KoraS

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    - Bon déjà, édite ton messages et met ton code dans les balises du même nom
    - Ensuite Indente-le! C'est 10x plus facile à lire...
    - Et puis là, utilise for...do! pourquoi tu t'embêtes à utiliser while?
    - Et puis lorsque tu fais une recherche dans un nom de fichier, utilise LowerCase pour n'avoir que des minuscules... Ou UpperCase pour des majuscules...
    -Pour finir, tu devrais parcourir ta liste dans le sens inverse! C'est beaucoup plus sûr...
    Voilà comment je l'adapterais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.BtnPurgerUrlClick(Sender: TObject);
    var i:integer;
    begin
      for i:=ListUrlFind.Items.Count-1 downto 0 do
        if Pos('.gif', LowerCase(ListUrlFind.Items.Strings[i])) <> 0 then
          ListUrlFind.Items.Delete(i);
    end;
    Voila
    Mais là tu ne filtres que les .gif...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    à votre place, je testerai plûtot si les 4 derniers caractères sont '.gif' car si le fichier se nomme 'blabla.gif.back' ...

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par smyley
    à votre place, je testerai plûtot si les 4 derniers caractères sont '.gif' car si le fichier se nomme 'blabla.gif.back' ...
    Dans ce cas, pourquoi ne pas utiliser ExtractFileExt ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  5. #5
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 9
    Par défaut
    Merci beaucoup de votre aide et désolé pour les erreurs de post...je n'ai pas l'habitude !

    Je vais essayer ça et je vous tiens au courant.

    Merci encore !

    KoraS

  6. #6
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 9
    Par défaut
    Alors la, je dois dire châpeau, ça fonctionne nickel, plus aucun problème, je ne comprend pas pourquoi, le fait de "scanner" la ListBox en sens inverse fonctionne mieux que dans le "bon" sens, mais ça fonctionne est c'est le principal, mille mercis !

    ENcore une petite question : A votre avis est ce que je dois, pour filtrer les autres extensions (.jpg, .zip, .exe, etc....) ajouter des OR a la condition genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Pos('.gif',ListImgFind.Items.Strings[i]) = 0) OR (Pos('.jpg',ListImgFind.Items.Strings[i]) = 0) OR Etc...
    ou bien créer une boucle pour chaque extension ?

    Merci par avance de votre aide !

    KoraS

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    Parce que quand tu parcours la listbox en sens "normal" 0 -> n et que tu supprime un element de la listbox, tous les élements suivants seront décalés d'un rang, donc tu vas passer l'élément qui juste derrière celui que tu viens d'effacer, en plus il y a aura des violations d'accés quand tu tenteras d'accéder à des éléments n'existant plus (dans le cas du for).

    Quand tu veux supprimer des éléments dans une liste, il faut toujours partir du bout de la liste car les éléments qui seront décalés auront déjà été traités.

    Pour filtrer tes extensions, regarde du coté de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function AnsiMatchText(const AText: string; const AValues: array of string): Boolean;
    function AnsiIndexText(const AText: string; const AValues: array of string): Integer;

  8. #8
    Membre habitué
    Profil pro
    Resp
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Resp

    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par défaut
    En marche avant ou arriere peu importe. Ton code était quasiment bon il te manquait simplement un else:

    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.BtnPurgerUrlClick(Sender: TObject);
    var i:integer;
    begin
      i:=0;
      while i < ListUrlFind.Items.Count do
      begin
        if Pos('.gif', ListUrlFind.Items.Strings[i]) <> 0 then
        begin
          ListUrlFind.Items.Delete(i);
        end
        else  <=========ICI
           i := i + 1;
      end;
    end;
    Et oui, supprime le l'element 0, et l'element n°1 passe alors en 0 et donc à ce moment, il ne faut pas incrementer le n0 de la ligne à vérifier...


    ou bien créer une boucle pour chaque extension ?
    Il vaux mieux faire une fonction à mon humble avis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function CheckExt( FileName : TFileName) : Boolean;
    const
        badext : Array[1..20] of String ('.gif','.jpg',....);
    var
       nI : Integer;
    begin
         result := True;
         For nI := low( badExt) to High( BadExt ) do
         begin
            result := result and not SameText( badExt[nI], ExtractFileExt(FileName) );
            if not result then break;
         end;
    end;
    Rempli le tableau BadExt selon tes besoins et seulement ca, le reste de la fonction gérant dynamiquement cette taille
    (on peut faire en sorte que la fonction soit plus rapide, mais la, j'avoue, j'ai la flemme :p )

  9. #9
    Membre confirmé Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Par défaut
    Edit : trop de cross ^^

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    La boucle for nettement plus propre, et elle est plus optimisée (calcul du Count une seule fois, le for est plus optimisé que le while,...)

  11. #11
    Membre habitué
    Profil pro
    Resp
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Resp

    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par défaut
    Allez ... version optimisée..

    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
     
    function CheckExt( FileName : TFileName) : Boolean;
    const
        badext : Array[1..20] of String ('.gif','.jpg',....);
    var
       nI,
       nMax, 
       nMin  : Integer;
       aExt : String;
    begin
         result := True;
         aExt  := ExtractFileExt(FileName);
         nMin  := low( badExt);
         nMax := High( badExt );
         For nI := nMin to nMax do
         begin
            result := result and not SameText( badExt[nI], aExt );
            if not result then break;
         end;
    end;

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Par défaut
    Je parlais de la boucle pour le parcours des elements de la liste.

    Par ailleurs pourquoi réinventer la roue pour le filtre, les fonctions que j'ai donné font exactement la même chose

  13. #13
    Membre habitué
    Profil pro
    Resp
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Resp

    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Par défaut
    Citation Envoyé par cpdump
    Je parlais de la boucle pour le parcours des elements de la liste.

    Par ailleurs pourquoi réinventer la roue pour le filtre, les fonctions que j'ai donné font exactement la même chose
    Simplement pour mieux maitriser des petits algos . Apres, effectivement, tu peux utiliser des fonctions toutes faites, mais pour l'apprentissage....

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  2. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [MSSQL] Problème pour sélectionner une seule occurence
    Par Tinfolley dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/07/2004, 09h02
  5. Réponses: 3
    Dernier message: 29/08/2003, 10h57

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