我如何知道是不是创建了用户定义组件?

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。否则它已经存在,然后您可以使用FreeFreeAndNil 释放它。如果您使用免费,请注意将Nil 分配给Global_MemoIni。如果不这样做,则不能使用Global_MemoIni &lt;&gt; Nil 支票。

【讨论】:

我建议不要直接检查 nil,而是使用 if Assigned(GlobalMemoIni) then。在更大的源库中找到这些检查会容易得多,并且具有“阳性”测试而不是“非 xxx”测试的额外好处。 我对整个情况并不满意。组件只能在定义的位置创建一次,而不是在可能被反复调用的函数中。它不应该被手动释放,因为表单会处理这个问题。如果需要延迟实例化,它可以是一个检查它是否已经创建的属性(确实使用Assigned,Marjan),如果没有创建它。否则,我会在构造函数或表单的FormCreate 中执行此操作。 FWIW,如果只是被滥用为TStrings持有者,TStringList确实好很多。 伟大的 cmets @Rudy,但你不认为他们属于答案吗? 我有我的理由选择使用备忘录组件而不是 TStringList...谢谢大家...

以上是关于我如何知道是不是创建了用户定义组件?的主要内容,如果未能解决你的问题,请参考以下文章

我是不是遗漏了啥或者这是创建自定义控件/组件的方式

如何将用户定义的函数应用于变量,就像内置函数一样?

如何创建 Vue 3 自定义元素,包括子组件样式?

我创建了通知功能并收到此错误“未定义索引:用户”如何解决?

Angular 组件如何使用由用户定义的样式表?

如何创建自定义组件并将其添加到基于对话框的应用程序 (MFC)?