Also know as
Messages postés259Date d'inscriptionsamedi 13 décembre 2003StatutMembreDernière intervention22 novembre 2010
-
21 avril 2006 à 00:40
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 2019
-
4 déc. 2017 à 07:41
Bonjour à tous,
Voilà je souhaiterais juste pouvoir supprimer plusieurs caractères à la suite.
Je vais chercher dans la base de registre une certaine adresse, par exemple, une clé qui va contenir ceci :
C:\Documents and Settings\All Users\Bureau, et j'aimerais pouvoir enlever le "\Bureau".
Je suis avec cette ligne de code :
for i:=1 to Length(St) do
if St[i]='\Bureau' then Delete(St,i,1);
Mais malheureusement je n'arrive pas à m'en servir correctement...
En effet j'ai beaucoup de mal avec ce genre de chaine...
Donc comment lui faire comprendre que je ne voudrais pas supprimer UN caractère mais plusieurs ?
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 21 avril 2006 à 07:31
salut,
une chose avec:
for i:=1 to Length(St) do
if St[i]='\Bureau' then Delete(St,i,1);
tu auras une superbe erreur de compilation : Type incompatible
en effet tu compares un types char (St[i]) avec un string ('\Bureau')
Pour tester si la chaine St contient la chaine bureau il faut utiliser
la fonction Pos() qui renvoie la position de la sous chaine dans la
chaine et 0 si elle n'y ait pas-->
if pos('\Bureau',St)<>0 then delete(st,pos('\Bureau',st),length('\Bureau'));
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 21 avril 2006 à 16:53
function DeleteString(const S : String; const RemoveString : string) : string;
var
PResult : PChar;
PValue : PChar;
i,c,L : integer;
begin
result := '';
SetLength(result,length(S));
PResult := PChar(result);
PValue := PChar(S);
// on recherche la premiere occurence
i := posex(RemoveString,S,1);
// on place notre compteur a 1
c := 1;
// on calcul la longeur de la chaine a supprimer -1
L := Length(RemoveString)-1;
// si aucune occurence de RemoveString n'est pas trouvée
if i = 0 then begin
// on renvois la chaine S
result := s;
// on sort de la methode
exit;
end;
// tant qu'on est pas au bout de la chaine S
while PValue^ <> #0 do begin
// si la position dans la chaine est differente de la position de l'occurence
// de la chaine a enlever ou que la chaine RemoveString n'est pas trouvée
if (not InRange(c,i,i+L)) or (i = 0) then begin
// on copie les caracteres de S vers Result
PResult[0] := PValue[0];
// on incremente PResult
inc(PResult);
end;
// on incremenete PValue
inc(PValue);
// idem pour C
inc(C);
// si on a depassé l'interval de la derniere occurence de RemoveString
if C > (i+L) then
// on recherche une nouvelle occurence
i := posex(RemoveString,S,i+L);
end;
// enfin, on termine la chaine AZT du resultat
PResult[0] := #0;
end;
voila, pour ceux qui trouverais que cette methode contient beaucoup de code, je vous conseil de lire la suite :
StringReplace est bien mais elle est longue a executée.
Copy, Delete, requiere du code suplementaire et ne sont pas vraiment adapté car de trop nombreux appel finiront par rendre la methode longue a executée.
sur ma methode, on peu supprimer trés vite de longue chaine dans un texte trés gros.
avec un petit bench on obtient :
pour virer ABC d'une chaine de 250 Octets (contenant une repetition de "ABCABCABC-")
10 000 appels a cette methode 63..94ms
ce qui je pense est trés trés raisonnable car le meme test avec StringReplace donne
3 déc. 2017 à 18:54