030鱼C记事本V1.0(下)finddialog组件中小甲鱼写的我不理解,现在理解了分享一下。
本帖最后由 乐yi忘忧 于 2012-6-15 09:48 编辑procedure TForm1.FindDialog1Find(Sender: TObject);
var
i, j, PosReturn, SkipChars: Integer;
begin
For i:= 0 to Memo1.Lines.Count do
begin
PosReturn:= Pos(FindDialog1.FindText, Memo1.Lines);
If PosReturn <> 0 then
begin
Skipchars:= 0;
For j:= 0 to i-1 do
Skipchars:= Skipchars + Length(Memo1.Lines);
SkipChars:= SkipChars + (i*2);
SkipChars:= SkipChars + PosReturn - 1;
Memo1.SetFocus;
Memo1.SelStart:= SkipChars;
Memo1.SelLength:= Length(FindDialog1.FindText);
Break;
end;
end;
end; 有delphi达人不?麻烦看一下吧! 实在搞不懂的可以跳过:lol 本帖最后由 乐yi忘忧 于 2012-6-15 09:42 编辑
在我不会的期间,问了一位Q名叫soy的delphi达人,是他告诉了我,感谢他,然后我又自已整理了一下,最后决定分享,省的有不会的鱼油和我一样苦恼!考虑到有些朋友确实是零基础,所以我解释的有点啰嗦,请见谅!这段代码是小甲鱼delphi中030鱼C记事本V1.0(下)中的!如果有错误请各位达人改正!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
FindDialog1: TFindDialog;
Memo1: TMemo;
procedure N2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FindDialog1Find(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.N2Click(Sender: TObject);
begin
FindDialog1.FindText:= memo1.SelText;//把你在memo1中用鼠标选择的字符串赋给 FindDialog1.FindText 以便下一步准备找
FindDialog1.Execute; //执行 finddialog1这个组件
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.AutoSize:= True; //窗体创建时自动大小属性为真。
end;
procedure TForm1.FindDialog1Find(Sender: TObject);
var
i: integer;
j: Integer;
pos_return: integer; //这是接收 pos()这个函数的返回值 ,返回你要找到字符串在 i 行的确切的位置,是返回一个数。
find_char: Integer; //这个是计算你选择的字符串之前一共有多少个字符数,是计算用的。
begin
for i:= 0 to Memo1.Lines.Count - 1 do //从 i 等于零开始循环 因为memo这个组件的下标默认是从零开始的,为什么要减一呢? 原因是 你从零开始循环的,所以 Memo1.Lines.Count(返回的是:计算你一共写了几行文本,这个是从1计算的) 要减1。
begin
pos_return:= Pos(FindDialog1.FindText,memo1.Lines); //pos函数取出子串在父串中第一次出现的位置 ,例如 :pos('b','abcd'); 返回结果是2 ,Pos()这个函数找到的这个数就是你要字符在i 行的确切位置,如果找不到,就会返回零! 把POSt()在第 i 行找到的确切数值给了 pos_return。
if (pos_return <> 0) then //如果pos函数的值不等于零,证明我们要找的在第 i 行已经找到!
begin
find_char:= 0; //初始化find_char,准备计算 第 i 行前 确切有多少个字符数!
for j:= 0 to i-1 do //把 j也初始化为零, 这里的 i-1 的意思是 在我们已经找到的 i 行 之前计算一共有多少个字符数。
begin
find_char:= find_char + Length(memo1.Lines);// 这里指的是 find_char累加中。。 length() 返回每一行的字符数(注意:如果在第 0 行有我们要找的数值,不会进入这个循环!)
end;
find_char:= find_char + (i*2);// 因为每一行都会返回#13(回车)#10(换行)的数值 所以每行必须多加两个字节。
find_char:= find_char + pos_return - 1; //上面找到的总字符数 加上你找到的第 i 行 确切位置数 就计算出来的 你鼠标选择的字符串的确切位置!
Memo1.setfocus; //把焦点切到memo1上(原来的焦点是在finddialog上的)
Memo1.SelStart:= find_char; // SelStart-返回或设置所选择的文本的起始点;如果没有文本被选中,则指出插入点的位置。
Memo1.sellength:= Length(FindDialog1.findtext); //SelLength-返回或设置所选择的字符数。从 memo1.selsstart开始选择长度为刚开始 FindDialog1.findtext 的范围 (就是咱第一次用鼠标选择的字符)
Break; //找到的话,就把这个循环终止! break的作用是终止它所在的这层的for循环!如果还不理解,建议学习一下c语言!
end;
end;
end;
end.
这个缺少一个向下或向上查找的功能吧 真的不懂啊 pos_return:= Pos(FindDialog1.FindText , Memo1.Lines); 这句编译出错,为什么?Memo1.Lines好像不能直接用啊 Assembly! 发表于 2012-10-1 16:28 static/image/common/back.gif
pos_return:= Pos(FindDialog1.FindText , Memo1.Lines); 这句编译出错,为什么?Memo1.Lines好像不 ...
换为pos_return:= Pos(FindDialog1.FindText , Memo1.text); 试试 支持楼主发扬Delphi 代码是不报错了改成Text,但是好像实现不了功能啊,查找怎么没反应?
页:
[1]