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搞定,你试一试,符合要求就给

解决方案 »

  1.   

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

  2.   

    我刚写了一个,你看看
    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;
      

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

    to naughtyboy(淘气男孩) :你的程序我也调试了,总是'left'
    可我也得用鼠标选择阿!
      

  8.   

    如果要确定光标的位置:
    如果在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;
      

  9.   

    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 了最终还是得不到正确的结果!!!