//ReplaceDialog : procédure 3/5 : procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var ReplaceFlags: TReplaceFlags; BeforeSelText, FromSelText: string; OldSelStart: integer; begin ReplaceFlags := []; //Distinguer le texte avant la sélection et celui à partir de with RichEdit1 do begin BeforeSelText := Copy(Lines.Text, 1, SelStart - 1); FromSeltext := Copy(Lines.Text, SelStart, Length(Lines.Text)); //Mémoriser l'emplacement de la sélection qui se trouve perdu après une opération de remplacement OldSelStart := SelStart; end; with Sender as TReplaceDialog do begin if frReplace in Options then {Clic sur le bouton "Remplacer"} begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); {effectuer le remplacement seulement dans le texte qui suit la sélection} RichEdit1.Lines.Text := BeforeSelText + StringReplace(FromSelText, FindText, ReplaceText, ReplaceFlags); {repositionnement du point de départ de la sélection} RichEdit1.SelStart := OldSelStart; GotoNext(RichEdit1, FindText, Options); exit; end; begin {Clic sur le bouton "Tout remplacer"} if frReplaceAll in Options then {Remplacer toutes les occurences} if frMatchCase in Options then RichEdit1.Lines.Text := AnsiReplaceStr(RichEdit1.Lines.Text, FindText, ReplaceText) else RichEdit1.Lines.Text := AnsiReplaceText(RichEdit1.Lines.Text, FindText, ReplaceText); exit; end; end; end;
//ReplaceDialog : procédure 3/5 : procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var ReplaceFlags: TReplaceFlags; BeforeSelText, FromSelText: string; OldSelStart: integer; begin ReplaceFlags : = []; //Distinguer le texte avant la sélection et celui à partir de with RichEdit1 do begin BeforeSelText := Copy(Lines.Text, 1, SelStart - 1); FromSeltext := Copy(Lines.Text, SelStart, Length(Lines.Text)); //Mémoriser l'emplacement de la sélection qui se trouve perdu après une opération de remplacement OldSelStart := SelStart; end; with Sender as TReplaceDialog do begin if frReplace in Options then {Clic sur le bouton "Remplacer"} begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); {effectuer le remplacement seulement dans le texte qui suit la sélection} RichEdit1.Text := BeforeSelText + StringReplace(FromSelText, FindText, ReplaceText, ReplaceFlags); {repositionnement du point de départ de la sélection} RichEdit1.SelStart := OldSelStart; GotoNext(RichEdit1, FindText, Options); exit; end; begin {Clic sur le bouton "Tout remplacer"} if frReplaceAll in Options then {Remplacer toutes les occurences} if frMatchCase in Options then RichEdit1.Text := AnsiReplaceStr(RichEdit1.Text, FindText, ReplaceText) else RichEdit1.Text := AnsiReplaceText(RichEdit1.Text, FindText, ReplaceText); exit; end; end; end;
ShowMessage(Memo1.Text)
ShowMessage(Memo1.Lines.Text)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionunit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, StrUtils; type TForm1 = class(TForm) ReplaceDialog1: TReplaceDialog; btnRemplace: TButton; RichEdit1: TRichEdit; procedure btnRemplaceClick(Sender: TObject); //ReplaceDialog procedure ReplaceDialog1Replace(Sender: TObject); //ReplaceDialog procedure ReplaceDialog1Find(Sender: TObject); //ReplaceDialog private //ReplaceDialog : procédure 1/5 : Recherche l'occurence suivante de FindNext dans Memo et déplace la sélection procedure GotoNext(Memo: TCustomMemo; OldText: string; Options: TFindOptions); end; var Form1: TForm1; implementation {$R *.dfm} //ReplaceDialog : Procédure 2/5 procedure TForm1.btnRemplaceClick(Sender: TObject); begin //La sélection est supposée être le texte à rechercher if RichEdit1.SelLength > 0 then ReplaceDialog1.FindText := RichEdit1.SelText; ReplaceDialog1.Execute; end; //ReplaceDialog : procédure 3/5 : procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var ReplaceFlags: TReplaceFlags; BeforeSelText, FromSelText: string; OldSelStart: integer; begin ReplaceFlags := []; //Distinguer le texte avant la sélection et celui à partir de with RichEdit1 do begin BeforeSelText := Copy(Lines.Text, 1, SelStart - 1); FromSeltext := Copy(Lines.Text, SelStart, Length(Lines.Text)); //Mémoriser l'emplacement de la sélection qui se trouve perdu après une opération de remplacement OldSelStart := SelStart; end; with Sender as TReplaceDialog do begin if frReplace in Options then {Clic sur le bouton "Remplacer"} begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); {effectuer le remplacement seulement dans le texte qui suit la sélection} RichEdit1.Lines.Text := BeforeSelText + StringReplace(FromSelText, FindText, ReplaceText, ReplaceFlags); {repositionnement du point de départ de la sélection} RichEdit1.SelStart := OldSelStart; GotoNext(RichEdit1, FindText, Options); exit; end; begin {Clic sur le bouton "Tout remplacer"} if frReplaceAll in Options then {Remplacer toutes les occurences} if frMatchCase in Options then RichEdit1.Lines.Text := AnsiReplaceStr(RichEdit1.Lines.Text, FindText, ReplaceText) else RichEdit1.Lines.Text := AnsiReplaceText(RichEdit1.Lines.Text, FindText, ReplaceText); exit; end; end; end; //ReplaceDialog : procédure 4/5 : procedure TForm1.ReplaceDialog1Find(Sender: TObject); begin with ReplaceDialog1 do //Rechercher l'occurence suivante ? if frFindNext in Options then GotoNext(RichEdit1, FindText, Options); end; //ReplaceDialog : procédure 5/5 : procedure TForm1.GotoNext(Memo: TCustomMemo; OldText: string; Options: TFindOptions); var //Position de départ de la sélection SelPos: integer; //Sous-texte servant à la recherche de l'occurence suivante SubText: string; //Position de départ pour une recherche du suivant StartPos: integer; const Alpha = ['a'..'z', 'A'..'Z']; begin //déterminer le point de départ de la recherche StartPos := Memo.SelStart + Memo.SelLength + 1; //Rechercher dans le texte à partir du texte qui suit la sélection //ou dans tout le texte si aucune sélection SubText := Copy(Memo.Lines.Text, StartPos, Length(Memo.Lines.Text)); //Faut-il tenir compte de la casse ? if frMatchCase in Options then SelPos := AnsiPos(OldText, SubText) else SelPos := AnsiPos(LowerCase(OldText), LowerCase(SubText)); //Rechercher des mots entiers ? if frWholeWord in Options then if SelPos > 1 then //Vérifier que le caractère qui précéde ou celui qui suit n'est pas un caractère alphabétique if (SubText[SelPos - 1] in Alpha) or (SubText[SelPos + Length(OldText)] in Alpha) then begin //Positionner la sélection après le mot trouvé Memo.SelStart := StartPos + Length(OldText); Memo.SetFocus; Exit; end; if SelPos > 0 then begin Memo.SelStart := StartPos + SelPos - 2; Memo.SelLength := Length(OldText); Memo.SetFocus; end else begin //ShowMessageFmt('"%s" non trouvé ou la ' + sLineBreak + 'fin du texte a été atteinte', [OldText]); ORIGINE MessageBeep(MB_ICONASTERISK); ShowMessageFmt('"%s" non trouvé ou la fin du texte a été atteinte', [OldText]); end; end; END.
Je constate une légère différence de rapidité entre les appels à RichEdit1.Text et à RichEdit1.Lines.text au profit du premier.je suis sous Windows 98se avec processeur à 500 Mhz, ceci expliquant peut-être cela.
Mais rien de rédhibitoire.
J'ai pu aussi constater ce qui suit : le résultat obtenu n'est pas le même quand on fait (Memo1 est du type TRichEdit ici) :Toujours sous le même OS, sur 5 "captures de textes différentes = rien vu en différence de mise en forme.
ShowMessage(Memo1.Text)
et quand on écrite ceci :
ShowMessage(Memo1.Lines.Text)