2016-07-14 11 views
4

저는 Windows Desktop을위한 프로그램을 만드는 Windows 10을 테마로 Delphi Seattle을 사용하고 있습니다.
활성 NumbersOnly 속성 인 경우 TEdit에서 단어를 입력하려고하면 표준 Windows 힌트가 표시됩니다.
테마없이 프로그램을 종료하면 힌트가 올바르게 표시되고 숫자 만 입력 할 수 있다는 메시지가 표시됩니다. 그러나 활성 테마라면 메시지를 읽을 수 없습니다.NumbersOnly TEdit Delphi 힌트 : 작동하지 않음

아무도 내가 Vcl.StdCtrls.pas을보고 있었으므로이 메시지가 사용자에게 생성 된 시간을 찾을 수 없으므로이 위치를 변경할 수 있습니다.

올바른 힌트 :

enter image description here

잘못된 힌트 : 델파이 10.1 (베를린)에 enter image description here

+0

내 생각은 힌트 메시지가 아니라 VCL에 의해 창 자체에 의해 생성됩니다. 어쩌면 여기에 예제가있는 숫자 만 받아들이도록 처리기를 작성할 수 있습니다. http://stackoverflow.com/questions/6896870/how-can-i-change-the-tedit-default-error-message-numbersonly- mode –

+0

예, 시스템 레벨 힌트이지 VCL 레벨 힌트가 아닙니다. 'NumbersOnly' 속성은 단지'ES_NUMBER' 윈도우 스타일을 가능하게합니다. –

+0

감사합니다. VCL 스타일 유틸리티를 사용했습니다. 프로젝트에서 numbersOnly 속성을 사용하여 많은 수정 작업을 수행했습니다. –

답변

8

이 문제는 RAD Studio 10.1 Berlin에서 수정되었습니다. 그러나 RAD Studio 버전을 업그레이드 할 수없는 경우 VCL Styles Utils 프로젝트에서이 문제를 해결해보십시오. 프로젝트에만 Vcl.Styles.Utils.ScreenTips 유닛을 추가해야합니다.

enter image description here

+0

감사합니다. 내게 많은 도움이되었습니다. –

2

업데이트 - 내가 (10.0 내가 할 수있는이 동안을 재현 할 수있다 고정 것 같다 시애틀).

bugfix list for Berlin에는 VCL 스타일과 관련된 몇 가지 문제가 수정되어 표시됩니다.

+0

Tks Stefan, 나도 이걸 보았다. 최근 여기에서 업데이트되었으며이 질문에 대해서는 더 이상 문제가 없습니다. –

2

이 문제를 해결하려면 the ES_NUMBER style 뒤에 오히려 쓸모없는 Microsoft 구현에 의존하지 말고 자신의 논리를 구현하십시오.

type 
    TEdit = class(VCL.StdCtrls.TEdit) 
    protected 
    FInsideChange: boolean; 
    function RemoveNonNumbers(const MyText: string): string; 
    procedure KeyPress(var Key: Char); override; 
    procedure Change; override; 
    end; 

    procedure TEdit.KeyPress(var Key: Char); 
    begin 
    if NumbersOnly then begin 
     if not(Key in ['0'..'9','-',#8,#9,#10,#13,#127]) then begin 
     Key:= #0; 
     //Put user feedback code here, e.g. 
     MessageBeep; 
     StatusBar.Text:= 'Only numbers allowed'; 
     end else StatusBar.Text:= ''; 
    end; 
    inherited KeyPress(Key); 
    end; 

    procedure TEdit.Change; override; 
    begin 
    if FInsideChange then exit; 
    FInsideChange:= true; 
    try 
     inherited Change; 
     Self.Text:= RemoveNonNumbers(Self.Text); 
    finally 
     FInsideChange:= false; 
    end; 
    end; 

    function TEdit.RemoveNonNumbers(const MyText: string): string; 
    var 
    i,a: integer; 
    NewLength: integer; 
    begin 
    NewLength:= Length(MyText); 
    SetLength(Result, NewLength); 
    a:= 1; 
    for i:= 1 to Length(MyText) do begin 
     if MyText[i] in ['0'..'9'] or ((i=1) and (MyText[i] = '-')) then begin 
     Result[a]:= MyText[i]; 
     Inc(a); 
     end else begin 
     Dec(NewLength); 
     end; 
    end; {for i} 
    SetLength(Result, NewLength); 
    end; 

텍스트를 붙여 넣을 때도 번호가 허용되지 않습니다.

+0

@dummzeuch, 내가 말한 부분을 놓쳤습니까? // // 사용자 피드백 코드를 여기에 넣으시겠습니까? – Johan

+2

전혀 동의하지 않는 경우, 임의의 문자를 허용하는 정수 편집 상자가 악화되고 있습니다. 숫자 만 적용되면 다른 것을 받아 들여서는 안되며 ES_NUMBERS가하는 것 이외에는 (복사 붙여 넣기를 확인할 때를 제외하고). – Johan

+0

@dummzeuch 만약 'R2D2'라고 입력하면, 숫자 전용 상자를 사용하여 전체'R2D2' 문자열을 받아들이라고 하시겠습니까? 그 모든 목적을 이길 수 있습니까? –