yosthegost
Messages postés26Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention17 mai 2006
-
21 mars 2006 à 12:24
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012
-
22 mars 2006 à 23:02
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 21 mars 2006 à 13:17
Salut,
pour ton problème il faut retirer le caratère " & " de ton string pour cela tu as la fonction StringReplace de l'unité SysUtils:
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
rfReplaceAll : Remplace tous les caractères où chaine "OldPattern" par "NewPattern" dan "S" si rfReplaceAll n'est pas spécifié c'est le premier caractère rencontré qui serat modifié.
rfIgnoreCase : Ne tiend pas compte de la case (Majuscule Minuscule)
En Bleu le texte à modifier.
En Rouge le caractère qui doit être remplacé (peut aussi être une chaine de caractères)
En Violet le caractère où chaine de remplacement EmptyStr renvoie une chaine vide ce qui est égale à ''
En Vert le résultat modifié
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 20135 21 mars 2006 à 13:37
Cirec c'est rien et que pense-tu de la fonction AnsiReplaceStr ou AnsiReplaceText de StrUtils aussi ?
Enfin, j'y ai repensé et me suis dit qu'une fonction parfaite prendrait en compte les & échappés (&&) mais j'ai la flemme d'y réfléchir et elle ne sera utile que pour des cas bien particuliers...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 21 mars 2006 à 13:59
Ces deux fonctions utilisent StringReplace.
Elles permettent une utilisation plus simple de StringReplace (pas de paramètres Flags à fournir) mais moins de possibilitées (voir mon poste)
function AnsiReplaceText(const AText, AFromText, AToText: string): string;
begin Result := StringReplace(AText, AFromText, AToText, [rfReplaceAll, rfIgnoreCase]);
end ;
function AnsiReplaceStr(const AText, AFromText, AToText: string): string;
begin Result : = StringReplace(AText, AFromText, AToText, [rfReplaceAll]);
end;
et il en existe deux autres :
ReplaceText et ReplaceStr mais elles font appel respectivement à AnsiReplaceText et AnsiReplaceStr
Voilà on tourne toujours autour de StringReplace alors autant la connaitre pour pouvoir l'utiliser pleinnement (enfin c'est mon avis)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 21 mars 2006 à 23:37
Attention, attention, StringReplace est une fonction trés lente.
voici deux methodes pour enlever un caractere en debut de chaine, l'une se base sur stringreplace et l'autre sur une inversion de chaine :
function UnLinkizeRVS(const S : string; const C : char) : string;
begin
result := ReverseString(S);
while result[Length(result)] = C do
SetLength(result,Length(Result)-1);
result := ReverseString(result);
end;
function UnLinkizeSRP(const S : string; const C : char) : string;
begin
result :=StringReplace(S,C,'',[rfReplaceAll]);
end;
UnLinkizeRVS, ~78ms pour 100KR (millier de requettes)
UnLinkizeSRP, ~250ms pour 100KR.
je te conseil d'utiliser la methode d'inversion de chaine qui est plus rapide.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 22 mars 2006 à 00:53
Ne vous prenez pas la tête pour des millisecondes surtout qu'il n'y a pas 100 000 entrés dans un menu
s'il y en a 100 à faire c'est déjà beaucoup et là le temps, ben pardon, mais personne ne remarquera la différence.
En suite sur des gros traitement la oui ça devient intéressant de faire attention à ce genre de détails pour aller au plus vite mais bien souvent le nombre de traitement reste inférieur au millier et la, à moins d'avoir créer une fonction qui bouffe de la mémoire à chaque passage, la différence de performance n'est pas perceptible lors de lexécution.
Et pour finir Maître F0xi en a tellement pondu quil en a oublié une fonction quil avait écrite et qui était pas mal en performance et en plus elle change tous les caractères.
-----
// Function de F0xi pour changer tous les caractères dans un String
function SuppChar(const S : string; const C : char) : string;
var pS, pR : PChar;
begin Result := '';
SetLength(Result, length(S));
pS := PChar(S);
pR := PChar(Result);
While pS^ <> #0 dobegin if pS[0] <> C thenbegin pR[0] : = pS[0];
Inc(pR);
end;
Inc(pS);
end;
end;
500000 requettes sur une chaine de 60 caracteres :
ma fonction : 1219ms (1.2 secondes)
StringReplace : 5328ms (5.3 secondes)
50000 requettes sur une chaine de 255 caracteres :
ma fonction : 1641ms (1.6 secondes)
StringReplace : 22578ms (22.6 secondes)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 22 mars 2006 à 03:51
Oui en effet, j'avais completement oublier ... j'en profite donc pour la mettre dans un .pas sur mon delphi...
au passage, remerciez Florenth sans qui je n'aurais pus ecrire ce genre de fonction dont les performance sont sacrement élevée.
a 1640ms / 500KR, pour du string[255] ça nous donne 0.003ms pas requette.
en meme temps, StringReplace peu remplacer des sous-chaine complete alors que SuppChar ne supprime que des caracteres... ce qui est moins lourd.
bizarrement, il n'existe pas en natif dans delphi une fonction ne supprimer que 1 caractere dans toute la chaine.
et pourtant ... cela pourrait etre utile.
et meme si on réecris la fonction comme ceci :
function CharReplace(const S : string; const Old,New : char) : string;
var pS, pR : PChar;
begin
Result := '';
SetLength(Result, length(S));
pS := PChar(S);
pR := PChar(Result);
While pS^ <> #0 do begin
if pS[0] <> Old then begin
pR[0] := pS[0];
Inc(pR);
end else
if New <> #0 then begin
pR[0] := New;
Inc(pR);
end;
Inc(pS);
end;
end;
on obtient une fonction dans le style StringReplace mais specialisée pour les Caractere et non les sous-chaines.
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 22 mars 2006 à 23:02
on peut également cité CXPOS, CXPOS est 25 fois plus rapide que StringReplace et offre aussi d'autres routines otpimisés, le site est actuellement HS mais vous pouvez télécharger une copie sur http://www.torry.net/vcl/vcltools/text/CXPOS.ZIP