カーソル位置の調整 – Delphiカスタムコンポーネントの作成 8

投稿者: | 2018年2月17日

NumberEditに数値を入力している途中、[マイナス]キーを押すと、カーソル位置が編集ボックスの先頭に戻ってしまうことが分かります。これは、[マイナス]キーを押したとき、Textプロパティの文字列を書き換えているために起こります。
今後は、入力中にCommaプロパティを反映して、コンマを自動挿入するなどの処理を行うため、そのたびにカーソルが先頭に移動してしまうのは困ります。
そこで今回はカーソル位置を調整し、スムーズに入力できるような処理を追加します。

KeyPressメソッドの修正

カーソル位置が変更になってしまうのは、(今の時点で)[マイナス]キー、または[プラス]キーを押したことにより、Textプロパティを書き換えたときです。そこで、KeyPressメソッドの該当箇所を、以下のように修正します。

procedure TCustomNumberEdit.KeyPress(var Key: Char);
var
  S: string;
  Settings: TFormatSettings;
  CurPos: Integer;
  SaveText: string;
begin
  if not IsValidChar(Key) then Key := #0;
  Settings := TFormatSettings.Create;

  case Key of
    '+', '-':
      begin
        // 数値の先頭にマイナスを入れる(またはマイナスを消す)
        S := Text;
        SaveText := S;
        CurPos := SelStart;

        if S <> '' then
        begin
          if S[1] = '-' then
            S := Copy(S, 2, Length(S) - 1)
          else if (S[1] <> '-') and (Key = '-') then
            S := '-' + S;
        end
        else if Key = '-' then
          S := '-';

        Text := S;
        Key := #0;

        if Length(S) > Length(SaveText) then
          Inc(CurPos)
        else if Length(S) < Length(SaveText) then
          Dec(CurPos);

        SelStart := CurPos;
      end;

  else
    if Key = Settings.DecimalSeparator then
    begin
      // 小数点を入力可能か
      if Pos(Settings.DecimalSeparator, Text) >= 1 then Key := #0;
    end;
  end;

  inherited;
end;

(72-73行目)
Textプロパティが変更されたか確認するために、現在のTextプロパティの文字列を記録し、現在のカーソル位置も記録します。カーソル位置は SelStart プロパティで取得できます。
(88-91行目)
文字列の長さが変わったかを確認します。長さが変わっていれば、それに合わせてカーソル位置を変更します。
(93行目)
SelStartプロパティにカーソル位置を設定します。
 

ADs
  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)