2017-07-04 37 views
0

我有一個枚舉TRole填充組合框與枚舉在Delphi中使用MySQL

type 
    TRole = (Admin, Common); 

在我的數據庫(MySQL的),我有一個表用戶與列式INTEGER作用 。我想用以下方式填充具有角色的組合框: 組合框應在角色Admin中顯示「管理員」和角色Common中的「公共用戶」;當我將值保存到數據庫時,角色Admin應該保存爲0,或者Common角色(它們各自的索引)保存爲1。

此外,顯示角色字段時,它應顯示爲上面顯示的字符串。

任何人都可以請解釋我該怎麼做?

回答

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對應於您的整數字段。

+0

幾乎在那裏......問題是它需要在數據庫中保存爲** INTEGER **。如果我想將它們保存爲字符串,則您的方法可行 –

+0

不正如我所說的,您使用組合框的ItemIndex屬性,該屬性是一個整數,並與您的字段完全對應。 – Dsm

+0

因此,在這種情況下,我不會使用TDBComboBox來保存這個字段,而是一個普通的TComboBox並通過ItemIndex手動保存? –

0

你根本不需要TRole枚舉。只需使用條目填充ComboBox,以使其索引對應於數據庫值(0 =管理員; 1 =普通用戶)。還要將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請求,讓您的數據應用角色列的值直接組合框的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');