0

首先,我在 onselect 期间让 combobox1 填充了 combobox2。我开始了很长的路,见下文。

    procedure TFGetZoneDept.ComboBox1Select(Sender: TObject);
begin
  Combobox2.Clear;
  with Combobox1 do
  begin
      if text = '3' then
      begin
        with combobox2 do
        begin
          Add('Zone 3 depts');
          Add('Zone 3 depts');
          Add('Zone 3 depts');
          Add('Zone 3 depts');
          Add('Zone 3 depts');
          Add('Zone 3 depts');
        end;   {with combobox2}
      end;  {If }
      if text = '4' then
      begin
        with ComboBox2 do
        begin
          add('Zone 4 depts');
          add('Zone 4 depts');
          add('Zone 4 depts');
          add('Zone 4 depts');
          add('Zone 4 depts)';
        end;{combobox2 with}
      end;{IF}
      if text ='1' then
      begin
        with ComboBox2 do
        begin
          add('Zone 1 depts');
          add('Zone 1 depts');
          add('Zone 1 depts');
          add('Zone 1 depts');
          add('Zone 1 depts');
          add('Zone 1 depts');
        end; {combobox2 with}
      end; {IF}
      if text ='2' then
      begin
        with ComboBox2 do
        begin
          add('Zone 2 depts');
          add('Zone 2 depts');
          add('Zone 2 depts');
          add('Zone 2 depts');
          add('Zone 2 depts');
          add('Zone 2 depts');
        end; {Combobox2 with}
      end; {IF}
      if text ='BoneYard' then
      begin
        with ComboBox2 do
        begin
          add('BoneYard depts');
          add('BoneYard depts');
          add('BoneYard depts');
          add('BoneYard depts');
          add('BoneYard depts');
          add('BoneYard depts');
        end; {combobox2 with}
      end; {IF}
      if text = 'Misc' then
      begin
        with ComboBox2 do
          begin
            add('Misc Depts');
            add('Misc Depts');
            add('Misc Depts');
            add('Misc Depts');
            add('Misc Depts');
            add('Misc Depts');
          end; {combobox2 with}
      end; {IF}
  end;{combobox1 with}
  Combobox2.Enabled := true;
end;

我注意到你不能在里面使用with另一个with......或者我做错了。其次,我开始认为必须有更好的方法 :D 所以任何一个答案都可以。如何解决这个问题或以更好的方式做到这一点。

4

2 回答 2

8

with嵌套语句是完全可能的。这通常不是一个好主意,因为with语句的坏处是复合的,但是编译器在解释代码时没有问题。解析标识符时,编译器简单地从内部语句到外部语句,直到找到一个具有它正在寻找的方法或属性的对象。

编译器找到的可能与您期望的不同。


您可以通过使用一些变量和循环来避免重复代码以及消除对with语句的需要,从而使您的代码更加简洁。

procedure TFGetZoneDept.ComboBox1Select(Sender: TObject);
var
  text1, text2: string;
  i: Integer;
begin
  Combobox2.Clear;
  text1 := Combobox1.Text;
  if text1 = '3' then
    text2 := 'Zone 3 depots'
  else if text1 = '4' then
    text2 := 'Zone 4 depts'
  else if text ='1' then
    text2 := 'Zone 1 depts'
  else if text ='2' then
    text2 := 'Zone 2 depts'
  else if text ='BoneYard' then
    text2 := 'BoneYard depts'
  else if text = 'Misc' then
    text2 := 'Misc Depts';
  for i := 1 to 6 do
    Combobox2.Items.add(text2);
  Combobox2.Enabled := true;
end;

当你避免重复代码时,你也避免了错误。除非您打算让所有案例都有六个选项,第 4 区只有五个选项。

于 2013-02-08T04:44:35.117 回答
3

如果您使用嵌套的 With 语句,请打自己的脸以节省时间。

人们对 GOTO 和 WITH 语句有强烈的争论。WITH 语句更糟糕,因为它们可以嵌套,在每次使用时都加剧了它们的邪恶。

With的第一条规则,没有人谈论它(或使用它。)

于 2013-02-08T04:58:45.753 回答