是否可以将字符串作为TSysCharSet变量传递?
当然不编译:
var
AValidChars: SysUtils.TSysCharSet;
AResult: string;
begin
// Edit1.Text can contain 0..9 or a..z
AValidChars := SysUtils.TSysCharSet( [Edit1.Text] );
end;
谢谢, 比尔
答案 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 Stuntz,Ken White和Rob 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'''
很简单。