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
プロパティにカーソル位置を設定します。