Delphi 将状态栏值从一个窗体转移到另一个窗体
每个表单上有两个相同的状态栏AdvOfficeStatusBar。这意味着Form1与Form2具有相同的状态栏。现在,在我关闭Form1之前,我希望状态栏中的所有值都传输到Form2上的状态栏。我想我可以像……那样一个接一个地做:Delphi 将状态栏值从一个窗体转移到另一个窗体,delphi,Delphi,每个表单上有两个相同的状态栏AdvOfficeStatusBar。这意味着Form1与Form2具有相同的状态栏。现在,在我关闭Form1之前,我希望状态栏中的所有值都传输到Form2上的状态栏。我想我可以像……那样一个接一个地做: procedure TForm2.FormShow(Sender: TObject); begin AdvOfficeStatusBar1.Panels[0].Text := Form1.AdvOfficeStatusBar1.Panels[0].Text; Adv
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,我试着给你一些选择,而不仅仅是一个没有肉的简单答案。