1

RADStudioを使用してC++プロジェクトを作成していますが、これはDelphiにも当てはまります。

ユーザーが浮動小数点数(小数点以下第2位)のみを入力でき、編集コントロール自体の内部のボタン(実際にはアイコン)をクリックして元の値(変数から取得、ここでは重要ではありません)を復元できる編集コントロールが必要です。

TJvCalcEditこれは、JEDIライブラリのを使用して私が行ったことです。

ここに画像の説明を入力してください

コントロールの定義:

object Sconto1: TJvCalcEdit
  [non-important attributes...]
  ButtonFlat = True
  Glyph.Data = {
    D6020000424DD6020000000000003600000028000000100000000E0000000100
    180000000000A0020000130B0000130B00000000000000000000FFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFF999EC29396C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9198C48694CBA7BAFE8493CA72
    75B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B96C5
    8695CBA7BAFEA7BAFEA7BAFEA7BAFE747EB66D71B5FFFFFFFFFFFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFF8493CAA7BAFEA7BAFEA7BAFEA7BAFEA7BAFEA7BAFE84
    93CA7E83CE6D71B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F94C3A7BAFE
    A7BAFEA7BAFEA7BAFEA7BAFEA7BAFE8492CA8288D27B7FCA6D71B4FFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFF8492CAA7BAFEA7BAFEA7BAFE828ECA7B82C993
    96FA6D6FB67B7FCA7B7FCA6D6FB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9299C2
    A5B7FE7E88CA787DC99396FA9396FA9396FA9396FA6D6FB67B7FCA7B7FCA6D6F
    B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7678C89396FA9396FA9396FA9396FA93
    96FA9396FA9396FA6D6FB67B7FCA7B7FCA6C6FB3FFFFFFFFFFFFFFFFFFFFFFFF
    FFFFFF7678C89396FA9396FA9396FA9396FA9396FA9396FA9396FA6D6FB67B7F
    CA7B7FCA7576B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7678C89396FA9396FA93
    96FA9396FA9396FA9396FA9396FA6D6FB67B7FCA6266A2D6D0E2FFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFF7678C89396FA9396FA9396FA9396FA9396FA9396FA9396
    FA6D6FB67B7FCA7C7EB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7678C893
    96FA9396FA9396FA9396FA9396FA9396FA9396FA7679C66B6DACFFFFFFFFFFFF
    FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7678C89396FA9396FA9093F58B8EEC7678
    C87C7FC6ACABE5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    FFFF7678C88283C5A4A4E7C4C1EBFFFFFFFFFFFFFFFFFFFFFFFF}
  ImageKind = ikCustom
  DecimalPlacesAlwaysShown = False
  OnButtonClick = EScontoButtonClick
end

ボタンクリックで呼び出されるメソッド:

void __fastcall TFRigOrd::EScontoButtonClick(TObject *Sender)
{
    TJvCalcEdit* edit = dynamic_cast<TJvCalcEdit*>(Sender);
    edit->Value = oldSconto1;
}

問題:このメソッドの最後に、電卓のポップアップがコントロールの下に表示され、ユーザーによるアクションが必要になります。プログラムで値を変更しているので、これが発生しないようにします。このようなボタンは電卓をトリガーするために作られているため、これはデフォルト値だと思います。さらに、表示される値(255)は小数点なしで表示され、電卓を閉じると表示されます。

ここに画像の説明を入力してください

それで、この動作を無効にできますか?または、誰かが私に別のコントロール(標準、オープンソース、またはとにかく無料)で解決策を提案できますか?

4

2 に答える 2

4

ボタンを取得するためにaを使用しTButtonedEdit、ポイントの後に最大2桁の小数点以下の浮動小数点入力を適用するには、次のようにします。

TButtonedEdit = class(ExtCtrls.TButtonedEdit)
protected
  procedure KeyPress(var Key: Char); override;
  procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
end;

...

procedure TButtonedEdit.KeyPress(var Key: Char);
  function InvalidInput: boolean;
  var
   dc: integer;
  begin
    result := false;
    if Character.IsControl(Key) then Exit;
    dc := Pos(DecimalSeparator, Text);
    if not (Key in ['0'..'9', DecimalSeparator]) then Exit(true);
    if Pos(DecimalSeparator, Text) > 0 then
    begin
      if Key = DecimalSeparator then Exit(true);
      if (Length(Text) - dc > 1)
        and (Pos(DecimalSeparator, Text) < SelStart + 1) and
        (SelLength = 0) then Exit(true);
    end;
  end;

begin
  inherited;
  if InvalidInput then
  begin
    Key := #0;
    beep;
  end;
end;

procedure TButtonedEdit.WMPaste(var Message: TWMPaste);
var
  s: string;
  i: integer;
  hasdc: boolean;
  NewText: string;
  NewSelStart: integer;
begin
  if Clipboard.HasFormat(CF_TEXT) then
  begin
    s := Clipboard.AsText;

    NewText := Text;
    Delete(NewText, SelStart + 1, SelLength);
    Insert(s, NewText, SelStart + 1);


    // Validate
    hasdc := false;
    for i := 1 to Length(NewText) do
    begin
      if NewText[i] = DecimalSeparator then
        if hasdc then
        begin
          beep;
          Exit;
        end
        else
          hasdc := true
      else if not (NewText[i] in ['0'..'9']) then
      begin
        beep;
        Exit;
      end;
    end;

    // Trim
    if hasdc then
      NewText := Copy(NewText, 1, Pos(DecimalSeparator, NewText) + 2);

    NewSelStart := SelStart + Length(s);
    Text := NewText;
    SelStart := NewSelStart;
    SelLength := 0;
  end
  else
    inherited;
end;

スクリーンショット

サンプルデモEXE

于 2013-02-25T14:47:42.087 に答える
0

標準の VCL ボタン付きエディタを使用する

http://docwiki.embarcadero.com/Libraries/en/Vcl.ExtCtrls.TButtonedEdit

OnChange間違った入力を除外するために使用 (または を使用JvValidators)


別のアプローチである JediVCL ベースのアプローチでは、ベース ボタン対応エディター
http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvComboEditを使用します。

これには hasEditMaskと同じように has プロパティTMaskEditがあるため、数字のみを受け入れるように微調整できます。

そして、少なくともOnChangeイベントにより、数値以外のテキスト入力もフィルタリングできるようになります。

于 2013-02-25T14:06:58.313 に答える