찾은 문자가 한줄에 두개가 존재 하더라도 richedit박스에 한번만 부리고 싶은데요 자꾸 두번 씩 나와요.
그리고 스피드버튼 말고 한번 클릭에 찾은문자를 포함한 모든 줄을 뿌릴순없겠습니까.여기 소스 가요.
좀 봐주실래요.올려놔도 왕초보라 실행 않되면 불안함.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
CheckBox1: TCheckBox;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
function FindMemoStr(SrchStr: string; CaseSensitive: Boolean): integer;
function PasCount(const s,delimiters : string) :boolean ;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CB_CaseSensitive:boolean;
j,k:integer;
implementation
{$R *.DFM}
function PasCount(const s,delimiters : string) :boolean ;
var
delimiter,count : Boolean;
i: integer;
begin
count := false;
delimiter := True;
if Length(s) > 0 then
begin
i := 1;
while (Pos(s[i],delimiters) <> 0) and (i <= Length(s)) do
inc(i);
for i := i to length(s) do
if Pos(s[i],delimiters) <> 0 then
delimiter := True
else
begin
if delimiter = True then inc(Count);
delimiter := False;
end;
end;
PasCount := Count;
end;
function TForm1.FindMemoStr(SrchStr: string; CaseSensitive: Boolean):integer ;
function Replichar(c: char; n: integer):string;
var
i: integer;
o: string;
begin
o := '';
for i := 1 to n do AppendStr(o,c);
Replichar := o;
end;
var
CRow, CCol, SRow, SCol: longint;
located: Boolean;
s, t, p: string;
begin
FindMemoStr := 0;
if length(SrchStr) < 1 then
exit;
// 아래 문장은 Memo의 맨 위부터 찾기의해 넣음
Memo1.SelStart := 0;
located := False;
if CaseSensitive then
s := SrchStr
else
s := Uppercase(SrchStr);
with Memo1 do
begin
if lines.count < 1 then
exit;
{현재 row and column을 얻는다}
CRow := SendMessage(Memo1.Handle, EM_LineFromChar, Memo1.SelStart, 0);
CCol := Memo1.SelStart - SendMessage(Memo1.Handle, EM_LineIndex, CRow, 0);
SRow := CRow; {검색시작 row}
while (SRow < lines.count) and not located do
begin
if CaseSensitive then
t := lines[SRow]
else
t := UpperCase(lines[SRow]);
if SRow = CRow then
begin
Delete(t,1,CCol+1);
p := Replichar(' ', CCol+1);
AppendStr(p, t);
t := p;
end;
SCol := pos(s, t);
if SCol > 0 then
begin
k:=k+1;
richedit1.lines[k-1]:=t;
located := True;
end
else
inc(SRow);
end;
if located then
begin
SelStart := SendMessage(Memo1.Handle, EM_LineIndex, SRow, 0) + SCol - 1;
SelLength := length(s);
FindMemoStr := selstart;
end
else
begin
j := j+1;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
//i:integer;
k:boolean;
begin
// 두번째 파라미터는 대소문자 구별 여부
k:=false;
//for i:=1 to 7 do
j:=FindMemoStr(Edit1.Text, CB_CaseSensitive);
if pascount(memo1.text,'#') = true then
begin
MessageBeep(MB_ICONHAND);
MessageDlg('검색 실패', mtInformation, [mbOK],0);
end
else
begin
Memo1.SetFocus ;
end;
end;
end.