gpt4 book ai didi

delphi - 如何从枚举填充内存表?

转载 作者:行者123 更新时间:2023-12-02 07:57:44 24 4
gpt4 key购买 nike

我使用 memtables 使用 LiveBinding 将枚举类型与组合框连接起来。

但是我有很多这样的人,而且我的做法太糟糕了(复制/粘贴)

例如,我有以下枚举:

 TEnumResourceType        = (trtApp, trtTab, trtSection, trtField, trtCommand, trtOther);

为此,我创建了一个函数来给出等效的字符串:

function EnumResourceTypeToStr(AEnum: TNaharEnumResourceType): string;
begin
case AEnum of
trtApp : result := 'Aplicação';
trtTab : result := 'Pagina (Tab)';
trtSection : result := 'Secção';
trtField : result := 'Campo';
trtCommand : result := 'Comando';
trtOther : result := 'Outro';
end;
end;

在数据模块中,我放置了内存表,并且需要填充它,我使用表的 AFTEROPEN 事件,代码如下:

procedure TDMGlobalSystem.vtResourceTypeAfterOpen(DataSet: TDataSet);
var
enum : TEnumResourceType;
begin
inherited;

for enum := Low(TEnumResourceType) to High(TEnumResourceType) do
DataSet.InsertRecord([EnumResourceTypeToStr(enum), Ord(enum)]);
end;

所有这些都有效,但是我需要为每个新的枚举执行此操作,并且我有数十个。最终我需要将当前的内存表更改为其他内存表,这是自动化该过程的一个额外问题。当前的内存表有时在 Android 上不起作用。

我正在寻找一种方法来自动化这个过程,或者使用泛型,或者其他什么,在 DataModule 中我只需要类似的东西:PopulateEnum(Table, Enum);

最好的解决方案是创建一个从此 memtable 继承的组件,并以某种方式定义所需的枚举以及所有神奇的事情发生(包括 enumtostr 的选择)

最佳答案

这里是枚举的通用包装器,用于获取表示枚举序号值和名称的整数字符串对数组。

小测试

program so_24955704;

{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils,
EnumValueStore in 'EnumValueStore.pas';

type
TEnumResourceType = ( trtApp, trtTab, trtSection, trtField, trtCommand, trtOther );

procedure PrintEnumValueStore( AEnumValueStore : TEnumValueStore );
var
LEnumValuePair : TEnumValuePair;
begin
for LEnumValuePair in AEnumValueStore.GetKeyValues do
begin
Writeln( LEnumValuePair.Key, '-', LEnumValuePair.Value );
end;
end;

procedure TestEnum;
var
LEnumValueStore : TEnumValueStore<TEnumResourceType>;
begin
LEnumValueStore := TEnumValueStore<TEnumResourceType>.Create;
try
// print default names
PrintEnumValueStore( LEnumValueStore );

WriteLn;

// set the custom names
LEnumValueStore.SetValue( trtApp, 'Aplicação' );
LEnumValueStore.SetValue( trtTab, 'Pagina (Tab)' );
LEnumValueStore.SetValue( trtSection, 'Secção' );
LEnumValueStore.SetValue( trtField, 'Campo' );
LEnumValueStore.SetValue( trtCommand, 'Comando' );
LEnumValueStore.SetValue( trtOther, 'Outro' );

// print the default values
PrintEnumValueStore( LEnumValueStore );
finally
LEnumValueStore.Free;
end;
end;

begin
try
TestEnum;
except
on E : Exception do
Writeln( E.ClassName, ': ', E.Message );
end;
ReadLn;

end.

将产生以下输出

0-App1-Tab2-Section3-Field4-Command5-Other0-Aplicação1-Pagina (Tab)2-Secção3-Campo4-Comando5-Outro

and here is the unit that will do the work

unit EnumValueStore;

interface

uses
System.Generics.Collections;

type
TEnumValuePair = TPair<Integer, string>;

TEnumValueStore = class abstract
public
function GetKeyValues : TArray<TEnumValuePair>; virtual; abstract;
end;

TEnumValueStore<TEnumKey> = class( TEnumValueStore )
private
FValueDict : TDictionary<TEnumKey, string>;
public
constructor Create;
destructor Destroy; override;
procedure SetValue( AKey : TEnumKey; const AValue : string );
function GetKeyValues : TArray<TEnumValuePair>; override;
end;

implementation

uses
SimpleGenericEnum;

{ TEnumValueStore<TEnumKey> }

constructor TEnumValueStore<TEnumKey>.Create;
begin
inherited Create;
FValueDict := TDictionary<TEnumKey, string>.Create;
end;

destructor TEnumValueStore<TEnumKey>.Destroy;
begin
FValueDict.Free;
inherited;
end;

function TEnumValueStore<TEnumKey>.GetKeyValues : TArray<TEnumValuePair>;
var
LEnum : TEnum<TEnumKey>;
LMin, LMax : Integer;
LCount : Integer;
LIdx : Integer;
LStr : string;
begin
LMin := LEnum.Ord( LEnum.Low );
LMax := LEnum.Ord( LEnum.High );
LCount := LMax - LMin + 1;
SetLength( Result, LCount );

LCount := 0;
for LIdx := LMin to LMax do
begin
LEnum := LIdx;
if FValueDict.ContainsKey( LEnum )
then
LStr := FValueDict[LEnum]
else
LStr := LEnum;
Result[LCount] := TEnumValuePair.Create( LEnum, LStr );
Inc( LCount );
end;
end;

procedure TEnumValueStore<TEnumKey>.SetValue( AKey : TEnumKey; const AValue : string );
begin
FValueDict.AddOrSetValue( AKey, AValue );
end;

end.

我使用的单位是SimpleGenericEnum但里面有一个小错误需要纠正

class function TEnum<T>.High: T;
begin
// original code
// Result := Cast(_TypeData.MaxValue);
Result := Cast(GetTypeData.MaxValue);
end;

class function TEnum<T>.Low: T;
begin
// original code
// Result := Cast(_TypeData.MinValue);
Result := Cast(GetTypeData.MinValue);
end;

关于delphi - 如何从枚举填充内存表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24955704/

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