2

Delphi では、選択が負/逆の場合に 5 秒ごとにテキストを更新するメモでSelStartandを保持するのに問題があります。SelLength

負/逆選択とは、どこかで選択を開始し、Shift キーを押しながら左矢印キーを数回押したことを意味します。

コード:

var
  caret: TPoint;
  sel_start, sel_length: Integer;
begin
  sel_start := Memo1.SelStart;    //          =  5
  sel_length := Memo1.SelLength;  //          = 10
  caret := Memo1.CaretPos;        // caret.x  = 15

  //'adi and bl' selected
  caret.x := sel_start;
  Memo1.Lines.Clear;
  Memo1.Lines.Add('laditadi and blah blah');
  Memo1.SelStart := sel_start;
  Memo1.SelLength := sel_length;

  Memo1.CaretPos := caret;
end;

問題は、SelLength を設定すると実際にキャレットが移動するように見えることです。そして、設定後にキャレットを設定SelLengthするとになりSelLength := 0;ます。テキストは常に変化するため、TMemo.SelText/ TMemo.SetSelTextbefore と after は使用できません。

キャレットの位置を保持する方法が見つかりません...手がかりはありますか?

4

1 に答える 1

2

sel_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;
于 2013-02-01T07:10:05.277 に答える