sejung 发表于 2012-6-12 17:10:01

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;

sejung 发表于 2012-6-13 11:09:48

有delphi达人不?麻烦看一下吧!

乐yi忘忧 发表于 2012-6-14 11:46:28

实在搞不懂的可以跳过:lol

sejung 发表于 2012-6-14 13:48:58

本帖最后由 乐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.


(@_@) 发表于 2012-9-8 04:43:22

这个缺少一个向下或向上查找的功能吧

潜龙在渊 发表于 2012-9-10 17:05:48

真的不懂啊

Assembly! 发表于 2012-10-1 16:28:24

pos_return:= Pos(FindDialog1.FindText , Memo1.Lines);      这句编译出错,为什么?Memo1.Lines好像不能直接用啊

花花 发表于 2012-10-22 12:28:53

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); 试试

Angel丶L 发表于 2015-2-1 16:37:08

支持楼主发扬Delphi

暮雪千山 发表于 2015-5-12 16:55:39

代码是不报错了改成Text,但是好像实现不了功能啊,查找怎么没反应?
页: [1]
查看完整版本: 030鱼C记事本V1.0(下)finddialog组件中小甲鱼写的我不理解,现在理解了分享一下。