2009-02-22 5 views

risposta

8
uses JclStrings; 

    S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']); 
+2

Nota: nell'ultima libreria JCL, si direbbe: 'utilizza JclAnsiStrings'. –

1

evento onkeypress

iniziano se non (tasto in [ 'A' .. 'Z', 'a' .. 'z', '0' .. '9']) allora chiave: = # 0; fine;

+0

È necessario convalidare il testo prima di utilizzare comunque. Puoi ignorare questo controllo usando gli appunti o il trascinamento del testo. – DiGi

+0

L'OP vuole togliere una stringa - nessuna menzione della tastiera. –

3

Solo per aggiungere un commento.

La soluzione che utilizza un set va bene in Delphi 7, ma può causare alcuni problemi in Delphi 2009 perché gli insiemi non possono essere di carattere (vengono convertiti in ansichar).

Una soluzione è possibile utilizzare è:

case key of 
    'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action 
else 
    Key := #0; 
end; 

Ma il modo più versatile è ovviamente:

if not ValidChar(key) then 
    Key := #0; 

In questo caso è possibile utilizzare ValidChar in più località e se ha bisogno di essere cambiato devi solo cambiarlo una volta.

10

Se ho capito bene si potrebbe usare una funzione come questa:

function StripNonAlphaNumeric(const AValue: string): string; 
var 
    SrcPtr, DestPtr: PChar; 
begin 
    SrcPtr := PChar(AValue); 
    SetLength(Result, Length(AValue)); 
    DestPtr := PChar(Result); 
    while SrcPtr <> #0 do begin 
    if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin 
     DestPtr[0] := SrcPtr[0]; 
     Inc(DestPtr); 
    end; 
    Inc(SrcPtr); 
    end; 
    SetLength(Result, DestPtr - PChar(Result)); 
end; 

Questo userà PChar per la massima velocità (al costo di meno leggibilità).

Edit: Re il commento di Gabr sull'utilizzo DestPtr [0] invece di DestPtr^: Questo dovrebbe compilare alle stesse byte in ogni caso, ma ci sono belle applicazioni in codice simile, in cui è necessario guarda avanti. Supponiamo che vogliate sostituire le nuove linee, quindi potreste fare qualcosa come

function ReplaceNewlines(const AValue: string): string; 
var 
    SrcPtr, DestPtr: PChar; 
begin 
    SrcPtr := PChar(AValue); 
    SetLength(Result, Length(AValue)); 
    DestPtr := PChar(Result); 
    while SrcPtr <> #0 do begin 
    if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin 
     DestPtr[0] := '\'; 
     DestPtr[1] := 't'; 
     Inc(SrcPtr); 
     Inc(DestPtr); 
    end else 
     DestPtr[0] := SrcPtr[0]; 
    Inc(SrcPtr); 
    Inc(DestPtr); 
    end; 
    SetLength(Result, DestPtr - PChar(Result)); 
end; 

e quindi di solito non uso il ^.

BTW, qualcuno ha un'idea di come formattare questo in modo che l'evidenziazione funzioni correttamente?

+0

Trovo che l'uso di SrcPtr [0] qui sia molto interessante - non ho mai visto un simile approccio prima. Più modo canonico sarebbe usare SrcPtr^e DestPtr ^. – gabr

+0

Ri: Formattazione - forse se si inserisce il punto e virgola mancante dopo "DestPtr [0]: = 't'" l'evidenziazione funzionerebbe. :-) –

+0

Grazie Ken, corretto, ma non funziona ancora :-(L'evidenziatore tratta le stringhe Delphi come stringhe C. Sfortunatamente – mghie