我如何知道是不是创建了用户定义组件?
Posted
技术标签:
【中文标题】我如何知道是不是创建了用户定义组件?【英文标题】:How can i know if the user define component is created?我如何知道是否创建了用户定义组件? 【发布时间】:2011-10-16 19:17:22 【问题描述】:我在一个过程中创建了一个备忘录,使用以下代码:
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
一次...但我想知道这是否被创建...
谢谢
【问题讨论】:
看起来像惰性初始化/单例模式,可以提取到辅助方法(GetMemoIni)中。但什么是“用户定义”? 【参考方案1】:如果不知道对象使用的创建状态:
if not Assigned(Global_MemoIni) then
begin
Global_MemoIni := TMemo.Create(Conf);
...
end
并且在销毁对象时不要忘记使用FreeAndNil(Global_MemoIni)
。
【讨论】:
【参考方案2】:老实说,我不明白使用备忘录代替更轻量级的 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;
【讨论】:
你是如何得出备忘录被非视觉使用的结论 好吧,很多人使用控件作为数据结构,不幸的是,这个假设可能是正确的:-(【参考方案3】:不这样做是一个任意函数。要么在FormCreate
中创建组件,甚至是表单的构造函数,或者使其成为表单的只读属性,并使用惰性实例化,即
if not Assigned(Global_MemoIni) then
begin
Global_MemoIni := TMemo.Create(Self);
// rest of your code
end;
Result := Global_MemoIni;
但为什么它是全球性的?如果将其设置为表单的字段和对应的只读属性,则可以轻松访问它,并且可以按照上面所示的方式对其进行保护。
FWIW,不是释放组件,而是让所有者(表单)这样做。这样,只要表单存在,它就可以使用,并且不会发生令人讨厌的无效指针问题。
【讨论】:
【参考方案4】:您可以检查 Global_MemoIni 是否为 Nil,如果是则创建 TMemo。否则它已经存在,然后您可以使用Free
或FreeAndNil
释放它。如果您使用免费,请注意将Nil
分配给Global_MemoIni
。如果不这样做,则不能使用Global_MemoIni <> Nil
支票。
【讨论】:
我建议不要直接检查 nil,而是使用if Assigned(GlobalMemoIni) then
。在更大的源库中找到这些检查会容易得多,并且具有“阳性”测试而不是“非 xxx”测试的额外好处。
我对整个情况并不满意。组件只能在定义的位置创建一次,而不是在可能被反复调用的函数中。它不应该被手动释放,因为表单会处理这个问题。如果需要延迟实例化,它可以是一个检查它是否已经创建的属性(确实使用Assigned
,Marjan),如果没有创建它。否则,我会在构造函数或表单的FormCreate
中执行此操作。
FWIW,如果只是被滥用为TStrings
持有者,TStringList
确实好很多。
伟大的 cmets @Rudy,但你不认为他们属于答案吗?
我有我的理由选择使用备忘录组件而不是 TStringList...谢谢大家...以上是关于我如何知道是不是创建了用户定义组件?的主要内容,如果未能解决你的问题,请参考以下文章