0

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

例子:

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

现在我想用我的集合中定义的所有项目填充一个组合框。所以我的第一个想法是使用 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”绑定到我的对象的 TStatus 属性,该属性简称为状态。

property Status:String read GetStatus write SetStatus;

虽然存在三个问题。

  1. 即使我为状态属性分配了默认值,当我滚动浏览对象时,组合框也不显示任何值。

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

     Amount of Items in Set + Amount of Objects
    

    因此,如果我有 2 个对象,我的 Combobox 中有 6 个项目,而它应该保持在 4

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

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

因此,如果您能帮助我解决这些问题,将不胜感激。

感谢您的时间。

编辑:我的 Delphi 版本是 10.1 Berlin,我使用 VCL,目标平台仅限 Windows。

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

4

1 回答 1

1

我现在尝试了很多东西,包括状态模式的实现。

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

property Status:String read ReadStatus write SetStatus;

每个状态现在都有一个常量字符串,它保存关于它是什么状态的文字信息,我称之为常量“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 原则并使用组合框的 OnCloseUp 事件,以下行获取组合框中的文本,解析我的枚举类型,获取枚举值并通过它分配一个状态.

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

我很不高兴我不得不求助于组件的事件,但我想不管能不能完成工作。

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

于 2016-12-27T22:33:39.277 回答