提交作业:鱼C记事本V1.0
实现了查找功能,但是没有实现查找下一个或向下查找的功能,谁实现了,就发帖子吧**** Hidden Message *****procedure TForm1.dlgFind1Find(Sender: TObject);
begin
chazhao;
end;
procedure TForm1.dlgReplace1Find(Sender: TObject);
begin
chazhao;
end;
procedure TForm1.dlgReplace1Replace(Sender: TObject);
var
SelPos:Integer;
begin
with TReplaceDialog(Sender) do
begin
SelPos := Pos(FindText, mmo1.Lines.Text);
if SelPos > 0 then
begin
mmo1.SelStart := SelPos - 1;
mmo1.SelLength := Length(FindText);
mmo1.SelText := ReplaceText;
end
else
MessageBox(Handle, ' 抱歉,找不到需要替换的文件!', '提示', MB_OK or MB_ICONERROR);
end;
end;
procedure TForm1.FIND2Click(Sender: TObject);
begin
dlgFind1.FindText:=mmo1.SelText;
dlgFind1.Execute;
end;
procedure TForm1.FONT2Click(Sender: TObject);
begin
if dlgFont1.Execute then
mmo1.Font:=dlgFont1.Font
else
Exit;
end;
procedure TForm1.NEW1Click(Sender: TObject);
begin
if mmo1.Modified=True then
begin
if ID_OK= MessageBox(Handle, '内容以及发生变化,是否保存?', '提示', MB_YESNO) then
begin
dlgSave1.Filter := '文本文件(*.txt)|*.TXT';
if dlgSave1.Execute then
FileName := dlgSave1.FileName + '.txt';
mmo1.Lines.SaveToFile(FileName)
end
else
mmo1.Clear;
end;
end;
procedure TForm1.OPEN1Click(Sender: TObject);
begin
dlgOpen1.Filter := '文本文档(*.txt)|*.TXT';
if dlgOpen1.Execute then
begin
FileName := dlgOpen1.FileName;
mmo1.Lines.LoadFromFile(FileName);
end
else
Exit;
end;
procedure TForm1.PASTE1Click(Sender: TObject);
begin
mmo1.PasteFromClipboard;
end;
procedure TForm1.REPLACE1Click(Sender: TObject);
begin
dlgReplace1.ReplaceText:=mmo1.SelText;
dlgReplace1.Execute;
end;
//实现查找功能
procedure TForm1.chazhao;
var
j: Integer;
PosReturn: Integer; //接收Pos函数的返回值 ,这个值显示了我们所要查的字符在某一行的确切位置
SkipChars: Integer;//计算在我们查找到的地方之前有多少字符
i: Integer;
begin
for i := 0 to mmo1.Lines.Count-1 do//一共有i行,我们要从第1行开始一直查找到第i行
begin
PosReturn := Pos(dlgFind1.FindText, mmo1.Lines); {接收返回值,如果返回值是0则说明在这一行没有找到
我们要查的 ,如果返回值是一个整数,说明我们查找的
找到了,而且是在那个返回值的位置 }
if PosReturn <> 0 then //如果返回值不是0
begin
SkipChars := 0; //初始化,在即将开始查找之前,为0
for j := 0 to i - 1 do //从第1行循环到第i行
SkipChars := SkipChars + Length(mmo1.Lines); {length计算某一行的长度,如果在第1行查找到,就不会执行
这句 ,因为第一行查到的话,直接就知道确定位置,第第二行
开始计算每一行的前一行的长度}
SkipChars := SkipChars + (i * 2); //在每次进行换行的时候,要按回车,占用2个字节,所以从第1行结束开始,每行都要多2个字节
SkipChars := SkipChars + PosReturn - 1; {SkipChars执行到这,说明已经至少进入第二行,行数+确切某一行
的某个位置=查找的字符的确切位置,减一是因为SkipChars是查找到
的字符之前的所有字符之和}
mmo1.SetFocus; //mmo1获得焦点
mmo1.SelStart := SkipChars;
mmo1.SelLength := Length(dlgFind1.FindText);
Break;
end;
end;
end;
procedure TForm1.SAVE1Click(Sender: TObject);
begin
dlgSave1.Filter := '文本文档(*.txt)|*.TXT';
if dlgSave1.Execute then
begin
FileName:=dlgSave1.FileName + '.txt';
mmo1.Lines.SaveToFile(FileName);
end
else
Exit;
end;
咔咔咔 1 111111 挺厉害的。很好很好。 楼主,你是一个大好人!! 很好 A87454A 发表于 2016-7-11 00:14
posreturn:=pos(finddialog1.FindText,memo1.Lines); 这句为什么编译不通过,报错( Unit1.pas(15 ...
这里是写错了吧 明显是要“" ,需要知道第几行呀 学习一下 学习一下 学习一下 感谢你的解释,让我恍然大悟! 学习 来学习一下 查找下一个怎么实现的
过来学习下 ngth := Length(dlgFind1.FindText);
Break;
end;
end;
end;
procedure TForm1.SAVE1Click(Sender: TObject);
begin 看看 WinHlp32 好 ok