hyper66
asked on
how do i find text, find next and replace text?
how do i find text, find next and replace text in a memo field??? and not have the search case sensitive?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Adjusted points to 150
hyper66
Ok, here is some code to use the find/replace dialog to find text and replace it...
procedure TForm1.Button1Click(Sender : TObject);
begin
ReplaceDialog1.Position := Point(Memo1.Left + Memo1.Width, Memo1.Top);
ReplaceDialog1.Execute;
end;
procedure TForm1.ReplaceDialog1Find( Sender: TObject);
var
FoundAt: LongInt;
StartPos, ToEnd: integer;
begin
with Memo1 do
begin
{ begin the search after the current selection if there is one }
{ otherwise, begin at the start of the text }
if SelLength <> 0 then
StartPos := SelStart + SelLength;
else
StartPos := 0;
{ ToEnd is the length from StartPos to the end of the text in the rich edit control }
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(ReplaceDialog1.Fi ndText, StartPos, ToEnd, [stHideMatchCase]);
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(ReplaceDialog1.Find Text);
end;
end;
end;
and for the replace...
procedure TForm1.ReplaceDialog1Repla ce(Sender: TObject);
var
SelPos: Integer;
begin
with TReplaceDialog(Sender) do
begin
{ Perform a global case-sensitive search for FindText in Memo1 }
SelPos := Pos(FindText, Memo1.Lines.Text);
if SelPos > 0 then
begin
Memo1.SelStart := SelPos - 1;
Memo1.SelLength := Length(FindText);
{ Replace selected text with ReplaceText }
Memo1.SelText := ReplaceText;
end
else MessageDlg(Concat('Could not find "', FindText, '" in Memo1.'), mtError, [mbOk], 0);
end;
end;
Later
BoRiS
Ok, here is some code to use the find/replace dialog to find text and replace it...
procedure TForm1.Button1Click(Sender
begin
ReplaceDialog1.Position := Point(Memo1.Left + Memo1.Width, Memo1.Top);
ReplaceDialog1.Execute;
end;
procedure TForm1.ReplaceDialog1Find(
var
FoundAt: LongInt;
StartPos, ToEnd: integer;
begin
with Memo1 do
begin
{ begin the search after the current selection if there is one }
{ otherwise, begin at the start of the text }
if SelLength <> 0 then
StartPos := SelStart + SelLength;
else
StartPos := 0;
{ ToEnd is the length from StartPos to the end of the text in the rich edit control }
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(ReplaceDialog1.Fi
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(ReplaceDialog1.Find
end;
end;
end;
and for the replace...
procedure TForm1.ReplaceDialog1Repla
var
SelPos: Integer;
begin
with TReplaceDialog(Sender) do
begin
{ Perform a global case-sensitive search for FindText in Memo1 }
SelPos := Pos(FindText, Memo1.Lines.Text);
if SelPos > 0 then
begin
Memo1.SelStart := SelPos - 1;
Memo1.SelLength := Length(FindText);
{ Replace selected text with ReplaceText }
Memo1.SelText := ReplaceText;
end
else MessageDlg(Concat('Could not find "', FindText, '" in Memo1.'), mtError, [mbOk], 0);
end;
end;
Later
BoRiS
Hi hyper66, BoRiS,
BoRiS
FindText(... is not available in MemoComponent,
Hyper66,
not the best solution follows,
Function StrUp (S : String) : String;
{ used for not casesensitive }
var i : Integer;
begin
for i := 1 to length(s) do s[i] := UpCase(s[i]);
result := s;
end;
procedure TForm1.ReplaceDialog1Repla ce(Sender: TObject);
{ Only for ReplaceButton in ReplaceDialog }
var
SelPos: Integer;
SelTmp: Integer;
begin
if Memo1.sellength > 0 then
Selpos := Memo1.SelStart + Memo1.SelLength
else
SelPos := Memo1.SelStart;
if selpos = 0 then
Selpos := pos(StrUp(ReplaceDialog1.F indText),S trUp(memo1 .text))
else
begin
SelTmp := Selpos;
Selpos := pos(StrUp(ReplaceDialog1.F indText),c opy(StrUp( memo1.text ),selpos,l ength(memo 1.text)- selpos )) - 1;
if selpos > 0 then selpos := selpos + seltmp;
end;
if SelPos > 0 then
begin
Memo1.SelStart := SelPos - 1;
Memo1.SelLength := Length(ReplaceDialog1.Find Text);
Memo1.SelText := ReplaceDialog1.ReplaceText ;
end
else MessageDlg(ReplaceDialog1. FindText + ' not found in Memo1', mtError, [mbOk], 0);
end;
meikl
BoRiS
FindText(... is not available in MemoComponent,
Hyper66,
not the best solution follows,
Function StrUp (S : String) : String;
{ used for not casesensitive }
var i : Integer;
begin
for i := 1 to length(s) do s[i] := UpCase(s[i]);
result := s;
end;
procedure TForm1.ReplaceDialog1Repla
{ Only for ReplaceButton in ReplaceDialog }
var
SelPos: Integer;
SelTmp: Integer;
begin
if Memo1.sellength > 0 then
Selpos := Memo1.SelStart + Memo1.SelLength
else
SelPos := Memo1.SelStart;
if selpos = 0 then
Selpos := pos(StrUp(ReplaceDialog1.F
else
begin
SelTmp := Selpos;
Selpos := pos(StrUp(ReplaceDialog1.F
if selpos > 0 then selpos := selpos + seltmp;
end;
if SelPos > 0 then
begin
Memo1.SelStart := SelPos - 1;
Memo1.SelLength := Length(ReplaceDialog1.Find
Memo1.SelText := ReplaceDialog1.ReplaceText
end
else MessageDlg(ReplaceDialog1.
end;
meikl
hi hyper66,
this works like find and replace in wordpad
wholeword and raplace all are not implemented
you can search casesensitive or not
unit f_r_u;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
ReplaceDialog1: TReplaceDialog;
procedure Button1Click(Sender: TObject);
procedure ReplaceDialog1Find(Sender: TObject);
procedure ReplaceDialog1Replace(Send er: TObject);
procedure ReplaceDialog1Close(Sender : TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
oldpos : integer; {Hold CursorPos before enter Dialog}
procedure TForm1.Button1Click(Sender : TObject);
begin
oldpos := memo1.selstart;
Replacedialog1.FindText := copy(Memo1.text,memo1.sels tart+1,mem o1.selleng th); {If selected something then take it over}
ReplaceDialog1.Execute;
end;
Function StrUp (S : String) : String;
{ Use for none CaseSensitivity }
var i : Integer;
begin
for i := 1 to length(s) do s[i] := UpCase(s[i]);
result := s;
end;
procedure TForm1.ReplaceDialog1Find( Sender: TObject);
var
FCase : Integer;
SelTmp: Integer;
SelPos: Integer;
begin
{ Check For CaseSens }
if frmatchcase in replacedialog1.Options then
fCase := 1
else fcase := 0;
if Memo1.sellength > 0 then
Selpos := Memo1.SelStart + Memo1.SelLength
else
SelPos := Memo1.SelStart;
case fCase of
0 : Begin
if selpos = 0 then
Selpos := pos(StrUp(ReplaceDialog1.F indText),S trUp(memo1 .text))
else
begin
SelTmp := Selpos;
Selpos := pos(StrUp(ReplaceDialog1.F indText),c opy(StrUp( memo1.text ),selpos,l ength(memo 1.text)- selpos )) - 1;
if selpos > 0 then selpos := selpos + seltmp;
end;
end;
1 : Begin
if selpos = 0 then
Selpos := pos(ReplaceDialog1.FindTex t,memo1.te xt)
else
begin
SelTmp := Selpos;
Selpos := pos(ReplaceDialog1.FindTex t,copy(mem o1.text,se lpos,lengt h(memo1.te xt)- selpos )) - 1;
if selpos > 0 then selpos := selpos + seltmp;
end;
end;
end;
if SelPos > 0 then
begin
Memo1.SelStart := SelPos - 1;
Memo1.SelLength := Length(ReplaceDialog1.Find Text);
end
else MessageDlg(ReplaceDialog1. FindText + ' not found in Memo1 nicht finden.', mtError, [mbOk], 0);
memo1.setfocus; {Force Memo, to show selection}
end;
procedure TForm1.ReplaceDialog1Repla ce(Sender: TObject);
begin
if Memo1.sellength > 0 then
if frmatchcase in replacedialog1.Options then
if Replacedialog1.Findtext = copy(memo1.text,memo1.sels tart+1,mem o1.selleng th) then
Memo1.SelText := ReplaceDialog1.ReplaceText
else
Replacedialog1find(self)
else
if StrUp(Replacedialog1.Findt ext) = StrUp(copy(memo1.text,memo 1.selstart +1,memo1.s ellength)) then
Memo1.SelText := ReplaceDialog1.ReplaceText
else
Replacedialog1find(self)
else
Replacedialog1find(self)
end;
Procedure TForm1.ReplaceDialog1Close (Sender: TObject);
begin
memo1.selstart := oldPos;
memo1.sellength := 0;
end;
end.
Meikl
this works like find and replace in wordpad
wholeword and raplace all are not implemented
you can search casesensitive or not
unit f_r_u;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
ReplaceDialog1: TReplaceDialog;
procedure Button1Click(Sender: TObject);
procedure ReplaceDialog1Find(Sender:
procedure ReplaceDialog1Replace(Send
procedure ReplaceDialog1Close(Sender
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
oldpos : integer; {Hold CursorPos before enter Dialog}
procedure TForm1.Button1Click(Sender
begin
oldpos := memo1.selstart;
Replacedialog1.FindText := copy(Memo1.text,memo1.sels
ReplaceDialog1.Execute;
end;
Function StrUp (S : String) : String;
{ Use for none CaseSensitivity }
var i : Integer;
begin
for i := 1 to length(s) do s[i] := UpCase(s[i]);
result := s;
end;
procedure TForm1.ReplaceDialog1Find(
var
FCase : Integer;
SelTmp: Integer;
SelPos: Integer;
begin
{ Check For CaseSens }
if frmatchcase in replacedialog1.Options then
fCase := 1
else fcase := 0;
if Memo1.sellength > 0 then
Selpos := Memo1.SelStart + Memo1.SelLength
else
SelPos := Memo1.SelStart;
case fCase of
0 : Begin
if selpos = 0 then
Selpos := pos(StrUp(ReplaceDialog1.F
else
begin
SelTmp := Selpos;
Selpos := pos(StrUp(ReplaceDialog1.F
if selpos > 0 then selpos := selpos + seltmp;
end;
end;
1 : Begin
if selpos = 0 then
Selpos := pos(ReplaceDialog1.FindTex
else
begin
SelTmp := Selpos;
Selpos := pos(ReplaceDialog1.FindTex
if selpos > 0 then selpos := selpos + seltmp;
end;
end;
end;
if SelPos > 0 then
begin
Memo1.SelStart := SelPos - 1;
Memo1.SelLength := Length(ReplaceDialog1.Find
end
else MessageDlg(ReplaceDialog1.
memo1.setfocus; {Force Memo, to show selection}
end;
procedure TForm1.ReplaceDialog1Repla
begin
if Memo1.sellength > 0 then
if frmatchcase in replacedialog1.Options then
if Replacedialog1.Findtext = copy(memo1.text,memo1.sels
Memo1.SelText := ReplaceDialog1.ReplaceText
else
Replacedialog1find(self)
else
if StrUp(Replacedialog1.Findt
Memo1.SelText := ReplaceDialog1.ReplaceText
else
Replacedialog1find(self)
else
Replacedialog1find(self)
end;
Procedure TForm1.ReplaceDialog1Close
begin
memo1.selstart := oldPos;
memo1.sellength := 0;
end;
end.
Meikl
hi hyper66,
replace the
procedure TForm1.ReplaceDialog1Repla ce(Sender: TObject);
with this (replaces and searchnext automatically!)
procedure TForm1.ReplaceDialog1Repla ce(Sender: TObject);
begin
if Memo1.sellength > 0 then
if frmatchcase in replacedialog1.Options then
begin
if Replacedialog1.Findtext = copy(memo1.text,memo1.sels tart+1,mem o1.selleng th) then
begin
Memo1.SelText := ReplaceDialog1.ReplaceText
end
end
else
if StrUp(Replacedialog1.Findt ext) = StrUp(copy(memo1.text,memo 1.selstart +1,memo1.s ellength)) then
Memo1.SelText := ReplaceDialog1.ReplaceText ;
Replacedialog1find(self)
end;
meikl
replace the
procedure TForm1.ReplaceDialog1Repla
with this (replaces and searchnext automatically!)
procedure TForm1.ReplaceDialog1Repla
begin
if Memo1.sellength > 0 then
if frmatchcase in replacedialog1.Options then
begin
if Replacedialog1.Findtext = copy(memo1.text,memo1.sels
begin
Memo1.SelText := ReplaceDialog1.ReplaceText
end
end
else
if StrUp(Replacedialog1.Findt
Memo1.SelText := ReplaceDialog1.ReplaceText
Replacedialog1find(self)
end;
meikl
ASKER
Thanks guys.
ASKER
Sorry boris i did'nt explain what i was looking for good enough.. What i ment find and replace and find next useing Find dialog and replace dialog..