Can I define a MyType that can only contain these values?

I have this problem: if I have, for example, these values: "AA", "AB", "AC", "BC" - can I define MyType, which can only contain these values?

I want to do in a mode that:

type MyType = ... ; // something var X: MyType; begin x := 'AA' ; // is valid, 'AA' is included in XX := 'SS' ; // not valid, 'SS' not is included in X, than raise an exception. end; 

How can i solve this? Is there any solution directly using type data?

+4
source share
1 answer

This is pretty simple using operator overloading.

Do

 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; 

Now you can do

 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; 
+11
source

Source: https://habr.com/ru/post/1379784/


All Articles