在Delphi中更新TMemo文本后保留负/反向字符串选择?

在Delphi中更新TMemo文本后保留负/反向字符串选择?,delphi,Delphi,在Delphi中,我很难将SelStart和selength保存在一个备忘录中,当选择为负数/负数时,该备忘录每5秒更新一次文本 使用负/反向选择时,我的意思是我已经在某处开始选择,并且在按住shift键的同时按下了左箭头键几次 代码: 问题是设置SelLength似乎实际上移动了插入符号。设置SelLength后设置插入符号,使SelLength:=0。由于文本不断变化,我无法在前后使用TMemo.SelText/TMemo.SetSelText 我找不到保存插入符号位置的方法。有什么线索吗?

在Delphi中,我很难将
SelStart
selength
保存在一个备忘录中,当选择为负数/负数时,该备忘录每5秒更新一次文本

使用负/反向选择时,我的意思是我已经在某处开始选择,并且在按住shift键的同时按下了左箭头键几次

代码:

问题是设置SelLength似乎实际上移动了插入符号。设置
SelLength
后设置插入符号,使
SelLength:=0。由于文本不断变化,我无法在前后使用
TMemo.SelText
/
TMemo.SetSelText


我找不到保存插入符号位置的方法。有什么线索吗?

如果sel\u start与插入符号的characterposition具有相同的值,则将selstart设置为selstart+sellength,并将sellength设置为-sellength,以反转选择

procedure TForm1.Button1Click(Sender: TObject);
var
  caret: TPoint;
  sel_start, sel_length,CharFromPos: Integer;
begin
  Memo1.SetFocus;
  GetCaretPos(Caret);
  CharFromPos := SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0 ,Caret.Y*$FFFF + Caret.X) AND $FFFF;
  sel_start := Memo1.SelStart;    //          =  5
  sel_length := Memo1.SelLength;  //          = 10

  Memo1.Lines.Clear;
  Memo1.Lines.Add('laditadi and blah blah'#13#10'laditadi and blah blah');
  if  sel_start<>CharFromPos then
      begin
       Memo1.SelStart := sel_start;
       Memo1.SelLength := sel_length;
      end
    else
      begin
       Memo1.SelStart := sel_start + sel_length;
       Memo1.SelLength := - sel_length;
      end;

end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
 p:Tpoint;
 b:Boolean;
 CharFromPos:Integer;
begin
   b := GetCaretPos(p);
   CharFromPos := SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0 ,p.Y*$FFFF + p.X) AND $FFFF;
   Caption := Format('SelStart %d CharFromPos %d',[Memo1.SelStart,CharFromPos])
end;
procedure TForm1.按钮1点击(发送方:TObject);
变量
插入符号:t点;
sel_start,sel_length,CharFromPos:Integer;
开始
备忘录1.SetFocus;
GetCaretPos(插入符号);
CharFromPos:=SendMessage(Memo1.Handle,EM_CharFromPos,0,插入符号Y*$FFFF+Caret.X)和$FFFF;
sel_start:=Memo1.SelStart;//=5.
选择长度:=Memo1.SelLength;//=10
备忘录1.线条清晰;
备忘录1.行。添加(‘laditadi和诸如此类’#13#10‘laditadi和诸如此类’);
如果选择从POS开始共享,则
开始
备忘录1.SelStart:=sel_start;
备注1.SelLength:=选择长度;
结束
其他的
开始
备注1.SelStart:=sel_start+sel_长度;
备注1.SelLength:=-选择长度;
结束;
结束;
程序TForm1.Timer1Timer(发送方:TObject);
变量
p:Tpoint;
b:布尔型;
CharFromPos:整数;
开始
b:=GetCaretPos(p);
CharFromPos:=SendMessage(Memo1.Handle,EM_CharFromPos,0,p.Y*$FFFF+p.X)和$FFFF;
标题:=格式('SelStart%d CharFromPos%d',[Memo1.SelStart,CharFromPos])
结束;

问题中的代码不会为任何选择保留选择。您需要在选择之前设置插入符号。但是,允许您和计时器写入的控件有一些根本性的错误。FWIW:当我执行
SendMessage(Memo1.Handle、EM_GETSEL、WPARAM(@dwStart)、LPARAM(@dwEnd))时带有
变量dwStart,dwEnd:DWORD在Windows 8/D2007下,我得到两个方向的选择的
dwStart
procedure TForm1.Button1Click(Sender: TObject);
var
  caret: TPoint;
  sel_start, sel_length,CharFromPos: Integer;
begin
  Memo1.SetFocus;
  GetCaretPos(Caret);
  CharFromPos := SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0 ,Caret.Y*$FFFF + Caret.X) AND $FFFF;
  sel_start := Memo1.SelStart;    //          =  5
  sel_length := Memo1.SelLength;  //          = 10

  Memo1.Lines.Clear;
  Memo1.Lines.Add('laditadi and blah blah'#13#10'laditadi and blah blah');
  if  sel_start<>CharFromPos then
      begin
       Memo1.SelStart := sel_start;
       Memo1.SelLength := sel_length;
      end
    else
      begin
       Memo1.SelStart := sel_start + sel_length;
       Memo1.SelLength := - sel_length;
      end;

end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
 p:Tpoint;
 b:Boolean;
 CharFromPos:Integer;
begin
   b := GetCaretPos(p);
   CharFromPos := SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0 ,p.Y*$FFFF + p.X) AND $FFFF;
   Caption := Format('SelStart %d CharFromPos %d',[Memo1.SelStart,CharFromPos])
end;