2012-03-15 70 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