2011-07-31 60 views
2

我創建了一個備忘錄的過程中,使用此代碼:我如何知道用戶定義組件是否被創建?

Global_MemoIni := TMemo.Create(Conf); 
    Global_MemoIni.Parent := Conf; 
    Global_MemoIni.Visible := False; 
    Global_MemoIni.Align := alClient; 
    Global_MemoIni.WordWrap := False; 

當我再次調用的程序再次創建global_memoini。
如何知道組件是否已創建,因此我不需要再次調用它?

更新:我可以使用Global_MemoIni.Free創建代碼的上方,下一次創建 的Global_memoini一次......但我想知道這是創建...

謝謝

+0

看起來像延遲初始化/單例模式,它可以被提取到一個輔助方法(GetMemoIni)中。但是,「用戶定義」是什麼? – mjn

回答

5

你可以檢查Global_MemoIni是否爲Nil,如果是則創建TMemo。否則它已經存在,您可以使用FreeFreeAndNil釋放它。如果您使用免費,請注意您將Nil指定爲Global_MemoIni。如果您沒有,則不能使用Global_MemoIni <> Nil檢查。

+2

我建議不要直接檢查nil,而是使用'if Assigned(GlobalMemoIni)then'。在更大的源代碼庫中查找這些檢查將變得更加容易,並且還具有「積極」測試而不是「非xxx」測試的額外好處。 –

+0

我對整個情況並不滿意。該組件應該只在一個定義的位置創建一次,而不是一個可能反覆調用的函數。它不應該手動釋放,因爲表單會照顧到這一點。如果需要懶惰​​的實例化,它可以是一個屬性,用於檢查它是否已經創建(確實使用'Assigned',Marjan),並且只有在創建時才創建。否則,我會在構造函數或窗體的FormCreate中執行此操作。 –

+0

FWIW,如果它只被濫用爲'TStrings'持有者,'TStringList'確實好很多。 –

3

我真的不明白使用備忘錄而不是TStringList這個更輕量級的要點。只是做

unit UnitName; 

interface 

uses SysUtils, Windows, Classes, ...; 

var Global_INI: TStringList; // <-- it's defined in the interface section, therefore 
          //  it can be accessed by any unit which uses this unit 

implementation 

initialization 
    Global_INI := TStringList.Create; 
    Global_INI.LoadFromFile('C:\config.ini'); // <-- replace the file name with the 
               //  one you want 

finalization 
    FreeAndNil(Global_INI); 

end; 
+0

你是如何得出結論的:備忘錄被非視覺使用 –

+0

Global_MemoIni.Visible:= False;但你是對的,他可能會顯示它... – ComputerSaysNo

+0

好吧,很多人使用控件作爲數據結構,這個假設可能正確,不幸的是:-( –

1

如果你不知道對象使用的創作狀態:

if not Assigned(Global_MemoIni) then 
begin 
    Global_MemoIni := TMemo.Create(Conf); 
    ... 
end 

而且不要忘記銷燬對象時使用FreeAndNil(Global_MemoIni)

+0

這更簡單...我很愚蠢的 – azrael11

1

不要這樣做是一個任意的功能。無論是創建窗體的FormCreate組件,甚至構造函數,或使其形式的只讀屬性,並使用延遲實例化,即

if not Assigned(Global_MemoIni) then 
begin 
    Global_MemoIni := TMemo.Create(Self); 
    // rest of your code 
end; 
Result := Global_MemoIni; 

但爲什麼全球性的?如果您將其設置爲表單的一個字段和相應的只讀屬性,則該表單很容易訪問,您可以按照上面所示的方式進行保護。

FWIW,而不是釋放組件,讓所有者(表單)這樣做。這樣,只要表單存在,它就可以使用,並且不會發生討厭的無效指針問題。

+0

這很容易...我很愚蠢 – azrael11

+0

一個不必愚蠢的使用全局變量。

相關問題