使用MySQL在Delphi中使用Enum填充ComboBox

时间:2017-07-04 12:51:59

标签: mysql delphi enums

我有一个Enum TRole

type
  TRole = (Admin, Common);

在我的数据库(MySQL)中,我有一个表用户,其列角色 INTEGER 。我想以下列方式使用角色填充ComboBox: ComboBox应在角色Admin中显示“Administrator”,在角色Common中显示“Common User”;当我将值保存到数据库时,它应该保存为Admin角色的0或Common角色的1(它们各自的索引)。

此外,在显示角色字段时,它应显示为上面显示的字符串。

任何人都可以解释一下我该怎么做?

2 个答案:

答案 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');