使用两个With语句

时间:2013-02-08 04:37:29

标签: delphi with-statement

首先,我在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所以答案都没问题。要么如何修复,要么以更好的方式做到这一点。

2 个答案:

答案 0 :(得分: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区,只有5个。

答案 1 :(得分:3)

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

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

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