gpt4 book ai didi

delphi - 如何更改我的代码以获取正确的枚举名称值?

转载 作者:行者123 更新时间:2023-12-03 18:59:49 25 4
gpt4 key购买 nike

我正在尝试使用RTTI获取枚举名称值。

我的目标是使用字符串值从Enum2(iterator)中选定的枚举名称值中获取Enum1(Tsex)中的相应枚举名称值。

这是我已经实现的代码。我正在使用Delphi 7。

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs,typinfo;

type

Tsex = (homme,femme);
iterator = (H,F);

TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);
var
i : integer;
OT: Tsex;
FT: iterator;
begin
i:=0;
OT := Low(Tsex);
for FT := Low(iterator) to High(iterator) do
if GetEnumName(TypeInfo(iterator), Ord(FT)) = 'F' then
begin
showmessage(GetEnumName(TypeInfo(Tsex), Ord(OT)));
end;
i:=i+1;
OT:=Succ(OT);
end;


当我使用 H作为字符串时,我得到 homme,但是当我使用 F时,我也得到了 homme。但是它必须是 femme

最佳答案

问题:

您的代码中的问题是,在begin之后缺少for,这会导致i的增量和OT的分配在迭代完成后发生。

您需要更改的是:

var
i : integer;
OT: Tsex;
FT: iterator;
begin
i:=0;
OT := Low(Tsex);
for FT := Low(iterator) to High(iterator) do
begin // <- Add begin here
if GetEnumName(TypeInfo(iterator), Ord(FT)) = 'F' then
begin
showmessage(GetEnumName(TypeInfo(Tsex), Ord(OT)));
end;
i:=i+1;
OT:=Succ(OT);
end;
end; // <- Add end; here


替代解决方案:

正如David所指出的,最好使用数组将另一组值映射到您的枚举。像这样:

type
TSex = (homme, femme);

const
SexDBValues: array [TSex] of string =
('H', 'F');

type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetMyEnumValue(const aDBValue: string): TSex;
var
value: TSex;
begin
for value := Low(TSex) to High(TSex) do
begin
if SameText(SexDBValues[value], aDBValue) then
begin
Result := value;
Exit;
end;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
value: TSex;
begin
value := GetMyEnumValue('H');
ShowMessage(GetEnumName(TypeInfo(TSex), Ord(value)));
end;




并且当您的枚举类型仅包含两个值,并且将来不太可能具有其他值时,您可以使用旧的if-else运算符:

function GetMyEnumValue(const aDBValue: string): TSex;
begin
if SameText(aDBValue, 'F') then
begin
Result := femme;
end else
begin
Result := homme;
end;
end;


简而言之,请避免过度设计的问题。

注意:我们使用 string存储字符值,并使用 SameText比较字符值,因为它不区分大小写地比较文本。另外,如果将来您改变主意如何在DB中存储值,则可以比较多个字符的文本。



忠告:

我也建议您咨询 Delphi Coding Style Guide

它似乎与问题无关,但是遵循良好的缩进实践有助于避免此类问题。

关于类型和变量的命名准则也很重要。在其他情况下,它们将同样拯救您。

关于delphi - 如何更改我的代码以获取正确的枚举名称值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35964046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com