2009-02-18 7 views

Répondre

5

Non, il est impossible de passer simplement une chaîne comme TSysCharSet.

Ce que vous pouvez faire cependant est de créer un TSysCharSet qui contient tous les caractères dans la chaîne. Ce code ferait ceci:

var 
    AValidChars: SysUtils.TSysCharSet; 
    s: AnsiString; 
    i: integer; 
begin 
    // Edit1.Text can contain 0..9 or a..z 
    AValidChars := []; 
    s := Edit1.Text; 
    for i := 1 to Length(s) do 
    Include(AValidChars, s[i]); 
end; 

Si vous n'utilisez une version Delphi plus tôt, vous pouvez également utiliser « ... dans » au lieu de la boucle au-dessus:

var 
    AValidChars: SysUtils.TSysCharSet; 
    c: AnsiChar; 
begin 
    // Edit1.Text can contain 0..9 or a..z 
    AValidChars := []; 
    for c in Edit1.Text do 
    Include(AValidChars, c); 
end; 

Notez que dans les deux extraits de code AnsiString/AnsiChar est utilisé, car cette technique ne fonctionne pas avec WideString ou le type de chaîne Unicode introduit avec Delphi 2009.

Un grand merci à Craig Stuntz, Ken White et Rob Kennedy pour leurs précieux commentaires, je ha J'ai édité cette réponse pour répondre à tous leurs points.

+0

Déloyal! Je tapais l'instruction Include dans ma version du * même * code exact! :-) –

+0

Ce serait un bon cas d'utilisation pour .. dans au lieu de .. à –

+0

@Craig: Merci, réponse éditée pour refléter cela. – mghie

0

Si dans votre Edit1.Text vous avez la chaîne:

'0..9' 

ensuite le code suivant devrait vous aider:

var 
    AValidChars: SysUtils.TSysCharSet; 
    StartChar, EndChar: char; 
    c: char; 
begin 
    StartChar := Edit1.Text[1]; // some validation should be done 
    EndChar := Edit1.Text[4]; 
    AValidChars := []; 
    for c := StartChar to EndChar do 
    Include(AValidChars, c); 
end; 

A Delphi/analyseur Pascal peut être utilisé pour valider l'entrée.

Mise à jour:

fonction plus élaborés à l'appui des constructeurs de set:

function StrToSysCharSet(const S: string): TSysCharSet; 
var 
    Elements: TStringList; 
    CurrentElement: string; 
    StartChar, EndChar: char; 
    c: char; 
    i: Integer; 
    p: Integer; 
    function ReadChar: Char; 
    begin 
    Result := CurrentElement[p]; 
    Inc(p); 
    end; 
    function NextIsDotDot: Boolean; 
    begin 
    Result := '..' = Copy(CurrentElement, p, 2); 
    end; 
begin 
    Elements := TStringList.Create; 
    try 
    Elements.CommaText := S; 
    Result := []; 
    for i := 0 to Elements.Count - 1 do 
    begin 
     CurrentElement := Trim(Elements[i]); 
     p := 1; 
     StartChar := ReadChar; 
     if NextIsDotDot then 
     begin 
     Inc(p, 2); 
     EndChar := ReadChar; 
     for c := StartChar to EndChar do 
      Include(Result, c); 
     end 
     else 
     Include(Result, StartChar); 
    end; 
    finally 
    Elements.Free; 
    end; 
end; 

Il peut être utilisé comme ceci:

S := '0..9, a..z'; 
AValidChars := StrToSysCharSet(S); 

ou

S := '0..9 and a..z'; 
AValidChars := StrToSysCharSet(AnsiReplaceText(S, ' and ', ', ')); 

Adaptation pour soutenir

S := '''0''..''9'' and ''a''..''z''' 

est simple.

+0

L'OP a spécifiquement dit dans son commentaire '0' .. '9' et 'a' .. 'z'. Comment faites-vous cela avec votre code ci-dessus? Tu ne peux pas. Mghie et Craig ont donné la bonne réponse dans leur post combiné ci-dessus. –

+0

Mon code était juste pour donner l'idée, en utilisant un analyseur plus élaboré permettrait plus de possibilités. Voir la fonction mise à jour. –

Questions connexes