delphi中memo控件的显示问题

我刚学delphi,很多搞不懂。我现在想做的是查找memo中的字符串,并让字符串显示在memo的当前第一行。我查找了网上的教程,查找到了,光标焦点也选中查找内容了,但就是... 我刚学delphi,很多搞不懂。我现在想做的是查找memo中的字符串,并让字符串显示在memo的当前第一行。我查找了网上的教程,查找到了,光标焦点也选中查找内容了,但就是没办法让查找到的内容显示到第一行。它有可能在最下面。我说清楚点吧,不是把查找到的字符剪到第一行,而是要让memo翻滚让查找到的内容显示在第一行。我手机打字,代码就不写了,原谅下。求大虾帮下忙。 展开
 我来答
cx1982420
2013-06-25 · TA获得超过1358个赞
知道小有建树答主
回答量:741
采纳率:100%
帮助的人:323万
展开全部
procedure TForm1.Button1Click(Sender: TObject);
var
  I, J, PosReturn, SkipChars: Integer;
begin
  for I := 0 to Memo1.Lines.Count do   //进行逐行查找
  begin
    PosReturn := Pos('#',Memo1.Lines[I]);  //此处是查找该行内是否有"#"号
    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 := 0;
      Break;
    end;
  end;
end;
追问
也错了,我要的是把查找到的结果显示琶当前第一行去。内容不改变,只是翻滚到查找结果。
追答

哦,这样,只是为了移动到第一行啊,这样的话直接用发送消息就好了

procedure TForm1.Button1Click(Sender: TObject); 
var
  I,PosReturn: Integer;
begin
  for I := 0 to Memo1.Lines.Count do   //进行逐行查找
  begin
    PosReturn := Pos('#',Memo1.Lines[I]);  //此处是查找该行内是否有"#"号
    if PosReturn <> 0 then  {如果找到要找的内容}
    begin
      SendMessage(Memo1.Handle,WM_VSCROLL,MAKELONG(SB_THUMBPOSITION,I),0);
      break;
    end;
  end;
end;
金山毒霸
2024-10-31 广告
大部分系统错误,是因为某些DLL文件丢失造成的,比如未安装DirectX9或DirectX 9.0组件已损坏、缺少Visual C ++库、未安装.net库。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的电脑一般都... 点击进入详情页
本回答由金山毒霸提供
Hoper0226
2013-06-25 · TA获得超过135个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:120万
展开全部

根据你的意思,应该是说,Memo中有一大堆的字符串,然后你想查找其中的某一段字符串,看看是否存在,如果存在,也就是找到了,就显示到第一行去??


如果是这样的话,我只能说,这个比“光标选中查找目标”简单,而且的不是简单一点半点- -


procedure TForm1.Button1Click(Sender: TObject);

begin

  if Pos(Edit1.Text,Memo1.Text)>0 then  //pos(字符串,字符串源) 返回字符串所在的位置。

  begin                                 //也就是说如果大于0,表示这个字符串存在。

    Memo1.Lines.Insert(0,Edit1.Text);   //然后在Memo1的第0行插入,插入的值为你查找的值,我这里查找值是Edit1

  end;                                 //所以直接把Edit1的内容插入就好了

end;

 

理解错了,我想想。。我记得我写过的

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Pos(Edit1.Text,Memo1.Text) > 0 then
  begin
    Memo1.SelStart:=Pos(Edit1.Text,Memo1.Text)-1;
    Memo1.SelLength:=length(Edit1.Text);
    Memo1.SetFocus;
    SendMessage(self.Memo1.Handle,EM_SCROLLCARET,0,0);//这里只能显示到最后一行,然后用下面的函数,翻页,正好在第一行。
    Memo1.Perform(WM_VSCROLL,SB_PAGEDOWN,0);
  end;
end;
更多追问追答
追问
理解错了,我要的是把查找结果更好的显示出来,
追答
恩,你看下我后面完善的回答。。应该能满足你的需求,我这已经能实现了。先用selStart,selLength,setFocus选中查找打内容,然后用SendMessage,让滚动条滚动到选中位置的那页,然后用Memo1.PerForm 让滚动条翻页,从而实现选中内容在第一行显示
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
相涤上官秋灵
2019-07-01 · TA获得超过3991个赞
知道大有可为答主
回答量:3190
采纳率:25%
帮助的人:193万
展开全部
123456789101112131415161718192021procedure TForm1.Button1Click(Sender: TObject);var I, J, PosReturn, SkipChars: Integer;begin for I := 0 to Memo1.Lines.Count do //进行逐行查找 begin PosReturn := Pos('#',Memo1.Lines[I]); //此处是查找该行内是否有"#"号 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 := 0; Break; end; end;end;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
veket的小号
2013-06-25 · TA获得超过3371个赞
知道大有可为答主
回答量:3762
采纳率:0%
帮助的人:3935万
展开全部
计算滚动条位置........... 和字体高度、行数.......有关 比较麻烦的.............
追问
没有简单点的办法吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式