Delphi 2007 の高度なレコード型

SkRegularExpressions.pas ですが、Delphi 2007 の IDE から実行すると、ブレークを貼っていないのに、勝手にブレークされて止まってしまう問題があります。

指摘を受けて、いろいろ書き換えながら調べましたが、問題が発生する場所は特定できました。以下のメソッドを通ると問題が発生して、通らないと発生しません。

function TGroupCollection.GetItem(Index: Variant): TGroup;
var
  LIndex: Integer;
  S: REString;
begin
  case VarType(Index) of
    varInteger, varWord, varByte:
    begin
      LIndex := Index;
      if (LIndex = Count) then
        raise ESkRegExp.CreateResFmt(@sSkRegExpOutOfRangeGroupNumber, [LIndex]);
      Result := FList[LIndex];
    end;
    varString{$IFDEF UNICODE}, varUString{$ENDIF}:
    begin
      S := Index;
      LIndex := IndexOfMatchedGroupName(S);
      if LIndex  -1 then
        Result := FList[LIndex]
      else
        raise ESkRegExp.CreateResFmt(@sSkRegExpUndefinedGroupName, [S]);
    end;
  else
    Result := TGroup.Create('', 0, 0, '');
  end;
end;

このメソッドは Match.Groups[0].Value のように、グループの値を参照するのに使います。

しかし、何でそうなるのかは今のところ原因不明です。QC を当たらないとダメそうですね。

この週末に Replace と Split のバグを修正したバージョンを出しますが、当面、Delphi 2007 では Match.Groups[0].Value のようには使わないでくださいね。

コメントを残す

メールアドレスが公開されることはありません。