delphi中memo控件的显示问题
我刚学delphi,很多搞不懂。我现在想做的是查找memo中的字符串,并让字符串显示在memo的当前第一行。我查找了网上的教程,查找到了,光标焦点也选中查找内容了,但就是...
我刚学delphi,很多搞不懂。我现在想做的是查找memo中的字符串,并让字符串显示在memo的当前第一行。我查找了网上的教程,查找到了,光标焦点也选中查找内容了,但就是没办法让查找到的内容显示到第一行。它有可能在最下面。我说清楚点吧,不是把查找到的字符剪到第一行,而是要让memo翻滚让查找到的内容显示在第一行。我手机打字,代码就不写了,原谅下。求大虾帮下忙。
展开
4个回答
展开全部
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 广告
2024-10-31 广告
大部分系统错误,是因为某些DLL文件丢失造成的,比如未安装DirectX9或DirectX 9.0组件已损坏、缺少Visual C ++库、未安装.net库。解决方法如下:一、 手动解决方法1、先确定电脑操作系统是多少位的,现在的电脑一般都...
点击进入详情页
本回答由金山毒霸提供
展开全部
根据你的意思,应该是说,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 让滚动条翻页,从而实现选中内容在第一行显示
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
计算滚动条位置........... 和字体高度、行数.......有关 比较麻烦的.............
追问
没有简单点的办法吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询