Delphi动态表单数组和数据数组管理



我必须解决下一个问题:

表格23:

public
 { Public declarations }
 FormsArray : array of TForm24;
end;

Procedure Create_form;
begin
 SetLength(FormsArray, Length(FormsArray)+1);
 FormsArray[Length(FormsArray)-1] := TForm24.Create(Self);
end;

表格24:

public
end;
var
 UniqueValue : Array of ShortString;
Procedure Fill_Unique;
var
 tmp1 : Longint;
begin
 SetLength(UniqueValue, 256);
 for tmp1 := 0 to Length(UniqueValue)-1 do
 begin
  UniqueValue[tmp1] := IntToStr(tmp1);
 end;
end;
Procedure OnButtonClick(Sender);
begin
 Fill_Unique;
end;

当我有一张Form24表格,并填写了一些值时,就可以了。

当我有两个形式Form24(FormsArray[0]和FormsArray[1]),并且我在一个形式中更改UniqueValue时,那么我有两种形式的值。

我创建FormsArray[0]和FormsArray[1]

当我点击FormsArray[0]上的按钮时:

FormsArray[0]-唯一值[…]='1,2,3,4,5,6,7,8,9…';

FormsArray[1]-唯一值[…]='1,2,3,4,5,6,7,8,9…';

当我点击FormsArray[1]上的按钮时:

FormsArray[0]-唯一值[…]='1,2,3,4,5,6,7,8,9…';

FormsArray[1]-唯一值[…]='1,2,3,4,5,6,7,8,9…';

当我将代码更改为:时

表格24:

public
 UniqueValue : Array of ShortString;
end;

然后我点击FormsArray[1]上的按钮,然后我有:

FormsArray[0]-唯一值[…]=";

FormsArray[1]-唯一值[…]=";

UniqueValue为空。

我需要在我创建的每个表单Form24中都有独立的数组(在我创建了的每个表单中都有不同的UniqueValue)。

如何做到这一点?我做错了什么?

谢谢你的帮助。

已解决

我在这里写的答案是-1。那就没有解决办法了。搜索自己。

听起来你已经解决了这个问题。让UniqueValue成为表单类的成员。例如,将它放在类声明的public部分中。

type
  TForm24 = class(TForm)
  public
    UniqueValue: array of string;
  end;

您展示的第一个代码将数组作为全局变量,它当然由表单类的所有实例以及程序中的其他所有实例共享。您可能会感到困惑,认为与表单类在同一文件中声明的任何内容都以某种方式"属于"该类,但如果您这样认为,那就错了。为了使某个东西属于一个类,它应该在该类的内部声明,而不仅仅是在同一个单元文件中的某个地方。

看起来您可能也想让Fill_UniqueOnButtonClick也成为表单类的成员。在您展示的代码中,它们是独立的过程,因此它们没有引用应该使用的任何形式。这意味着它们不能引用UniqueValue,因为它们不知道要在哪个TForm24实例的字段上操作。

您的UniqueValue数组是全局声明的,因此多个表单实例将访问内存中的同一个数组。将数组移动到Form类的public部分可以使该Form的每个实例都有自己的数组,该数组独立于其他Form实例。只需确保删除全局数组即可。

最新更新