Delphi 将状态栏值从一个窗体转移到另一个窗体

Delphi 将状态栏值从一个窗体转移到另一个窗体,delphi,Delphi,每个表单上有两个相同的状态栏AdvOfficeStatusBar。这意味着Form1与Form2具有相同的状态栏。现在,在我关闭Form1之前,我希望状态栏中的所有值都传输到Form2上的状态栏。我想我可以像……那样一个接一个地做: procedure TForm2.FormShow(Sender: TObject); begin AdvOfficeStatusBar1.Panels[0].Text := Form1.AdvOfficeStatusBar1.Panels[0].Text; Adv

每个表单上有两个相同的状态栏AdvOfficeStatusBar。这意味着Form1与Form2具有相同的状态栏。现在,在我关闭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;
我想知道是否有一种更简单的方法?更少的代码…

您正在遭受

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

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

请注意,面板是一个数组属性。 通常,每个数组_属性都有一个关联的count属性。 我不确定在这个例子中它是什么,但我猜它叫做PanelCount

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

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

。如果AdvOfficeStatusBar与VCL状态栏类似,则分配。否则,使用for循环,如果包含索引计数器var声明的面板超过三个,则行数会更少。有人想知道为什么要使用状态栏作为重要状态的主存储。将状态保存在非可视存储中,然后能够将其传输到可视控件以供显示,这不是更好吗?它只是从登录屏幕启动程序时获得的值,如计算机名、ip、用户名……如果登录成功,我希望它们也出现在第二个表单上,因为它是主表单。没什么大不了的…无法编译您的建议…没有panelcount:[dcc32错误]Unit2.pas48:E2003未声明的标识符:“panelcount”。更改为AdvOfficeStatusBar1.Panels.Count:=Maxi;告诉我:[dcc32错误]Unit2.pas48:E2129无法分配给只读属性。为什么不分配:Form1.AdvOfficeStatusBar1.Panels.AssignForm2.AdvOfficeStatusBar1.Panels;它是有效的…@user763539,我试着给你一些选择,而不仅仅是一个没有肉的简单答案。