小问题(300分)

  • 主题发起人 主题发起人 Marlowe
  • 开始时间 开始时间
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获取Tmemo (或TEdit等)构件中光标的位置(当前行和列)?
我由于特殊用途要(必须)自己做一个文本编辑器
 
richedit1.caretpos 返回 tpoint ,ok?
 
RichEdit中的行和列号
row := RichEdit1.Perform(em_ExLineFromChar, 0, -1);
col := RichEdit1.SelStart - RichEdit1.Perform(em_LineIndex,-1,0);
 
可以通过Memo.SelStart返回光标的位置。
不过此时的SelStart返回的是整个Memo.Lines.Text中所处的位置。
你可以通过SelStart计算出对应的行和列。如:
var
a: TStringList;
col, row: Integer;
begin
a := TStringList.Create;
a.Text := Copy(Memo1.Lines.Text, 1, Memo1.SelStart);
col := a.Count;
row := length(a.Strings[a.Count - 1]);
showmessage(inttostr(col) + ':' + inttostr(row));
a.Free;
end;
(在这里我没有做严格的检查,a.String[a.Count-1]有可能会有越界错误,
你可以在自己的程序中加以检查。思路如此)
 
到底用TRichEdit还是TMemo?
 
使用MEMO控件的em_LineFromChar属性,程序如下:
procedure TMyform.BitBtn1Click(sender:Tobject);
var
iLine:Integer;
begin
iLine:=Memo1.Perform(em_lineFromChar,$FFFF,0);
{Note:第一行为0}
MessageDlg('Line Number:'+IntTostr(iLine),mtinfomation,[mbOK],0);
end;
明白了吧?Marlowe,你可要给分呀...ha
 
使用TMemo的CaretPos只能返回以点为单位的光标位置
使用TMemo的Selstart只能返回光标在整个TMemo中的相对字符
没有当前行信息,也没有列信息.
必须要截获系统消息,才能得到确切可靠的位置信息
 
如果你使用RichEdit配合1stClass的状态行组件可以很方便的显示
光标当前位置的行列参数,如果仅仅显示在状态行上还不够
可以从两个属性中方便的取得.
BTW:
上面的hntangwei的程序我试过了确实可以取得行数.
但是MessageDlg('Line Number:'+IntTostr(iLine),mtinfomation,[mbOK],0);
有错误 mtInformation
 
这是个有意思的问题我钻研了一下API,终于找到了解答:
用下面这个函数:
procedure TForm1.getxy(var i,j :integer);
var
iIndex :Integer;
begin
i := SendMessage(Memo1.handle,em_lineFromChar,-1,0);
iindex :=SendMessage(Memo1.handle,em_lineindex,i,0);
j := Memo1.selstart+Memo1.SelLength-iindex;
end;

程序中调用他就可以了。
eg:
procedure TForm1.Button2Click(Sender: TObject);
var
i,j :integer;
begin
getxy(i,j);
ShowMessage(Format('row=%d,col=%d',[i,j]));
end;

 
不用message完全可以的,用selstart就可以得到光标位置
var Row,Col:Integer;
Str:String;
begin
Row:=1;
Str:=Copy(Memo1.Lines.Text,0,Memo1.SelStart);
while not (Pos(#13#10,Str)=0)do
begin
str:=copy(str,Pos(#13#10,Str)+2,Memo1.SelStart-Pos(#13#10,Str));
Row:=Row+1;
end;
Col:=Length(Str);
end;

以上代码通过计算回车个数得到行和列。你的分给得太多点了吧!
 
menxin:
总觉得你的方法有些别扭,如果这memo1里的文本相当大的话,做起来不是太
慢了吗?----向系统查询当然最方便了。
 
比较赞成柳五公子的办法!
 
这个问题可以结束了吧?
用 richedit 写文本编辑器 没问题
richedit.CaretPos 返回的 tpoint类型
就对应着光标的 行列 坐标,而且是以
字符为单位.
 
感谢诸位,答案非常有用。
 
实在不好意思,被Delphi的帮助骗了
Richedit.CaretPos确实返回以字符为单位的光标位置
lhxu的方法是正确的.
 
我不干献丑了
 
wangkun:
你并没有错,Memo的Caretpos确实返回的位置
以点为单位.:-)
 
Lhxu:
我察看Delphi帮助关于RichEdit的CarePos属性
上面说明是从TCustomMemo.CaretPos继承而来
所以我犯了这种错误.
它的帮助真是成问题.
 
多人接受答案了。
 
后退
顶部