unit UReplaceDemoMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, StrUtils; type TReplaceDemoMainForm = class(TForm) ReplaceDialog1: TReplaceDialog; Memo1: TMemo; btnSearch: TButton; Panel1: TPanel; Panel2: TPanel; procedure btnSearchClick(Sender: TObject); procedure ReplaceDialog1Replace(Sender: TObject); procedure ReplaceDialog1Find(Sender: TObject); procedure FormCreate(Sender: TObject); private {Recherche l'occurence suivante de FindNext dans Memo et déplace la sélection. } procedure GotoNext(Memo: TCustomMemo; OldText: string; Options: TFindOptions); end; var ReplaceDemoMainForm: TReplaceDemoMainForm; implementation {$R *.dfm} procedure TReplaceDemoMainForm.btnSearchClick(Sender: TObject); begin //La sélection est supposée être le texte à rechercher if Memo1.SelLength > 0 then ReplaceDialog1.FindText := Memo1.SelText; ReplaceDialog1.Execute; end; procedure TReplaceDemoMainForm.ReplaceDialog1Replace(Sender: TObject); var ReplaceFlags: TReplaceFlags; begin ReplaceFlags := []; with Sender as TReplaceDialog do begin //Clic sur le bouton "Remplacer" if frReplace in Options then begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); StringReplace(Memo1.Lines.Text, FindText, ReplaceText, ReplaceFlags); exit; end; //Clic sur le bouton "Tout remplacer" if frReplaceAll in Options then begin //Remplacer toutes les occurences if frMatchCase in Options then Memo1.Lines.Text := AnsiReplaceStr(Memo1.Lines.Text, FindText, ReplaceText) else Memo1.Lines.Text := AnsiReplaceText(Memo1.Lines.Text, FindText, ReplaceText); exit; end; end; end; procedure TReplaceDemoMainForm.ReplaceDialog1Find(Sender: TObject); begin with ReplaceDialog1 do //Rechercher l'occurence suivante ? if frFindNext in Options then GotoNext(Memo1, FindText, Options); end; procedure TReplaceDemoMainForm.FormCreate(Sender: TObject); begin Memo1.Lines.LoadFromFile('UReplaceDemoMain.pas'); end; procedure TReplaceDemoMainForm.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 ShowMessageFmt('"%s" non trouvé ou la ' + sLineBreak + 'fin du texte a été atteinte', [OldText]); end; end.
object ReplaceDemoMainForm: TReplaceDemoMainForm Left = 203 Top = 162 Width = 678 Height = 480 Caption = 'ReplaceDemoMainForm' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 488 Top = 0 Width = 182 Height = 446 Align = alRight TabOrder = 0 object btnSearch: TButton Left = 16 Top = 32 Width = 145 Height = 25 Caption = '&Rechercher/Remplacer' TabOrder = 0 OnClick = btnSearchClick end end object Panel2: TPanel Left = 0 Top = 0 Width = 488 Height = 446 Align = alClient TabOrder = 1 object Memo1: TMemo Left = 16 Top = 17 Width = 452 Height = 417 ScrollBars = ssBoth TabOrder = 0 end end object ReplaceDialog1: TReplaceDialog FindText = 'Memo1' Options = [frDown, frFindNext] OnFind = ReplaceDialog1Find OnReplace = ReplaceDialog1Replace Left = 392 Top = 32 end end
if frReplace in Options then begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); Memo1.Lines.Text := StringReplace(Memo1.Lines.Text, FindText, ReplaceText, ReplaceFlags); //---> sélectionner l'occurence suivante GotoNext(Memo1, FindText, Options); exit; end;
procedure TReplaceDemoMainForm.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 Memo1 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 {Clic sur le bouton "Remplacer"} if frReplace in Options then begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); {effectuer le remplacement seulement dans le texte qui suit la sélection} Memo1.Lines.Text := BeforeSelText + StringReplace(FromSelText, FindText, ReplaceText, ReplaceFlags); {repositionnement du point de départ de la sélection} Memo1.SelStart := OldSelStart; GotoNext(Memo1, FindText, Options); exit; end; {Clic sur le bouton "Tout remplacer"} if frReplaceAll in Options then begin {Remplacer toutes les occurences} if frMatchCase in Options then Memo1.Lines.Text := AnsiReplaceStr(Memo1.Lines.Text, FindText, ReplaceText) else Memo1.Lines.Text := AnsiReplaceText(Memo1.Lines.Text, FindText, ReplaceText); exit; end; end; end;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionif frReplace in Options then begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); Memo1.Lines.Text := StringReplace(Memo1.Lines.Text, FindText, ReplaceText, ReplaceFlags); exit; end;
//Clic sur le bouton "Remplacer" //********************************** if frReplace in Options then begin if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); Memo1.Lines.Text := StringReplace(Memo1.Lines.Text, FindText, ReplaceText, ReplaceFlags); //---> sélectionner l'occurence suivante GotoNext(Memo1, FindText, Options); exit; end;
Memo1.SelText := ReplaceText;
//Clic sur le bouton "Remplacer" if frReplace in Options then begin Memo1.SelText := ReplaceText; // <-------------- ici if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); Memo1.Lines.Text : = StringReplace(Memo1.Lines.Text, FindText, ReplaceText, ReplaceFlags); //---> sélectionner l'occurence suivante GotoNext(Memo1, FindText, Options); exit; end;
... //Clic sur le bouton "Remplacer" //********************************** if frReplace in Options then begin Memo1.SelText := ReplaceText; // <---------- Ici en premier if not (frMatchCase in Options) then include(ReplaceFlags, rfIgnoreCase); // Ci-dessous en second afin de neutraliser le "saut haut" du curseur //////////Memo1.Lines.Text := StringReplace(Memo1.Lines.Text, FindText, ReplaceText, ReplaceFlags); //---> sélectionner l'occurence suivante GotoNext(Memo1, FindText, Options); exit; end; //Clic sur le bouton "Tout remplacer" if frReplaceAll in Options then begin ...