我创建了一些自定义枚举器集。
示例:
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;
但有三个问题。
即使我为Status-property指定了默认值,当我滚动浏览对象时,Combobox也没有显示值。
组合框中的项目数量为:
Amount of Items in Set + Amount of Objects
所以,如果我有2个对象,我的Combobox中有6个项目应该保持在4
如果我从组合框中选择一个值并希望将其发布到我的对象,则它不会访问我的Setter-Function。
这整个Live Bindings对我来说仍然是新的,但我想要正确地学习它。
所以如果你能帮我解决这些问题,我们将不胜感激。
感谢您的时间。
编辑:我的Delphi版本是10.1柏林,我使用的是VCL,目标平台仅适用于Windows。
EDIT2: https://www.dropbox.com/s/u7znetur723q6i2/DBApp.7z?dl=0 这是我的项目文件。
答案 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语句。