Aide: Convertir

Résolu
yosthegost Messages postés 26 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 17 mai 2006 - 21 mars 2006 à 12:24
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012 - 22 mars 2006 à 23:02
Bonjour





Je voudrai Convertir une variable de type string:


exemple





Bonjour en Bonjour.

12 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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)

Mon_String := '&Bonjour';

Mon_Nouveau_String := StringReplace(Mon_String , '&', EmptyStr, [rfReplaceAll, rfIgnoreCase]);
Mon_Nouveau_String := 'Bonjour'

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é

Mon_String := 'DelphiFr c''est cool';
Mon_Nouveau_String := StringReplace(Mon_String , 'CoOl', 'genial', [ rfIgnoreCase]);
Mon_Nouveau_String := 'DelphiFr c''est genial'

Mon_String := 'DelphiFr_c''est_cool';
Mon_Nouveau_String := StringReplace(Mon_String , '_', ' ', [rfReplaceAll ]);
Mon_Nouveau_String := 'DelphiFr c''est cool'

Mon_String := 'DelphiFr_c''est_cool';
Mon_Nouveau_String := StringReplace(Mon_String , '_', ' ', []);
Mon_Nouveau_String := 'DelphiFr c''est_cool'

Voilà c'est tout bonne prog.

@+
Cirec
<HR>
N'oubliez pas de cliquer sur Réponses Acceptée si elle vous convient
3
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
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...


SISI231
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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)

@+
Cirec
3
yosthegost Messages postés 26 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 17 mai 2006
21 mars 2006 à 12:25
Bonjour


Je voudrai Convertir une variable de type string:
exemple


B</gras>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
21 mars 2006 à 12:44
Je pense que tu veux parler des captions des tmenuitem qui ont un de leur caractère souligné.

Si ton bonjour s'affiche ainsi : bonjour c'est ue sa véritable valeur est &bonjour. Il suffit donc de supprimer ce caractère &.

Tu peux par ex utiliser ma fonction ad hoc :

function nettoie_menuitem(s:string):string;

//enlève les caractères & des captions des menuitem

var ss:string;

begin

ss:=s;
delete(ss,pos('&',ss),1);
result:=ss;

end;

Cordialement.

SISI231
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 mars 2006 à 13:21
salut,
désolé Sisi231 encore une fois j'ai pas rafraichi la page avant de poster

@+
Cirec
0
yosthegost Messages postés 26 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 17 mai 2006
21 mars 2006 à 14:54
Grand Merci a tous pour votre aide
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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.

<hr size="2" width="100%">
0
sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 5
22 mars 2006 à 00:05
Oui fOxi mais le & n'est pas toujours en début de chaine !...

A la limite ma fonction de départ semble un bon compromis...

SISI231
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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 l’exécution.





Et pour finir Maître F0xi en a tellement pondu qu’il en a oublié une fonction qu’il 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 do begin
if pS[0] <> C then begin
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)

La suite est ici :
----

@+
Cirec
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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.

et pour supprimer les & on ecrirait :

Caption := CharReplace(Caption,'&',#0);

<hr size="2" width="100%">
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 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
0
Rejoignez-nous