2017-07-25 58 views
-2

我很努力地得到我的TComoBox中的一个项目的ItemIndex ... 通常这似乎并不是一件困难的事情为我做...但不知何故,当我试图施放我的字符串(我从SQL select中获取)到TObject。这似乎并不奏效。我试图调试我的代码以手动编写串入的对象,像这样:施展TObject

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 

有什么建议?

+4

为什么你甚至在这里使用(假)对象?一个字符串不是一个TObject。 –

+0

我不明白你的意思。我必须使用返回字符串的函数“SetIndexWithSQL”的字符串,“IndexOfObject”需要TObject作为参数 –

+0

“IndexOf”如何? –

回答

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; 

注意,此功能是完全独立的视觉控制。您应该努力使用可视化控件来保证最低限度,并且在不参考任何可视控件的情况下编写业务逻辑。

+0

谢谢你的建议,我会采取的 –

1

您的问题在这里似乎是从查询中获取两个字符串,其中一个用作显示文本,另一个用于内部查找(来自不同的查询)。

我看到两种方法来解决这个问题:

  • 改变你的第二个查询,所以它返回字符串,即在组合框中
  • 用在你的形式查找连接两个字符串

对于第二个你可以使用TDictionary。我的方法假定填充组合框仅在一个循环中完成,并且没有动态添加或删除字符串。

添加字典到您的窗体:

TForm1 = class(TForm) 
... 
private 
    FLookUp: TDictionary<string, Integer>; 

在FORMCREATE和FormDestroy事件创建和销毁你的字典。

FLookUp := TDictionary<string, Integer>.Create; 

FLookUp.Free; 

在您使用来填充组合框,存储索引,并将其连接到您的查询串环路(我只是复制你的循环,假设它的工作原理是是)。

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(...)); 
+0

无需建立字典。辅助字符串似乎保存在一个简单的数组中。 –