获得与chr(33)+'test line'+ chr(33)等字符串相同的字符串

时间:2010-10-14 19:44:30

标签: delphi scripting

上面的字符串等于“3test line3”

当我在上面的行中输入一个编辑框,然后说; StrVar:= Edit1.text; StrVar是“chr(33)+'测试线'+ chr(33)”

如何将结果3test line3作为变体;

为了实现这一点,我使用了rem-objects的pascal脚本引擎。 可能是一种更简单的方法..

欢迎任何想法......

2 个答案:

答案 0 :(得分:2)

如果你需要一个以Delphi字符串文字作为输入的函数,并返回字符串,例如

'This is a test! '#9728#9729

将被评估为

This is a test! ☀☁

然后这样做:

function ParseStr(const Str: string): string;
var
  InLiteral, InOrdinal: boolean;
  ActualHigh: integer;
  i: Integer;
  ordinal: string;
const
  STRING_TERMINATOR = '''';
  CHAR_SYMBOL = '#';
  NUMBERS = ['0' .. '9'];
  WHITESPACE = [#$20, #$A0, #$09];
begin
  SetLength(result, length(Str));
  ActualHigh := 1;
  InLiteral := false;
  InOrdinal := false;
  i := 1;
  if length(Str) = 0 then Exit;
  repeat
    if InLiteral then
    begin
      if (Str[i] = STRING_TERMINATOR) and
        (i < length(Str)) and (Str[i + 1] = STRING_TERMINATOR) then
      begin
        result[ActualHigh] := STRING_TERMINATOR;
        inc(ActualHigh);
        inc(i, 2);
        Continue;
      end
      else if (Str[i] = STRING_TERMINATOR) then
      begin
        InLiteral := false;
        inc(i);
        Continue;
      end;
      result[ActualHigh] := Str[i];
      inc(ActualHigh);
      inc(i);
    end
    else if InOrdinal then
    begin

      if Str[i] in NUMBERS then
      begin
        ordinal := ordinal + Str[i];
        if i = length(Str) then
        begin
          result[ActualHigh] := char(StrToInt(ordinal));
          inc(ActualHigh);
        end;
        inc(i);
      end
      else if Str[i] = STRING_TERMINATOR then
      begin
        result[ActualHigh] := char(StrToInt(ordinal));
        inc(ActualHigh);
        InLiteral := true;
        InOrdinal := false;
        inc(i);
      end
      else if Str[i] = CHAR_SYMBOL then
      begin
        result[ActualHigh] := char(StrToInt(ordinal));
        inc(ActualHigh);
        ordinal := '';
        inc(i);
      end
      else if Str[i] in WHITESPACE then
        inc(i)
      else
        raise EConvertError.CreateFmt('Invalid string constant: "%s"', [Str]);

    end
    else
    begin

      if Str[i] = STRING_TERMINATOR then
      begin
        InLiteral := true;
        inc(i);
      end
      else if Str[i] = CHAR_SYMBOL then
      begin
        InOrdinal := true;
        inc(i);
        ordinal := '';
      end
      else if Str[i] in WHITESPACE then
        inc(i)
      else
        raise EConvertError.CreateFmt('Invalid string constant: "%s"', [Str]);

    end;
  until i > length(Str);
  SetLength(result, ActualHigh - 1);
end;

答案 1 :(得分:0)

脚本引擎可能是您获得的最佳选择。有些语言有内置的方法来计算用自己的代码编写的表达式,但只有脚本语言在运行时内置了解释器(有时是编译器)。作为一种纯编译语言,Delphi不提供这种语言,因此您需要提供自己的脚本语言,例如PascalScript。