我正在努力在我的TComoBox中获取我的项目的ItemIndex ... 通常这对我来说似乎并不困难......但是当我尝试将我的String(我从SQL select中获取)转换为TObject时。这似乎不起作用。我尝试通过手动将String写入Object来调试我的代码,如下所示:
TObject('U');
以某种方式确实有效,我只是无法解释......
我填写ComoBox的方式:
for i := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
begin
CBBelegart.AddItem(VerkaufTypenBez(i), Tobject(VerkaufTypenShort[i]));
end;
我尝试设置索引的方式:
CB.ItemIndex := CB.Items.IndexOfObject(TObject(SetIndexWithSQL('select top 1 * from KOMSAconfig_Allgemein', 'Belegart'))); //index = -1
helper := 'U';
CB.ItemIndex := CB.Items.IndexOfObject(TObject(helper)); //index = -1
CB.ItemIndex := CB.Items.IndexOfObject(TObject('U')); //index = 1
有什么建议吗?
答案 0 :(得分:5)
当您尝试使用可视控件时,就会发生这种情况,就好像它是一个通用容器一样。视觉控件仅用于显示和用户交互。不要试图弯曲它做更多的事情。
在您的方案中,尝试将第二个字符串添加到组合框中是没有意义的。别那样做。将填充的循环更改为:
for i := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
begin
CBBelegart.Items.Add(VerkaufTypenBez(i));
end;
另一个字符串保存在类似结构的数组中,看起来可以这样访问:VerkaufTypenShort[i]
。因此,如果要查找特定值的索引,可以这样做:
function GetIndexFromShortString(const Value: string): Integer;
begin
for Result := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
if VerkaufTypenShort[Result]=Value then
exit;
Result := -1;
end;
请注意,此功能完全独立于可视控件。您应该尽量使用可视化控件,并在不参考任何可视控件的情况下编写业务逻辑。
答案 1 :(得分:1)
你的问题似乎是从查询中得到两个字符串,其中一个用作显示文本,另一个用于内部查找(来自不同的查询)。
我认为有两种方法可以解决这个问题:
对于第二个,您可以使用TDictionary。我的方法假设只在一个循环中填充组合框,并且没有动态添加或删除字符串。
将词典添加到表单中:
TForm1 = class(TForm)
...
private
FLookUp: TDictionary<string, Integer>;
在FormCreate和FormDestroy事件中创建并销毁您的词典。
FLookUp := TDictionary<string, Integer>.Create;
FLookUp.Free;
在你用来填充Combobox的循环中,存储指数并将它们连接到你的查找字符串(我只是复制你的循环,假设它按原样工作)。
procedure TForm1.FillCombo;
var
Index, I: Integer;
begin
FLookUp.Clear;
for i := Low(_VerkaufTypenBez) to High(_VerkaufTypenBez) do
begin
Index := CBBelegart.Items.Add(VerkaufTypenBez(i));
FLookUp.Add(VerkaufTypenShort[i], Index);
end;
end;
现在,您可以使用该词典查找正确的索引
function TForm1.GetIndexOfString(const Value: string): Integer;
begin
if not FLookUp.TryGetValue(Value, Result) then
Result := -1;
end;
像
一样使用它CB.ItemIndex := GetIndexOfString(SetIndexWithSQL(...));