2016-07-14 1 views
4

J'utilise Delphi Seattle avec le thème de Windows 10, en créant des programmes pour Windows Desktop.
Dans un TEdit si la propriété NumbersOnly active, lorsque vous essayez de taper des mots, vous voyez un indicateur Windows standard.
Si je quitte le programme sans le thème, l'indice apparaît correctement, avec le message expliquant que vous ne pouvez entrer que des nombres. Mais si le thème actif le message est illisible. Tout le monde a une idée où je peux changer cela, parce que je regardais à l'intérieur de la Vcl.StdCtrls.pas et n'a pas pu trouver l'heure qui est générée ce message à l'utilisateur.NumbersOnly TEdit Delphi Indice ne fonctionnant pas

indice correct:

enter image description here

indice incorrect: enter image description here

+0

Je pense le message d'indication est généré par Windows lui-même et non par le vlc. Peut-être que vous pouvez écrire votre propre gestionnaire pour accepter uniquement les numéros un exemple peut être trouvé ici: http://stackoverflow.com/questions/6896870/how-can-i-change-the-tedit-default-error-message-numbersonly- mode –

+0

Oui, c'est un indice au niveau du système, pas un indice au niveau VCL. La propriété 'NumbersOnly' permet simplement d'activer le style de la fenêtre' ES_NUMBER'. –

+0

Merci, j'ai utilisé les VCL Styles Utils, beaucoup de modifications avec la propriété numbersOnly dans le projet. –

Répondre

8

Ce problème a été corrigé dans RAD Studio 10.1 Berlin. Mais si vous ne pouvez pas mettre à niveau votre version de RAD Studio, essayez le projet VCL Styles Utils qui inclut un correctif pour cela. Vous seul devez ajouter l'unité Vcl.Styles.Utils.ScreenTips à votre projet.

enter image description here

+0

Merci, m'a beaucoup aidé –

2

Mise à jour Delphi 10.1 (Berlin) - il semble être fixé là que je ne peux pas reproduire ce alors que je peux avec 10,0 (Seattle).

Le bugfix list for Berlin indique plusieurs problèmes résolus liés aux styles VCL.

+0

Tks Stefan, j'ai vu ça aussi. Mis à jour ici récemment et plus de problème avec cette question. –

2

Une solution de contournement pour cela est de ne pas compter sur l'implémentation Microsoft plutôt inutile derrière the ES_NUMBER style, mais implémentez votre propre logique.

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; 

Maintenant, les non-nombres ne seront pas acceptés, pas même lorsque vous collez du texte.

+0

@dummzeuch, avez-vous manqué la partie où je dis: '// Mettre le code de retour des utilisateurs ici'? – Johan

+2

Totalement en désaccord, une zone d'édition entière qui accepte les caractères aléatoires est juste aggravante. Si seulement des nombres s'appliquent, il ne devrait pas accepter autre chose et en plus c'est ce que fait 'ES_NUMBERS' (sauf qu'il ne vérifie pas quand copier-coller). – Johan

+0

@dummzeuch Donc, si je devais taper 'R2D2', vous dites que vous voulez une boîte numérique seulement pour aller de l'avant et accepter la chaîne' R2D2' complète? Cela ne va-t-il pas à l'encontre de tout le but? –