memo.text:='abcdefghijklm';
以下是测试结果:
1。鼠标单击f和g中间,selstart值为6,length(self.MemoReceive.SelText)值为0;
2。鼠标从d选到f,光标落到f和g中间,selstart值为3,length(self.MemoReceive.SelText)值为3;
3。鼠标从f选到d,光标落到c和d中间,selstart值为3,length(self.MemoReceive.SelText)值为3;
好像selstart只显示光标前的字符长度,但当光标前有被选取字符时,并没有算在内。
我想得到光标前字符的长度(包括里面的被选取的字符),请教如何判断第2和3两种情况?

解决方案 »

  1.   

    不要用selstart,用caretpos
    procedure TForm1.Button1Click(Sender: TObject);
    var
      pt: TPoint;
    begin
      pt:= memo1.CaretPos;
      showmessage(format('光标位置:第%d行第%d个字符',[pt.y,pt.x]));
    end;
      

  2.   

    var i,j:integer;用来记下拖选的起始列和终止列procedure TForm1.Button1Click(Sender: TObject);
    var SelEnd:integer;
    begin
      Memo1.SetFocus;
      if i=j then j:=j-Memo1.SelLength;
      SelEnd:=Memo1.SelStart+Memo1.SelLength-(Memo1.CaretPos.X)+j;
      Label1.Caption:=IntToStr(Memo1.SelStart);
      Label2.Caption:=IntToStr(SelEnd);
    end;procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      i:=Memo1.CaretPos.X;
    end;procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      j:=Memo1.CaretPos.X;
    end;
      

  3.   

    如果你的Memo.SelLength>0,那么不管你是从前往后选还是从后往前选的,Memo.SelStart都是选中内容的起始位置,这是它的属性决定的,跟光标在哪里没有关系我想得到光标前字符的长度(包括里面的被选取的字符),请教如何判断第2和3两种情况?
    ---------------------------
    Memo.SelStart+Memo.SelLength
      

  4.   

    hellolongbin(一个人(看贴先看错别字)):
    判断光标到开始的长度:
    Memo.SelStart+Memo.SelLength 只能解决从前往后选的情况,因为光标会落在SelLength的右边,此时光标到开始的长度包括SelStart和SelLength,但如果是从后往前选,光标在selstart和SelLength的中间,此时光标到开始的长度只包括SelStart,主要是后一种情况如何判断。zhourongbiao(Edward) 说的方法也存在这样的问题。请大家多帮帮忙,还是没有解决
      

  5.   

    Memo.SelStart,是指的从文档开始到光标所在位置,你的测试文件如果有多行的话就会发现这个问题,你的第二、第三种情况对程序来说都是一样的