掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
FMXのTNumberBoxでカンマ編集 (ID:151299)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
AAAAAさん 有難うございます。 TLabelを使うという発想が凄いです。 最終的にはAAAAAさんから提示頂いたコードの方が簡潔なので、使わせて頂きます。 因みに、自分でもトライはしてみました。未だ未だですけど。 { THmNumberEdit } const CST_MAX_DIGITS = 5; constructor THmNumberEdit.Create(AOwner: TComponent); begin inherited; FDecimalDigits := 0; FilterChar := '1234567890-,.'; Period := False; end; destructor THmNumberEdit.Destroy; begin inherited; end; // KeyDownイベント(やっぱりKeyUpの方が良さそうです) procedure THmNumberEdit.KeyDown(var AKey: Word; var AKeyChar: System.WideChar; AShift: TShiftState); var iPos: Integer; sDec: String; begin // ピリオド判定 iPos := Pos('.', Text); if iPos = 0 then Period := False else Period := True; // マイナス符号が押下された場合 if AKeyChar = '-' then begin AKeyChar := Char(0); SetValue(Text, True); end // ピリオドが押下された場合 else if AKeyChar = '.' then begin // 小数点以下が0桁の場合、入力は無かったことに if DecimalDigits = 0 then AKeyChar := Char(0) else // 小数点以下が指定されている場合 begin // 既に小数点が存在する場合は、入力は無かったことに if Period then AKeyChar := Char(0) else // ピリオドは最後に付加する begin Text := Text + AKeyChar; Period := True; SetValue(Text, False); end; end; end // 上記以外 else begin // 小数点が存在する場合、指定の小数点以下桁数を超えない様にする if Period then begin sDec := Copy(Text, Pos('.', Text)+1, DecimalDigits); if Length(sDec) >= DecimalDigits then AKeyChar := Char(0); end; inherited; SetValue(Text, False); end; // おまじない SelStart := Length(Text); end; // Valueプロパティ設定 procedure THmNumberEdit.SetValue(const AValue: Extended); begin try FValue := AValue; if DecimalDigits = 0 then SetIntegerFormatText else SetFloatFormatText; except FValue := 0; Text := ''; end; end; // Valueプロパティ設定(KeyDownなどのイベントから呼ばれる) procedure THmNumberEdit.SetValue(const AValue: String; MinusSign: Boolean); var sVal: String; begin if AValue = '' then begin Value := 0; Text := ''; end else begin try sVal := StringReplace(AValue, ',', '', [rfReplaceAll]); if AValue.EndsWith('.') then sVal := StringReplace(sVal, '.', '', [rfReplaceAll]); if MinusSign then Value := -1 * StrToFloat(sVal) else Value := StrToFloat(sVal); if DecimalDigits = 0 then SetIntegerFormatText else SetFloatFormatText; except Value := 0; end; end; end; // DecimalDigitsプロパティ設定 procedure THmNumberEdit.SetDecimalDigits(const ADecimalDigits: Integer); begin if ADecimalDigits > CST_MAX_DIGITS then FDecimalDigits := CST_MAX_DIGITS else FDecimalDigits := ADecimalDigits; end; // 整数フォーマットText設定 procedure THmNumberEdit.SetIntegerFormatText; begin //Text := FormatFloat('#,##0', Int(Value)); Text := FormatCurr('#,', Int(Value)); end; // 浮動小数点フォーマットText設定 procedure THmNumberEdit.SetFloatFormatText; var fVal: Currency; begin fVal := Currency(Value); if Text.EndsWith('.') then Text := FormatCurr('#,', fVal) + '.' else Text := FormatCurr('#,.#####', fVal); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.