1

我希望为用户提供以下选项:

  1. 做一点事?答案可以是是或否
  2. 多少次?这可以是 100、500 或 1000
  3. 你要总结吗?再次,是或否。

为此,我创建了一个表单,在该表单上放置了一个 ValueListEditor,其中第一列称为选项(在此列中我写问题),第二列称为选择(是/否,100/500/1000 和分别是/否)。

显然,只有当用户在第 1 行中选择“是”时,第 2 行和第 3 行才有意义。因此,我想创建第 2 行和第 3 行,并仅在用户为第 1 行选择“是”时才提供相应的选项。

我为此编写了以下代码,但这显然是错误的。顺便说一句,我一般是编程新手,我发现很难找到一本关于 Delphi 的好书。由于没有其他人在我所在的地方进行任何类型的编程,因此问题变得更加严重,因此它会变得非常令人沮丧 - 并且非常耗时(昨天我花了一整天的大部分时间才想出以下内容代码!我什至不知道 ValueListEditor;当我涉水于组织奇特的工具面板时,它看起来很有希望,所以我使用了它。)。任何指针?

这是我的代码(非常感谢):

procedure TfrmDoSomething.FormCreate(Sender: TObject);
var
  I: integer;
  FirstItemProp, SecondItemProp, ThirdItemProp: TItemProp;
begin
  //add first row
  ValueListEditor1.InsertRow('Do something?', '', True);
  FirstItemProp := TItemProp.Create(ValueListEditor1);
  FirstItemProp.PickList.Add('Yes');
  FirstItemProp.PickList.Add('No');
  ValueListEditor1.ItemProps[0] := FirstItemProp;


//now add the subsequent two rows only if the value for Row#1 is Yes
  if (ValueListEditor1.ItemProps[0] = FirstItemProp.PickList[0]) then
    begin
      ValueListEditor1.InsertRow('Number of times', '', True);
      SecondItemProp := TItemProp.Create(ValueListEditor1);
      SecondItemProp.PickList.Add('100');
      SecondItemProp.PickList.Add('500');
      SecondItemProp.PickList.Add('1000');
      ValueListEditor1.ItemProps[1] := SecondItemProp;

      ValueListEditor1.InsertRow('Summary?', '', True);
      ThirdItemProp := TItemProp.Create(ValueListEditor1);
      ThirdItemProp.PickList.Add('Yes');
      ThirdItemProp.PickList.Add('No');
      ValueListEditor1.ItemProps[2] := ThirdItemProp;
    end;

end;

@KenWhite,谢谢。根据您使用 ComboBox 的建议,我编写了以下代码。我想我现在的问题是我为 CB 使用了错误的事件。我的 CB 在运行时以编程方式创建得很好(顺便说一下,CB1 是全局声明的)。however, when "yes" is selected, it does not go the second procedure "OnChange", which leads me to think that OnChange is the wrong event. 我还尝试了 OnClick 和其他一些 - 无济于事。此外,第二个过程中的 ShowMessage 部分只是为了测试我选择的事件是否正确。稍后我将不得不编写代码来创建另外两个组合框。谢谢。

procedure TfrmCBDoSomething.FormCreate(Sender: TObject);
var
  Label1: TLabel;
begin
  Label1 := TLabel.Create(Self);
  Label1.Align := alLeft;
  CB1 := TComboBox.Create(Self);
  CB1.Parent := Self;
  CB1.Align := alRight;

  Label1.Caption := 'Do Something?';
  Label1.Parent := Self;
  CB1.AddItem('Yes', nil);
  CB1.AddItem('No', nil);
end;


procedure TfrmCBTry.CB1OnChange(Sender: TObject);

begin
  if (CB1.Text = 'Yes') then ShowMessage('Got it!!');
  if (CB1.ItemIndex = 0) then ShowMessage('Got it!!');
  if (Cb1.Items.IndexOf('Yes') = 0) then ShowMessage('Got it!!')
end;
4

1 回答 1

1

根据您的编辑和使用TComboBox(假设您的问题是关于 VCL,正如您所提到的TValueListEditor并且没有给出 Delphi 版本):

您需要更改添加项目的方式,然后OnChange在代码中分配事件。

procedure TfrmCBDoSomething.FormCreate(Sender: TObject);
var
  Label1: TLabel;
begin
  Label1 := TLabel.Create(Self);
  Label1.Align := alLeft;
  CB1 := TComboBox.Create(Self);
  CB1.Parent := Self;
  CB1.Align := alRight;
  CB1.Sorted := False;   // Keep order of items entered

  Label1.Caption := 'Do Something?';
  Label1.Parent := Self;
  CB1.Items.Add('Yes');
  CB1.Items.Add('No');
  // Assign the event handler
  CBI.OnChange := CB1OnChange;

  CB2 := TComboBox.Create(Self);
  CB2.Parent := Self;
  CB2.Items.Add('100');
  CB2.Items.Add('200');
  CB2.Items.Add('500');
  // Position CB2 and add label for second set of options
  // Repeat with CB3 for third set of options
end;

procedure TfrmCBTry.CB1OnChange(Sender: TObject);
begin
  // Enable both CB2 and CB3 if CB1 is 'Yes'
  CB2.Enabled := (CB1.ItemIndex = 0);  // Yes selected
  CB3.Enabled := (CB1.ItemIndex = 0);  
end;

我不确定您为什么要在运行时执行上述所有操作。这可以很容易地在表单设计器中完成,只需在表单上放置三个标签和三个组合框并以可视方式或在对象检查器中设置它们的属性(在ItemsorOnChange事件的情况下,您可以通过双击来完成外壳它在对象检查器的事件选项卡中 - 这也会自动将其分配给组合框)。

(供将来参考:您可能应该刚刚删除了原始问题并询问了有关 TComboBox 的新问题,或者(因为您没有收到任何答案)只是删除了此问题的原始内容并使用了您编辑中的信息 - 又名第二question - 作为内容,这样问题就很清楚了。我只回答了第二个问题,因为它是唯一一个有合理答案的问题。)

于 2013-09-18T02:59:59.113 回答