我想知道是否有一种方法可以在delphi 7中定义一种类型的字符串或类似字符串,它是以特定格式或匹配某些规范?例如,我想定义一个TSizeString
类型,它接受4x6
或9x12
或甚至2.5x10.75
等值。它应该要求x
作为两个数字之间的唯一分隔符。所以永远不应该有x9
或65
或2-4
或4-6x6-2
,甚至4 x 6
。
只需INTEGER + 'x' + INTEGER
或SINGLE + 'x' + SINGLE
。
类似我猜测TFilename的工作方式,标准文件名可能看起来像C:\MyPath\MyFile.txt
或\\Storage\SomeDir\SomeFile.doc
答案 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;
如果你想变得更加漂亮,可以将它作为一个允许直接字符串赋值作为属性的类来实现,但是它会解析字符串的合规性。