代码之家  ›  专栏  ›  技术社区  ›  bill

如何将字符串变量作为TSysCharSet传递

  •  3
  • bill  · 技术社区  · 16 年前

    当然,这并不编译:

    var
      AValidChars: SysUtils.TSysCharSet;
      AResult: string;
    begin
      // Edit1.Text can contain 0..9 or a..z
      AValidChars := SysUtils.TSysCharSet( [Edit1.Text] );
    end;
    

    谢谢,

    2 回复  |  直到 16 年前
        1
  •  5
  •   Community CDub    8 年前

    不,不能简单地将字符串作为TSysCharSet传递。

    但是,您可以创建一个TSysCharSet,其中包含字符串中的所有字符。此代码将执行以下操作:

    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;
    

    如果您不使用早期的Delphi版本,您也可以使用“for…”。。。在“而不是上面的循环中:

    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;
    

    请注意,在这两个代码段中都使用了AnsiString/AnsiChar,因为这种技术不适用于WideString或delphi2009中引入的Unicode字符串类型。

    非常感谢 Craig Stuntz Ken White Rob Kennedy

        2
  •  1
  •   Tiago Moraes    16 年前

    如果在Edit1.Text中有以下字符串:

    '0..9'
    

    那么下面的代码应该可以帮助您:

    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;
    

    可以使用Delphi/Pascal解析器来验证输入。

    更新:

    更详细的函数支持集合构造函数:

    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;
    

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

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

    适应支持

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

    很简单。