Currently in a legacy code I have a set which I want to convert to array of string so i can pass this as a parameter for existing method.
//Existing code to be used and converted
const
North = 'F';
Pay = 'P';
Lynk = 'L';
TCharSet = set of AnsiChar;
MySet: TCharSet = [North, Pay, Lynk];
So my question is how do i convert above set to a array of character? Is this doable?
After doing some research found below code and that seems to have enum used to create a set and using TypeInfo to convert the enum to string.
//**Working code**
TMyEnum = (meFirst, meSecond, meThird);
TMySet = set of TMyEnum;
function MySetToString(MySet: TMySet): string;
var
i: TMyEnum;
begin
Result := '';
// one way to iterate
for i := Low(i) to High(i) do
if i in MySet then
Result := Result + GetEnumName(TypeInfo(TMyEnum), Ord(i)) + ' ';
end;
// call to above method
set1 := [meFirst, meSecond, meThird];
ShowMessage(MySetToString(set1));
Any help really appreciated.
//**Working code**
TMyEnum = (meFirst, meSecond, meThird);
TMySet = set of TMyEnum;
TStrArr = TArray<STRING>;
function MySetToStrings(MySet: TMySet): TStrArr;
var
i: TMyEnum;
begin
SetLength(Result,0);
// one way to iterate
for i := Low(i) to High(i) do
if i in MySet then
Result := Result + [GetEnumName(TypeInfo(TMyEnum), Ord(i))]
end;
// call to above method
var set1 : TMySet;
var arr : TStrArr;
var s : String;
set1 := [meFirst, meSecond, meThird];
arr := MySetToStrings(set1);
for s in arr do ShowMessage(s);
UPDATE (after changed question):
TYPE TCharSet = SET OF AnsiChar;
TYPE TCharArr = TArray<AnsiChar>;
FUNCTION CharSetToCharArr(CONST CharSet : TCharSet) : TCharArr;
VAR
C : AnsiChar;
BEGIN
SetLength(Result,0);
FOR C IN CharSet DO Result:=Result+[C]
END;
Your MySet will return this:
CharSetToCharArr(MySet) = ['F','L','P']
ie. a character array containing 3 elements, 'F', 'L' and 'P' in that order (they will always be in ANSI Ordinal order, as sets have no concept of "order").