2016-07-14 27 views
4

Ich benutze Delphi Seattle mit dem Thema Windows 10, Erstellen von Programmen für Windows Desktop.
In einem wenn die aktive NumbersOnly-Eigenschaft, beim Versuch, Wörter zu tippen, sehen Sie einen Standard-Windows-Hinweis.
Wenn ich das Programm ohne das Thema verlasse, wird der Hinweis korrekt angezeigt, mit der Meldung, dass nur Zahlen eingegeben werden können. Aber wenn das aktive Thema die Nachricht nicht lesbar ist.NumbersOnly TEdit Delphi Hinweis funktioniert nicht

Jeder hat eine Idee, wo ich das ändern kann, weil ich innerhalb der Vcl.StdCtrls.pas schaute und konnte nicht finden, die Zeit, die diese Nachricht an den Benutzer generiert wird.

Correct Hinweis:

enter image description here

Falscher Hinweis: enter image description here

+0

Meine Vermutung der Hinweis-Nachricht wird von Windows selbst nicht von der vcl erzeugt. Vielleicht können Sie Ihren eigenen Handler schreiben, um nur Zahlen zu akzeptieren. Ein Beispiel finden Sie hier: http://stackoverflow.com/questions/6896870/how-can-i-change-the-tedit-default-error-message-numberonly- mode –

+0

Ja, das ist ein Hinweis auf Systemebene, kein Hinweis auf VCL-Ebene. Die 'NumbersOnly'-Eigenschaft aktiviert lediglich den' ES_NUMBER'-Fensterstil. –

+0

Danke, ich habe die VCL Styles Utils benutzt, viele Bearbeitungen mit numbersOnly Property im Projekt. –

Antwort

8

Dieses Problem wurde in RAD Studio 10.1 Berlin behoben. Wenn Sie Ihre RAD Studio-Version nicht aktualisieren können, versuchen Sie es mit dem VCL Styles Utils-Projekt, das eine Fehlerbehebung enthält. Nur Sie müssen die Vcl.Styles.Utils.ScreenTips Einheit zu Ihrem Projekt hinzufügen.

enter image description here

+0

Danke, hat mir sehr geholfen –

2

Update Delphi 10.1 (Berlin) - es scheint, dass es repariert werden, da ich nicht dieses während reproduzieren kann ich mit 10.0 kann (Seattle).

Die bugfix list for Berlin zeigt mehrere behobene Probleme, die mit VCL-Stilen zusammenhängen.

+0

Tks Stefan, ich habe das auch gesehen. Kürzlich aktualisiert und kein Problem mehr mit dieser Frage. –

2

Eine Problemumgehung dafür ist, sich nicht auf die eher nutzlose Microsoft-Implementierung hinter the ES_NUMBER style zu verlassen, sondern Ihre eigene Logik zu implementieren.

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; 

Nun werden Nicht-Nummern nicht akzeptiert, auch nicht beim Einfügen von Text.

+0

@dummzeuch, hast du den Teil vermisst, wo ich sage: '// Setze hier den User-Feedback-Code? – Johan

+2

Völlig nicht stimmen, eine ganze Zahl editbox, die zufällige Buchstaben annimmt, ist gerade ärgerlich. Wenn nur Zahlen verwendet werden, sollte nichts anderes akzeptiert werden, und außerdem tut ES_NUMBERS das so (außer es prüft nicht beim Kopieren und Einfügen). – Johan

+0

@dummzeuch Also, wenn ich 'R2D2' tippe, willst du sagen, dass du eine reine Zahlenbox willst, die die volle' R2D2' Zeichenfolge akzeptiert? Wird damit der ganze Zweck nicht besiegt? –