我在每个表单上都有两个相同的状态栏(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;
我想知道是否有更简单的方法?少代码......
答案 0 :(得分:3)
您患有anti-pattern called copy-paste-programming
.
编程非常简单,但维护困难
每次向一个状态栏添加一行时,您必须返回并更新为代码,以便将其链接到另一个状态栏。
忘记更新代码很容易忘记它的工作,这就是为什么这是不好的做法。
更好的方法是使用Assign
或者如果这不起循环。两者都在下面演示。
请注意,Panel
是array 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;
现在无论要显示什么数据,无论有多少项目,显示都会更新 如果您希望每个表单的第一个或最后一个项目不同,您甚至可以对循环进行编程以跳过项目。