2012-07-31 6 views
5

So habe ich bereits Code. Aber wenn es ausgeführt wird, lässt es den Rückschrittschlüssel nicht zu, ich brauche es, um den Rückschrittschlüssel zuzulassen und die Leertaste zu entfernen, da ich keine Leerzeichen möchte.Bestimmte Schlüssel in einer Bearbeitungsbox stoppen

procedure TForm1.AEditAKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
s := ('1 2 3 4 5 6 7 8 9 0 .'); //Add chars you want to allow 
if pos(key,s) =0 then begin Key:=#0; 
showmessage('Invalid Char'); 
end; 

Brauchen dank Hilfe: D

+0

Sie könnten 'TMaskEdit' verwenden –

+0

@DavidHeffernan, TMaskEdit wird normalerweise für _fixed_ Länge des Eingabetextes verwendet – Marcodor

+1

@Marcodor Danke, das wusste ich nicht. –

Antwort

6

Notieren Sie sich den Kommentar, die bereits in Ihrem Code ist:

procedure TForm1.AEditKeyPress(Sender: TObject; var Key: Char); 
var s:string; 
begin 
    s := ('1234567890.'#8); //Add chars you want to allow 
    if pos(key,s) =0 then begin 
    Key:=#0; 
    showmessage('Invalid Char'); 
    end; 
end; 
3

Es ist besser, Ihre erlauben Schlüssel in einem Satz als Konstante (Geschwindigkeit, Optimierung) zu setzen :

Aktualisiert # 2 Erlauben Sie nur ein Dezimalzeichen und die Handhabung von DecimalSeparator.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
const 
    Backspace = #8; 
    AllowKeys: set of Char = ['0'..'9', Backspace]; 
begin 
    if Key = '.' then Key := DecimalSeparator; 
    if not ((Key in AllowKeys) or 
    (Key = DecimalSeparator) and (Pos(Key, Edit1.Text) = 0)) then 
    begin 
    ShowMessage('Invalid key: ' + Key); 
    Key := #0; 
    end; 
end; 

Für bessere Ergebnisse zu sehen TNumericEdit Komponenten, die in DevExpress, JVCL, EhLib, RxLib und vielen anderen Bibliotheken.

+1

Hinweis: ShowMessage hier ist nur eine Demo. Aus der Sicht einer ergonomischen Benutzeroberfläche ist es ein Desaster, den Benutzer jedes Mal zu belästigen, wenn ein ungültiger Char eingegeben wird. Er muss jedes Mal [OK] drücken. Es ist besser, einen Signaltonfehler zu spielen oder eine Nachricht in einem Konsolenfenster/Benachrichtigungsbereich zu schreiben. – Marcodor

+3

Es ist schwer vorstellbar, dass der Benutzer in der Lage ist, Tastendrücke mit einer Geschwindigkeit zu liefern, bei der die Leistung von Pos von Bedeutung ist. Und ich bin mir nicht sicher, ob ein Set wirklich schneller wäre als Pos. –

+0

@DavidHeffernan, Set vs Pos ist VIEL schneller, etwa 10-12 mal. – Marcodor

1

Mit psychic powers prognostiziere ich, dass Sie versuchen, einen Gleitkommawert zu validieren.

Sie können die OnExit-Ereignis des Steuerelements verwenden oder die Ok/Save Einrichtung Ihrer Form das richtige Format wie folgt zu überprüfen:

procedure TForm1.Edit1Exit(Sender: TObject); 
var 
    Value: Double; 
begin 
    if not TryStrToFloat(Edit1.Text, Value) then begin 
    // Show a message, make Edit1.Text red, disable functionality, etc. 
    end; 
end; 

Dieser Code geht davon aus, dass Sie ein länderspezifisches Dezimaltrennzeichen verwenden möchten . Wenn Sie nur einen zulassen möchten, können Sie einen TFormatSettings Datensatz als dritten Parameter an TryStrToFloat übergeben.

+2

+1 Ich glaube, es ist viel besser zu validieren, wenn der Benutzer bereit ist weiterzumachen, als ungültige Zeichen zu ignorieren. Was mehr ist, ist dies für Dezimaltrennzeichen, wissenschaftliche Notation, Einfügen von Werten etc. –

+0

Ich denke, es ist besser, rechtzeitig ein Problem zu verhindern, als einen Benutzer darüber zu informieren, dass etwas nach, OnExit-schief läuft. Es gibt eine Menge von TNumericEdit-Komponenten, die das Einfügen, wissenschaftliche Notationen, etc ... ermöglichen. – Marcodor

+0

@marcodor Der Nachteil der blockierenden Eingabe bestimmter Schlüssel ist, dass der Benutzer denkt, dass die Tastatur kaputt ist. Das Sperren von Schlüsseln informiert den Benutzer nur dann, wenn Sie einen Fehlertext anzeigen. Außerdem müssen Sie noch eine zusätzliche Validierung durchführen. Was ist, wenn der Benutzer zwei Dezimalstellen eingibt? Oder das E der wissenschaftlichen Notation am falschen Ort. Validieren Char von Char ist schwer zu bekommen, und für welchen Gewinn? –

Verwandte Themen