Delphi - 如何将枚举器类型的项绑定到ComboBox并将所选项绑定到对象

时间:2016-12-19 03:56:44

标签: delphi combobox livebindings

我创建了一些自定义枚举器集。

示例:

Type TStatus=(Unknown=0, Dead=1, Owned=2, Borrowed=3);

现在我想用我的Set中定义的所有项目填充Combobox。 所以我的想法是使用TypeInfo,GetEnumName和GetEnumValue-Functions。

i:=0;
while GetEnumValue(TypeInfo(TStatus),GetEnumName(TypeInfo(TStatus),i))<>-1 do
begin
  status:=GetEnumName(TypeInfo(TStatus),i);
  ComboBox.Items.Add(status);

  inc(i);
end;

(我尝试使用单独的适配器将TStringList绑定到ComboBox,但这不起作用)。

填充我的ComboBox后,我继续使用LiveBindings来绑定属性 “SelectedValue”到我的Object的TStatus属性,简称为Status。

property Status:String read GetStatus write SetStatus;

但有三个问题。

  1. 即使我为Status-property指定了默认值,当我滚动浏览对象时,Combobox也没有显示值。

  2. 组合框中的项目数量为:

     Amount of Items in Set + Amount of Objects
    

    所以,如果我有2个对象,我的Combobox中有6个项目应该保持在4

  3. 如果我从组合框中选择一个值并希望将其发布到我的对象,则它不会访问我的Setter-Function。

  4. 这整个Live Bindings对我来说仍然是新的,但我想要正确地学习它。

    所以如果你能帮我解决这些问题,我们将不胜感激。

    感谢您的时间。

    编辑:我的Delphi版本是10.1柏林,我使用的是VCL,目标平台仅适用于Windows。

    EDIT2: https://www.dropbox.com/s/u7znetur723q6i2/DBApp.7z?dl=0 这是我的项目文件。

1 个答案:

答案 0 :(得分:1)

我现在尝试了很多东西,包括State-Pattern的实现。

该属性现在看起来像这样:

property Status:String read ReadStatus write SetStatus;

每个状态现在都有一个常量String,它保存有关状态的文字信息,我调用常量“Statusbez”,这是现在传递给数据库的信息。

function THund.ReadStatus():String;
begin
  if fStatus<>nil then Result:=fStatus.Statusbez;
end;

为了设置状态,我访问我的TStates类型,这是我最终最终会遇到的所有状态的枚举类型。

procedure THund.SetStatus(value:string);
var
  tempState:String;
  i:Integer;
begin
  tempState:=fStatus.Statusbez;
  i:=GetEnumValue(TypeInfo(TStates),value);

  fStatus:=ChangeStatus(i);
  if fStatus.Statusbez<>tempState then fUpdated:=True;
end;

changeStatus函数只是决定要初始化的状态。

function THund.ChangeStatus(value:Integer):TStatus;
begin
  fStatus.Free();

  case value of
    Ord(Vorhanden):Result:=nil;
    Ord(Verstorben):Result:=TDead.Create();
    Ord(Schwanger):Result:=nil;
    Ord(Reserviert):Result:=nil;
    Ord(Laeufig):Result:=nil;
    Ord(Verkauft):Result:=nil;
    Ord(Gnadenbrot):Result:=nil;
    else Result:=nil;
  end;
end;

为了在运行时设置状态,我必须打破LiveBindings-Principle并使用Combobox的OnCloseUp-Event,下面的行使用Combobox中的Text,解析我的Enumeration-Type,获取Enumvalue并分配一个透过它说明。

Hund.Status:=CB_Hund_Status.Items[CB_Hund_Status.ItemIndex];

我不太高兴我不得不求助于组件的事件,但无论如何我都会完成工作。

无论如何,现在我可以安全地使用我的数据库中的单词来检查状态,并将我的逻辑放在单独的类后面,而不是数字和switch-case语句。