将状态栏值从一种形式传输到另一种形式

时间:2014-04-21 01:33:21

标签: delphi

我在每个表单上都有两个相同的状态栏(AdvOfficeStatusBar)。这意味着Form1具有与Form2.Now相同的状态栏,在关闭Form1之前,我希望状态栏中的所有值都转移到form2上的那个值。我想我可以像......一样一个接一个地做:

procedure TForm2.FormShow(Sender: TObject);
begin
AdvOfficeStatusBar1.Panels[0].Text := Form1.AdvOfficeStatusBar1.Panels[0].Text;
AdvOfficeStatusBar1.Panels[1].Text := Form1.AdvOfficeStatusBar1.Panels[1].Text;
AdvOfficeStatusBar1.Panels[2].Text := Form1.AdvOfficeStatusBar1.Panels[2].Text;
AdvOfficeStatusBar1.Panels[4].Text := Form1.AdvOfficeStatusBar1.Panels[4].Text;
AdvOfficeStatusBar1.Panels[5].Text := Form1.AdvOfficeStatusBar1.Panels[5].Text;
AdvOfficeStatusBar1.Panels[6].Text := Form1.AdvOfficeStatusBar1.Panels[6].Text;  
end;

我想知道是否有更简单的方法?少代码......

1 个答案:

答案 0 :(得分:3)

您患有anti-pattern called copy-paste-programming.

编程非常简单,但维护困难 每次向一个状态栏添加一行时,您必须返回并更新为代码,以便将其链接到另一个状态栏。
忘记更新代码很容易忘记它的工作,这就是为什么这是不好的做法。

更好的方法是使用Assign或者如果这不起循环。两者都在下面演示。

请注意,Panelarray property 通常,每个array_property都有一个关联的count属性 我不确定这个例子是什么,但我猜它叫PanelCount

根据David的建议,将状态存储在程序中的某个位置会更好,因为您可能会重新设计表单并丢失StatusBar,在这种情况下,您也会丢失存储空间。

type 
  TForm2 = class(TForm)
  private
    StatusStore: array of string;
    .....
  end;

implementation

procedure TForm2.FormCreate(Sender: TObject);
begin
  //Initialisation, you cannot use a loop, unless you'd read it from a file.
  SetLength(StatusStore,6);
  StatusStore[0]:= 'a';
  StatusStore[1]:= 'b';
  StatusStore[2]:= 'c';
  StatusStore[3]:= 'd';
  StatusStore[4]:= 'e';
  StatusStore[5]:= 'f';
end;

procedure TForm2.FormShow(Sender: TObject);
var
  i,maxi: integer;
begin
  StatusStore[0]:= 'Showing Form2';
  Maxi:= SizeOf(StatusStore); 
  i:= 0;
  AdvOfficeStatusBar1.PanelCount:= Maxi;
  while (i < Maxi) do begin
    AdvOfficeStatusBar1.Panels[i].Text:= StatusStore[i]; 
  end; {while}
  Form1.AdvOfficeStatusBar1.Panels.Assign(Form2.AdvOfficeStatusBar1.Panels);
end;

现在无论要显示什么数据,无论有多少项目,显示都会更新 如果您希望每个表单的第一个或最后一个项目不同,您甚至可以对循环进行编程以跳过项目。