这实际上很简单,使用运算符重载。
不要
type
TMyType = record
private
type
TMyTypeEnum = (mtAA, mtAB, mtAC, mtBC);
var
FMyTypeEnum: TMyTypeEnum;
public
class operator Implicit(const S: string): TMyType;
class operator Implicit(const S: TMyType): string;
end;
implementation
class operator TMyType.Implicit(const S: string): TMyType;
begin
if SameStr(S, 'AA') then begin result.FMyTypeEnum := mtAA; Exit; end;
if SameStr(S, 'AB') then begin result.FMyTypeEnum := mtAB; Exit; end;
if SameStr(S, 'AC') then begin result.FMyTypeEnum := mtAC; Exit; end;
if SameStr(S, 'BC') then begin result.FMyTypeEnum := mtBC; Exit; end;
raise Exception.CreateFmt('Invalid value "%s".', [S]);
end;
class operator TMyType.Implicit(const S: TMyType): string;
begin
case S.FMyTypeEnum of
mtAA: result := 'AA';
mtAB: result := 'AB';
mtAC: result := 'AC';
mtBC: result := 'BC';
end;
end;
现在你可以做
procedure TForm1.Button1Click(Sender: TObject);
var
S: TMyType;
begin
S := 'AA'; // works
Self.Caption := S;
S := 'DA'; // does not work, exception raised
Self.Caption := S;
end;
什么'型TMyType =(MTAA,MTAB,MTAC,MTBC)'? –
使用枚举类型的编译时保护或属性设置程序的运行时保护 –
但不是如常数,但作为字符串,例如:TMytype =('AA','AB','AC','BC')并确保如果将X定义为tmytype,那么X可以只假定该值,而对于其他值则会引发异常。 –