我有一个Enum TRole
type
TRole = (Admin, Common);
在我的数据库(MySQL)中,我有一个表用户,其列角色 INTEGER 。我想以下列方式使用角色填充ComboBox:
ComboBox应在角色Admin
中显示“Administrator”,在角色Common
中显示“Common User”;当我将值保存到数据库时,它应该保存为Admin
角色的0或Common
角色的1(它们各自的索引)。
此外,在显示角色字段时,它应显示为上面显示的字符串。
任何人都可以解释一下我该怎么做?
答案 0 :(得分:0)
我使用了两种不同的方法来解决这个问题。一种是使用RTTI从枚举中导出名称,但这在你的情况下不起作用,所以这是我的另一种方法,这是更强力:
(你可以适应你的用途 - 注意我的实际功能来自课程,但这并不重要)
function EnumAsText(
const pEnum: TRole): string;
const
cResults : array[ TRole ] of string =
(
{Admin} 'Admintrator',
{Common} 'Common User'
);
begin
Result := cResults[ pEnum ];
end;
然后用类似
的内容填充下拉列表procedure FillComboBox( Const pComboBox : TComboBox )
var
iRole : TRole;
begin
pComboBox.Items.Clear;
for iRole := low( TRole ) to Hi(TRole) do
begin
pComboBox.Items.Add( EnumAsText( iRole ) );
end;
end;
在EnumToText中使用const数组而不是case语句(显而易见的方法)的优点是,如果扩展枚举,编译器将强制您相应地修改函数。 组合框的ItemIndex对应于整数字段。
答案 1 :(得分:0)
你根本不需要TRole枚举。只需使用条目填充ComboBox,使其索引对应于数据库值(0 = Administrator; 1 = Common User)。还将ComboBox的Style属性设置为csDropDownList。
procedure PopulateComboBox(const cb: TComboBox);
begin
cb.Clear;
cb.Items.Add('Administrator'); // ItemIndex = 0
cb.Items.Add('Common User'); // ItemIndex = 1
end;
现在,当您使用SQL请求获取数据时,可以将 Role 列的值直接应用于组合框的ItemIndex属性:
Query.SQL.Text := 'select Name, Role from table where ID = :ID';
...
if Query.FieldByName('Role').AsInteger in [0..1] then
RoleComboBox.ItemIndex := Query.FieldByName('Role').AsInteger
else
raise Exception.Create('Role column value must be in range of 0..1');
当您将角色保存到数据库时,您的表现几乎相同。使用ItemIndex属性作为要保存的值:
if RoleComboBox.ItemIndex in [0..1] then
begin
...
Query.SQL.Text := 'update table set Role = :Role where ID = :ID';
Query.ParamByName('Role').AsInteger := RoleComboBox.ItemIndex;
Query.ExecSQL;
end
else
raise Exception.Create('Invalid role index');