将字符串类型定义为特定格式

时间:2011-12-05 21:11:30

标签: string delphi casting delphi-7

我想知道是否有一种方法可以在delphi 7中定义一种类型的字符串或类似字符串,它是以特定格式或匹配某些规范?例如,我想定义一个TSizeString类型,它接受4x69x12或甚至2.5x10.75等值。它应该要求x作为两个数字之间的唯一分隔符。所以永远不应该有x9652-44-6x6-2,甚至4 x 6

只需INTEGER + 'x' + INTEGERSINGLE + 'x' + SINGLE

类似我猜测TFilename的工作方式,标准文件名可能看起来像C:\MyPath\MyFile.txt\\Storage\SomeDir\SomeFile.doc

3 个答案:

答案 0 :(得分:9)

在较新版本的Delphi中,高级记录和操作符重载在这种情况下非常方便:

type
  TSizeString = record
    x, y: single;
  public
    class operator Implicit(const S: string): TSizeString;
    class operator Implicit(const S: TSizeString): string;
  end;

implementation

class operator TSizeString.Implicit(const S: string): TSizeString;
var
  DelimPos: integer;
begin
  DelimPos := Pos('x', S);
  if (DelimPos = 0) or (not TryStrToFloat(Copy(S, 1, DelimPos-1), result.X)) or
    (not TryStrToFloat(Copy(S, DelimPos + 1), result.y)) then
    raise Exception.CreateFmt('Invalid format of size string "%s".', [S]);
end;

class operator TSizeString.Implicit(const S: TSizeString): string;
begin
  result := FloatToStr(S.x) + 'x' + FloatToStr(S.y);
end;

现在你可以做到

procedure TForm1.Button1Click(Sender: TObject);
var
  S: TSizeString;
begin
  S := '20x30';             // works
  ShowMessage(S);
  S := 'Hello World!';      // exception raised
  ShowMessage(S);
end;

在旧版本的Delphi中,您只需编写一个类,或创建一个基本记录来保存您的大小(当然,您可以创建在这些记录和格式化字符串之间进行转换的函数)。

答案 1 :(得分:1)

特殊类型,如TFileName和TCaption没有什么特别之处,就像Andreas所提到的那样,但它们可用于在IDE中注册特定的属性编辑器。这将有助于通过对象检查器输入这些值。

要真正强制执行此类值,如果您的字符串是对象的属性,则可以为其编写setter。

否则,我应该创建一个具有两个整数属性的TSize类,以及一个将其属性组合到字符串的AsString属性。

type
  TSize = class
  private
    FLeftInt, FRightInt: Integer;
    function GetString: string;
    procedure SetString(Value: string);
  public
    property LeftInt: Integer read FLeftInt write FLeftInt;
    property RightInt: Integer read FRightInt write FRightInt;
    property AsString: string read GetString write SetString;
  end;

function TSize.GetString: string;
begin
  Result := Format('%dx%d', [FLeftInt, FRightInt]);
end;

function TSize.SetString(Value: string);
begin
  // Validate and parse Value. Set LeftInt and RightInt.
end;

答案 2 :(得分:0)

最简单的方法就是使用一个函数,并在定义字符串时始终使用它......

function MyString(numA, numB: single) : string;
begin
    Result := FloatToStr(numA) + 'x' + FloatToStr(numB)
end;

如果你想变得更加漂亮,可以将它作为一个允许直接字符串赋值作为属性的类来实现,但是它会解析字符串的合规性。