【问题标题】: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)中。但什么是“用户定义”?

标签: delphi components delphi-7


【解决方案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 &lt;&gt; Nil 支票。

      【讨论】:

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