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

时间:2009-02-18 15:19:04

标签: delphi

是否可以将字符串作为TSysCharSet变量传递?

当然不编译:

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

谢谢, 比尔

2 个答案:

答案 0 :(得分:5)

不,不可能简单地将字符串作为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 ... in”而不是上面的循环:

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或Delphi 2009中引入的Unicode字符串类型。

非常感谢Craig StuntzKen WhiteRob Kennedy提供的非常有价值的评论,我已编辑此答案以解决所有问题。

答案 1 :(得分:1)

如果在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'''

很简单。