2016-07-14 4 views
4

私は、Windowsデスクトップのためのプログラムを作成するWindows 10のテーマでDelphi Seattleを使用しています。
アクティブなNumbersOnlyプロパティの場合、単語を入力しようとすると、標準のWindowsヒントが表示されます。TEdit
テーマなしでプログラムを終了すると、ヒントが正しく表示され、番号を入力できるだけのメッセージが表示されます。しかし、アクティブなテーマの場合、メッセージは読めません。NumbersOnly TEdit Delphiヒントが動作しない

誰でも私がVcl.StdCtrls.pasの中を調べていて、このメッセージがユーザに生成された時間を見つけることができなかったので、私はこれをどこで変更できるのか分かりません。

正しいヒント:

enter image description here

間違っヒント:デルファイ10.1(ベルリン)へ enter image description here

+0

私の推測では、ヒントメッセージはありませんVCLによるWindows自体によって生成されます。たぶんあなたは数字だけを受け入れるための独自のハンドラを書くことができます。例はここにあります:http://stackoverflow.com/questions/6896870/how-can-i-change-the-tedit-default-error-message-numbersonly- mode –

+0

はい、これはシステムレベルのヒントであり、VCLレベルのヒントではありません。 'NumbersOnly'プロパティは単に' ES_NUMBER'ウィンドウスタイルを有効にしています。 –

+0

ありがとう、私はVCLスタイルのUtils、プロジェクトで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の背後にある無駄なマイクロソフトの実装に頼るのではなく、独自のロジックを実装します。

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'文字列全体を受け入れることを望んでいるでしょうか?目的を全滅させるものではないのですか? –

関連する問題