双ComboBox选择依赖

时间:2013-10-24 09:31:05

标签: delphi combobox

我想要一个带有以下项目的2下拉组合框:

  • COMBO1: 宠物 水果

  • Combo2: 如果选择了Pets,则使用combobox2items.Add: 狗,猫,鸡

如果采摘了水果,那么combobox2items.Add: 甜瓜,橘子,苹果

所以我尝试这样做:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.Add('Pets');
  ComboBox1.Items.Add('Fruits');
end;

procedure TForm1.ComboBox2Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 1) then 
    ComboBox2.Items.Add('Dog');
  ComboBox2.Items.Add('Cat'); 
  ComboBox2.Items.Add('Chicken');

  if ComboBox1.ItemIndex = 2) then 
    ComboBox2.Items.Add('Melon');
  ComboBox2.Items.Add('Orange'); 
  ComboBox2.Items.Add('Apple');    
end;

我的代码无效。如何以简单的方式解决这个问题?

2 个答案:

答案 0 :(得分:2)

你需要像这样使用begin..end:

if ComboBox1.ItemIndex = 1 then
begin 
  ComboBox2.Items.Add ('Dog');
  ComboBox2.Items.Add ('Cat'); 
  ComboBox2.Items.Add ('Chicken');
end;

if ComboBox1.ItemIndex = 2 then 
begin
  ComboBox2.Items.Add ('Melon');
  ComboBox2.Items.Add ('Orange'); 
  ComboBox2.Items.Add ('Apple');
end;

此外,您需要在添加新项目之前清除组合框;

答案 1 :(得分:1)

当涉及到Combo Box依赖项时,我喜欢构建一个表示这些依赖项的Dictionary。基本上,你有你的字典保持ComboBox1的项目作为键。当ComboBox1更改时,您将ComboBox2的Items属性重新分配给所选Key后面的StringList。这样可以节省每次更改ComboBox1索引时删除/添加单个字符串的麻烦。

procedure TForm1.FormCreate(Sender: TObject);
begin
  FComboBoxDependencies := TDictionary<string,TStringList>.Create;

  FComboBoxDependencies.Add('Pets',TStringList.Create);
  FComboBoxDependencies['Pets'].Add('Dog');
  FComboBoxDependencies['Pets'].Add('Cat');
  FComboBoxDependencies['Pets'].Add('Chicken');

  FComboBoxDependencies.Add('Fruit',TStringList.Create);
  FComboBoxDependencies['Fruits'].Add('Orange');
  FComboBoxDependencies['Fruits'].Add('Apple');
  FComboBoxDependencies['Fruits'].Add('Melon');

  //Trigger Change Event at start to display the selected Key
  ComboBox1Change(self);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  ComboBox2.Items := FComboBoxDependencies[ComboBox1.Text];   //Grab Items to be displayed from dictionary
  ComboBox2.ItemIndex := 0;          //Set Itemindex to 0 to show first item
end;

当然,这可以通过改进和调整来更加可靠,但其核心工作非常好。