Problème avec Pos(S1, S2)

Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
- - Dernière réponse : cs_cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
- 1 avril 2008 à 22:52
Bonjour, j'ai un petit problème avec la fonction Pos (pour trouver une sous-chaine dans une chaine).
En fait j'essaye de faire un nettoyeur de cookies, mais qui épargne certains cookies (par exemple ceux de DelphiFr ) avec une liste de mots. Exemple : dans la liste il y a le mot DelphiFr, et dans un cookie il y a DelphiFr (mais au milieu). Normalement, on ne devrait pas le supprimer, mais il le supprime quand meme :(
Quelqu'un saurait-il pourquoi la fonction pos ne marche pas avec moi? Voici ma propre fonction qui reprend Pos :

function ScanLign(Chaine, Mot: String): Boolean;
begin
     if Pos(Mot, Chaine) = 0 then Result := False else Result := True;
end;

Cordialement, Bacterius !
Afficher la suite 

7 réponses

Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Pos
fait la distinction majuscules/minuscules...
vérifie cette condition...

cantador
Commenter la réponse de cs_cantador
Messages postés
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1
0
Merci
function ScanLign(Chaine, Mot: String): Boolean;
begin
  Result := Pos(UpperCase(Mot), UpperCase(Chaine)) <> 0;
end;
Commenter la réponse de japee
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Bonjour, j'ai essayé ta fonction Japee mais meme problème je pense que ca doit venir de mon code. En fait c'est ca :

if CheckListBox1.Checked[0] = True then for I : = 0 to FileListBox1.Items.Count - 1 do
          begin               for Z :0 to Form2.Mots.Items.Count - 1 do <gras>if ScanLign(FileListBox1.Items.Strings[I], Form2.Mots.Items.Strings[Z]) </gras> False thenif DeleteFile(FileListBox1.Directory + '\' + FileListBox1.Items.Strings[I]) = True then C : = C + 1;
          end;

Tout ca dans un timer ...
Si l'item 0 de la checkbox est activé alors pour chacun des cookies de la liste de fichiers, on regarde si on trouve un mot de la liste de "mots" (cookies à epargner) alors rien et si on ne le trouve pas alors on supprime.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Tout le code fonctionne bien mais il y a une erreur de logique :

Il faut déclencher l'évènement (la suppression) après avoir testé entièrement les deux boucles des deux chaînes.

cantador
Commenter la réponse de cs_cantador
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Bonjour, il y a toujours un problème, ca ne marche toujours pas. Et je ne comprends pas ta remarque cantador ... je teste bien juste avant la suppression et si le mot n'est pas trouvé alors il ne supprime pas ... Pourrais-tu mieux m'expliquer s'il te plaît ? Ca supprime tous les cookies de la meme facon ...

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
et si on ne le trouve pas alors on supprime.







et si le mot n'est pas trouvé alors il ne supprime pas ..







Faudrait savoir ?

cantador
Commenter la réponse de cs_cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
par ailleurs j'ai re-testé le code et en fait celui fonctionne bien :
 
var
  Form1: TForm1;


implementation


{$R *.dfm}


function ScanLign(Chaine, Mot: string): Boolean;
begin
  Result := Pos(UpperCase(Mot), UpperCase(Chaine)) <> 0;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i, z, c: integer;
begin
 c:= 0;
  for I := 0 to FileListBox1.Items.Count - 1 do
  begin
    for Z := 0 to Mots.Items.Count - 1 do
      if ScanLign(FileListBox1.Items.Strings[I], Mots.Items.Strings[Z]) = False then
        if DeleteFile(FileListBox1.Directory + '\' + FileListBox1.Items.Strings[I]) = True
          then C := C + 1;
  end;
ShowMessage(IntToStr(C) + ' Cookies supprimés');
end;


end.

nb: j'espère que tu initialises bien ton directory car sinon il prend par défaut le dossier du source de ton programme..

cantador
Commenter la réponse de cs_cantador