如何在Delphi 7中创建两列(一个隐藏)的组合框?

时间:2013-04-15 01:59:37

标签: delphi combobox delphi-7

如何创建一个 TComboBox ,其中有两列隐藏了其中一列,以便它可以保存一个id值以及其中的实际项目?然后如何以编程方式获得该id值?

2 个答案:

答案 0 :(得分:10)

这里不需要两列。

您可以利用TComboBox.Items(与Delphi中的许多其他内容一样,TStringListTMemo.LinesTListBox.Items)来自{{1}的事实},具有TStringsStrings属性。 Objects存储Objects大小的任何内容,这是一个指针。

这意味着您可以存储整数值,只需在添加时将其类型化为 TObject ,然后在检索时将其强制转换回 Integer

这样的事情应该有效:

TObject

要检索值:

procedure TForm1.FormCreate(Snder: TObject);
var
  i: Integer;
  sItem: String;
begin
  for i := 0 to 9 do
  begin
    sItem := Format('Item %d', [i]);
    ComboBox1.Items.AddObject(sItem, TObject(i));
  end;
end;

请注意,由于 Objects 属性实际上是用于存储对象,因此这为您提供了很大的灵活性。这是一个例子(故意非常简单)将客户的联系信息存储在关联的对象实例中,并在选择列表框中的项目时将其显示在标签中。

procedure TForm1.ComboBox1Click(Sender: TObject);
var
  Idx: Integer;
  Value: Integer;
begin
  Idx := ComboBox1.ItemIndex;
  if Idx <> -1 then
  begin
    Value := Integer(ComboBox1.Items.Objects[Idx]);
    // Do something with value you retrieved
  end;
end;

答案 1 :(得分:9)

ComboBox控件不支持列,无论如何都不需要隐藏列来完成您的需要。

TComboBox.Items属性是TStrings后代。它可以同时保存字符串值和关联的用户定义数据值,但用户只能在UI中看到字符串值。使用Items.AddObject()方法将字符串+ ID值添加到列表中,然后使用Items.Objects[]属性在需要时检索ID值。

或者,您可以将ID值存储在与ComboBox具有相同元素数的单独数组中,然后使用ComboBox项索引来访问数组值。如果您需要存储-1的值,这一点尤其重要,因为由于getter方法的实现方式,该特定值无法从Objects[]的{​​{1}}属性中检索到,例如Rob说