親コンポーネントはTCustomEditとした.
まず,右寄せ表示にするためにCreateParamsメソッドをオーバーライドし,
Params.StyleにES_RIGHTを指定する.
procedure TNumEdit.CreateParams( var Params: TCreateParams );
begin
inherited CreateParams( Params );
Params.Style := Params.Style or ES_RIGHT;
end;
Params.Style := Params.Style or ES_RIGHT or ES_MULTILINE;
数字,"-",および "." 以外の入力を
受け付けないようにするには,WM_CHARメッセージが来たときに入力された文字を調べ,
規定の入力以外は無効にすればよい.
具体的にはWM_CHARのメッセージハンドラを以下のように書く.
procedure TNumEdit.WMChar( var Message: TWMChar );
const
CharCodes = [ 8, 45, 46, 48..57 ];
begin
if not ( Message.CharCode in CharCodes ) then
Message.CharCode := 0
else
inherited;
end;
ただし,これだけでは "-100-" や "0.12.34" のような入力も許されてしまう.
したがって,DoExitメソッドをオーバーライドし,入力フォーカスが他のウィンドウに
移る直前に入力された文字列をチェックし,正しくない入力であれば警告を表示するようにする.
procedure TNumEdit.DoExit;
var
Dammy: Extended;
begin
if Text <> '' then
begin
try
Dammy := StrToFloat( Text );
inherited DoExit;
except
on E: EConvertError do
begin
MessageDlg( '''' + Text + ''' は浮動小数点数ではありません',
mtError, [ mbOK ], 0 );
SetFocus;
end;
end;
end
else inherited DoExit;
end;
さらに,入力された文字列を数値データとして取り出したり,数値データを入力として
受け付けるためにValueプロパティを用意し,
入出力用メソッドを以下のように定義する.
type
TNumEdit = class( TCustomEdit )
private
procedure SetValue( AValue: Double );
function GetValue: Double;
published
property Value: Double read GetValue write SetValue;
end;
(略)
procedure TNumEdit.SetValue( AValue: Double );
begin
Text := FloatToStr( AValue );
end;
function TNumEdit.GetValue: Double;
begin
if Text <> '' then
Result := StrToFloat( Text )
else
Result := 0; // Textプロパティが未設定の時は0を返す
end;
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||