2013-02-25 92 views
1

我正在用RAD Studio寫一個C++項目,但這也適用於Delphi。數字編輯控制與平面按鈕裏面,沒有計算器

我需要一個編輯控件,用戶只能輸入花車(2個小數位),並且可以恢復原始值(取自一個變量,這裏不重要),在編輯控件本身的一個按鈕上實現一個按鈕(實際上是一個圖標) 。

這就是我所做的,使用JEDI庫中的TJvCalcEdit

enter image description here

控制定義:

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)不帶小數點,只有在計算器關閉後纔會顯示。

enter image description here

所以,我可以禁用這種行爲?或者可以有人建議我與另一個控制(標準,開源或免費)解決方案?

+0

你爲什麼把「Delphi」放在標籤列表中? – 2013-02-25 10:47:14

+5

@Bogdan:因爲這是一個VCL問題,而不是一個C++問題,並且OP想要獲得大量的相關知識。對我來說似乎很好。 – 2013-02-25 11:22:33

+0

@UliGerhardt我明白。謝謝您的回答。 – 2013-02-25 11:41:49

回答

4

我會使用一個TButtonedEdit拿到按鈕,並與點後最多兩位小數的執行浮點輸入,我會做

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; 

Screenshot http://privat.rejbrand.se/floatinput2places.png

Sample demo EXE

0

使用股票VCL搞定編輯

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

使用OnChange過濾掉錯誤的輸入(或使用JvValidators


另一種方法,JediVCL基礎之一,是使用基地啓用按鈕的編輯器
http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvComboEdit

這有EditMask財產,就像TMaskEdit一樣,所以你可以調整它只接受數字。

而且至少在OnChange事件允許你也過濾非數字文本輸入。

+1

這僅適用於整數。 – 2013-02-25 14:10:23

+0

票價。但有時用戶會很樂意輸入文本,而不用按點號。 TJvSpinEdit也可以用於此,但用戶會因修改後的按鈕反應而感到困惑。 – 2013-02-25 14:14:28