2012-03-15 69 views
-2

我必须解决一个问题:Delphi的动态形式阵列和数据阵列管理

Form23:

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; 

Form24:

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] - UniqueValue [...] = '1,2,3,4,5,6,7,8,9 ......';

FormsArray [1] - UniqueValue [...] ='1,2,3,4,5,6,7,8,9 ...';

当我点击FormsArray按钮[1]:

FormsArray [0] - UniqueValue [...] =“1,2,3,4,5,6,7,8,9 .. ';

FormsArray [1] - UniqueValue [...] ='1,2,3,4,5,6,7,8,9 ...';

当我更改代码:

Form24:

public 
UniqueValue : Array of ShortString; 
end; 

和我点击按钮FormsArray [1]那么我:

FormsArray [0] - UniqueValue [... ] ='';

FormsArray [1] - UniqueValue [...] ='';

UniqueValue为空。

我需要在我创建的每个窗体Form24中有独立数组(每个窗体创建时都有不同的UniqueValue)。

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

感谢您的任何帮助。

已解决!

我得到-1的解决方案,我写在这里。那么将是无法解决的。搜索你自己。

+0

在你的“解决方案”中陈述的所有内容都是无关紧要的(你从来没有向我们展示过你所说的,所以谁在乎你从哪里调用它或者什么时候?)或者重复你已经在问题中陈述的内容(表单数组) 。您是不是想要显示* strings *数组的新声明,就像我已经在我的答案中显示的那样? – 2012-03-16 13:32:51

+0

问题不在代码中,而是来自调用方法。我不知道错误在哪里。如果我知道,我不会问。我发布解决方案,这种情况下的主要问题在哪里(如果有人遇到这个问题,因为很难找到)。我得到了-1,然后我将删除解决方案。 – wcale 2012-03-16 20:29:48

回答

3

这听起来像你已经解决了它。使UniqueValue成为的成员。例如,将它放在类声明的public部分。

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

您展示了首代码有数组作为全局变量,这当然是由你的窗体类的所有实例共享的,以及一切在你的程序。你可能会觉得困惑,认为与表单类相同的文件中声明的任何东西“属于”该类,但如果你认为这是错误的。为了制作属于某个类的东西,应该在里声明这个类,而不是在同一个单元文件中的某个地方。

看起来您可能想让Fill_UniqueOnButtonClick也是表单类的成员。在你展示的代码中,它们是独立的程序,所以它们没有提及它应该处理的任何形式。这意味着他们不能参考UniqueValue,因为他们不会知道在哪个TForm24实例的字段上进行操作。

+0

所以我需要将Fill_Unique移动到Form23并从Form23中填充数组UniqueValue?它只是解决方案? – wcale 2012-03-15 23:09:22

+1

我的意思是说你将'Fill_Unique'移动到'TForm24',因为它是在'TForm24'的字段上运行的。你也可以把'Fill_Unique'作为一个独立的函数,但是给它一个'TForm24'类型的参数。 – 2012-03-16 00:10:17

+0

感谢你我设法解决这个错误。再次感谢。 – wcale 2012-03-16 00:23:44

2

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

+0

当我这样做时,我有作为结果空数组(FormsArray [1] ='') – wcale 2012-03-15 23:07:17

+0

你声称没有任何意义,Wcale。 FormsArray是* forms *的数组,因此它的任何元素都不会等于空字符串。 – 2012-03-16 00:11:40

+0

对不起,我的错误是“UniqueValue为空”。不是FormsArray。我有解决方案,正如你所说当我使用一个按钮(我是编辑问题)。感谢帮助。 – wcale 2012-03-16 00:19:52