2013-02-25 6 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"를 넣었습니까? –

+5

@Bogdan : VCL 문제이고 C++ 문제가 아니기 때문에 OP는 관련 지식이있는 많은 잠재 고객을 얻고 싶었습니다. 나 한테 잘됐다. –

+0

@UliGerhardt 이해합니다. 답변 주셔서 감사합니다. –

답변

4

I 버튼을 얻을 수있는 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

TMaskEdit처럼이 속성은 EditMask입니다. 따라서 숫자 만 허용하도록 조정할 수 있습니다.

그리고 최소한 OnChange 이벤트는 u가 숫자가 아닌 텍스트 입력도 필터링 할 수있게합니다.

+1

그건 정수 전용입니다. –

+0

요금 포인트. 그러나 때로는 사용자가 점을 눌러 텍스트를 입력하는 것이 행복 할 수도 있습니다. TJvSpinEdit도 이와 같이 사용할 수 있습니다 만, 변경된 버튼 반응에 의해 사용자는 매우 혼란 스럽습니다. –