Delphi将集合类型转换为字符数组

wribegjk  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(210)

目前在遗留代码中,我有一个想要转换为字符串数组的集合,因此我可以将其作为现有方法的参数进行传递。

//Existing code to be used and converted
  const
  North = 'F';
  Pay = 'P';
  Lynk = 'L';  

  TCharSet = set of AnsiChar;
  MySet: TCharSet = [North, Pay, Lynk];

**所以我的问题是如何将上面的集合转换为字符数组?**这可行吗?

在做了一些研究之后,发现下面的代码似乎使用了枚举来创建一个集合,并使用TypeInfo将枚举转换为字符串。

//**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));

我真的很感激你们的帮助。

n3h0vuf2

n3h0vuf21#

//**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);

更新(更改问题后):

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;

您的MySet将返回以下内容:

CharSetToCharArr(MySet) = ['F','L','P']

也就是说。包含3个元素的字符数组,按该顺序排列的是‘F’、‘L’和‘P’(它们将始终按ANSI的顺序排列,因为集合没有“顺序”的概念)。

rmbxnbpk

rmbxnbpk2#

您可以使用CHAR函数将集合中的每个元素转换为CHAR。因此,代码可能是这样的:

procedure TForm1.Button1Click(Sender: TObject);
type
  TCharSet = set of AnsiChar;
const
  North = 'F';
  Pay = 'P';
  Lynk = 'L';
var
  MySet: TCharSet;
  myArr: Array of Char;
  c: AnsiChar;
  i: Integer;
begin
  MySet := [North, Pay, Lynk];

  i := 0;
  for c in MySet do
  begin
    SetLength(myArr, Length(myArr)+1);
    myArr[i] := Char(c);
    i := i + 1;
  end;

  for i := 0 to Length(myArr)-1 do
    ShowMessage(myArr[i]);
end;

相关问题