判断TMemo内当前光标在选择串的位置?

时间:2020-12-28 19:04:50
用Shift+左或右键,选择一段字符串,
Memo1.SelStart //所选择串的开始位置
Memo1.SelLength //所选择串的长度
如何知道当前光标处在所选择串的左边还是右边?

18 个解决方案

#1


procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=vk_shift then
 begin
  epos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
  if spos<epos then
    showmessage('right')
    else
     showmessage('left');
  end;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=vk_shift then
  spos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);

end

搞定,你试一试,符合要求就给

#2


不好意思,给丢了一段
另外,lpos,spos,epos都是全局变量
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  lpos:=sendmessage(memo1.handle,em_linefromchar,memo1.SelStart,0);
end;

#3


那么我是用鼠标选择的哪?

#4


我刚写了一个,你看看
var
    i:  integer;
    T:  integer;
begin
    T:=0;
    for i:=0 to memo1.CaretPos.Y-1 do
    begin
        T:=T+Length(MEmo1.Lines[i])+1;
    end;
    T:=T+memo1.CaretPos.X+1;
    if T=Memo1.SelStart then showmessage('left') else
    if T=Memo1.SelStart+memo1.SelLength then showmessage('Right');
end;

#5


If Memo1.CaretPos.x>Memo1.SelStart then showmessage('Right') else showmessage('Left');

#6


刚才测试了一下,如果MEMO中选择了多行,那么再加上一个小小的条件就可以了:
If Memo1.CaretPos.x+Memo1.SelLength>Memo1.SelStart then showmessage('Right') else showmessage('Left');

#7


不行阿!
Memo1.CaretPos.x我这为什么不是当前光标的横坐标哪?
例如我只有一行字符,选择第3,4个字符,
光标在第三个字符前面,
用Memo1.CaretPos.x得到的是4,???

#8


急用!请大家帮忙了!

#9


我的代码不行吗?你试了没有,我试了,怎么就可以

#10


对不起,好象是不行,我在看看。

#11


我测试过了,得到的结果都是'Right',我单步调试了
就是Memo1.CaretPos.x的问题因为他始终=(SelEnd)选择内容的最后位置

#12


其实这个问题比较复杂!因为还涉及字体的问题!

#13


你是过我的程序了吗??
我是调试后发上来的

#14


to naughtyboy(淘气男孩) :

你的程序我也调试了,总是'left'
可我也得用鼠标选择阿!

#15


如果要确定光标的位置:
如果在SelText的左边,memo1.Lines.Text[memo1.SelStart]则是memo1.SelText的起始字符,否则memo1.Lines.Text[memo1.SelStart-1]则是memo1.SelText的结束字符。
如果想确定光标所在地行列,则这样写:
function GetRow(memo: TMemo): Longint;
begin
  Result := memo.Perform(EM_LINEFROMCHAR, -1, 0);
end;

function GetColumn(memo: TMemo): Longint;
begin
  Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;

#16


to chechy(我爱洁洁)

谢谢你的解答,但是我的问题还没有解决:

判断两边的字符不行:
当两边的字符都是一样的就判断不准了!!!!

function GetColumn(memo: TMemo): Longint;
begin
  Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;

memo.Perform(EM_LINEINDEX, -1, 0); 返回的结果是光标前n行的字符数之和
当选择多行内容时GetColumn返回值就 <0 了

最终还是得不到正确的结果!!!

#17


这个问题我还没有解决
希望大家能帮帮忙!!
先谢谢了!!!!!!

#18


这个问题我还没有解决
希望大家帮帮忙!!!

#1


procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=vk_shift then
 begin
  epos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
  if spos<epos then
    showmessage('right')
    else
     showmessage('left');
  end;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=vk_shift then
  spos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);

end

搞定,你试一试,符合要求就给

#2


不好意思,给丢了一段
另外,lpos,spos,epos都是全局变量
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  lpos:=sendmessage(memo1.handle,em_linefromchar,memo1.SelStart,0);
end;

#3


那么我是用鼠标选择的哪?

#4


我刚写了一个,你看看
var
    i:  integer;
    T:  integer;
begin
    T:=0;
    for i:=0 to memo1.CaretPos.Y-1 do
    begin
        T:=T+Length(MEmo1.Lines[i])+1;
    end;
    T:=T+memo1.CaretPos.X+1;
    if T=Memo1.SelStart then showmessage('left') else
    if T=Memo1.SelStart+memo1.SelLength then showmessage('Right');
end;

#5


If Memo1.CaretPos.x>Memo1.SelStart then showmessage('Right') else showmessage('Left');

#6


刚才测试了一下,如果MEMO中选择了多行,那么再加上一个小小的条件就可以了:
If Memo1.CaretPos.x+Memo1.SelLength>Memo1.SelStart then showmessage('Right') else showmessage('Left');

#7


不行阿!
Memo1.CaretPos.x我这为什么不是当前光标的横坐标哪?
例如我只有一行字符,选择第3,4个字符,
光标在第三个字符前面,
用Memo1.CaretPos.x得到的是4,???

#8


急用!请大家帮忙了!

#9


我的代码不行吗?你试了没有,我试了,怎么就可以

#10


对不起,好象是不行,我在看看。

#11


我测试过了,得到的结果都是'Right',我单步调试了
就是Memo1.CaretPos.x的问题因为他始终=(SelEnd)选择内容的最后位置

#12


其实这个问题比较复杂!因为还涉及字体的问题!

#13


你是过我的程序了吗??
我是调试后发上来的

#14


to naughtyboy(淘气男孩) :

你的程序我也调试了,总是'left'
可我也得用鼠标选择阿!

#15


如果要确定光标的位置:
如果在SelText的左边,memo1.Lines.Text[memo1.SelStart]则是memo1.SelText的起始字符,否则memo1.Lines.Text[memo1.SelStart-1]则是memo1.SelText的结束字符。
如果想确定光标所在地行列,则这样写:
function GetRow(memo: TMemo): Longint;
begin
  Result := memo.Perform(EM_LINEFROMCHAR, -1, 0);
end;

function GetColumn(memo: TMemo): Longint;
begin
  Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;

#16


to chechy(我爱洁洁)

谢谢你的解答,但是我的问题还没有解决:

判断两边的字符不行:
当两边的字符都是一样的就判断不准了!!!!

function GetColumn(memo: TMemo): Longint;
begin
  Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;

memo.Perform(EM_LINEINDEX, -1, 0); 返回的结果是光标前n行的字符数之和
当选择多行内容时GetColumn返回值就 <0 了

最终还是得不到正确的结果!!!

#17


这个问题我还没有解决
希望大家能帮帮忙!!
先谢谢了!!!!!!

#18


这个问题我还没有解决
希望大家帮帮忙!!!