鱼C论坛

 找回密码
 立即注册
查看: 3503|回复: 9

[技术交流] 030鱼C记事本V1.0(下)finddialog组件中小甲鱼写的我不理解,现在理解了分享一下。

[复制链接]
发表于 2012-6-12 17:10:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 乐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[j]);
      SkipChars:= SkipChars + (i*2);
      SkipChars:= SkipChars + PosReturn - 1;

      Memo1.SetFocus;
      Memo1.SelStart:= SkipChars;
      Memo1.SelLength:= Length(FindDialog1.FindText);
      Break;
    end;
  end;
end;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-13 11:09:48 | 显示全部楼层
有delphi达人不?麻烦看一下吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-14 11:46:28 | 显示全部楼层
实在搞不懂的可以跳过:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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[j]);  // 这里指的是 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-6-15 08:25
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-8 04:43:22 | 显示全部楼层
这个缺少一个向下或向上查找的功能吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-10 17:05:48 | 显示全部楼层
真的不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-1 16:28:24 | 显示全部楼层
pos_return:= Pos(FindDialog1.FindText , Memo1.Lines);        这句编译出错,为什么?Memo1.Lines好像不能直接用啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-22 12:28:53 | 显示全部楼层

换为pos_return:= Pos(FindDialog1.FindText , Memo1.text); 试试  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2015-2-1 16:37:08 | 显示全部楼层
支持楼主发扬Delphi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-12 16:55:39 | 显示全部楼层
代码是不报错了改成Text,但是好像实现不了功能啊,查找怎么没反应?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 17:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表