【问题标题】:Need OnCreate event for TFrame children需要 TFrame 子级的 OnCreate 事件
【发布时间】:2012-11-27 03:02:20
【问题描述】:

我在 Delphi 7 中遇到框架和继承问题。

假设我用visible=false 定义了一个框架(在设计时)。 现在我将此框架嵌入到某个表单中,并在表单内嵌入的框架实例上设置visible=true(也在设计时)。

现在假设我想根据在设计时设置的可见属性初始化嵌入框架。问题是简单地覆盖框架的构造函数不起作用,因为在构造函数中我总是得到visible=false(我猜是因为还没有读取DFM属性)。我也不想把初始化代码放在Form单元里面,因为这个逻辑只属于Frame。

您处理此类案件的最佳经验法则是什么?

澄清 Frame.Visible 只是一个例子。该问题与在设计时设置的框架或其内部组件的所有其他属性相关。例如,假设我们正在讨论 Frame 内 TEdit 的颜色。

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    Visible 属性在设计时被忽略。所有关于可见的信息都只存储在 Frame 的 dfm 中。 在使用框架的表单中将实例的可见性设置为 true 不会存储在表单的 dfm 中。手动添加没有帮助,它会在下次保存时被忽略并删除。

    经过澄清后,它可以显示为例如属性颜色。 在设计时创建了一个框架颜色 clBlack,在 Form used 2 Frames 中,颜色设置为 clRed 和 clBlue。

    unit Unit7;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TCallOnCreate=Procedure(Sender:TObject) of object;
    
      TFrame7 = class(TFrame)
        Button1: TButton;
        Procedure Loaded;override;
      private
        { Private-Deklarationen }
      public
        { Public-Deklarationen }
        Public Constructor Create(AOwner:TComponent);Override;
      end;
    
    implementation
    uses RTTI;
    {$R *.dfm}
    
    { TFrame7 }
    
    constructor TFrame7.Create(AOwner: TComponent);
    var
       ToCall    : TCallOnCreate;
       Routine : TMethod;
    begin
    
      inherited;
         Showmessage('Created ' + IntToStr(Color));
    
    
       Routine.Data := Pointer(AOwner);
       Routine.Code := AOwner.MethodAddress('InfoOnFrameCreate');
       if Assigned(Routine.Code) then
          begin
            ToCall:= TCallOnCreate(Routine);
            ToCall(Self);
          end;
    
    end;
    
    procedure TFrame7.Loaded;
    begin
      inherited;
        Showmessage('Loaded ' + IntToStr(Color));
    end;
    
    end.
    

    通过以下示例如何在将使用框架的窗体中实现代码。

    unit Unit6;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Unit7;
    
    type
      TForm6 = class(TForm)
        Frame71: TFrame7;
        Procedure InfoOnFrameCreate(Sender:TObject);
      private
    
        { Private-Deklarationen }
      public
    
        { Public-Deklarationen }
      end;
    
    var
      Form6: TForm6;
    
    implementation
    
    {$R *.dfm}
    
    { TForm6 }
    
    procedure TForm6.InfoOnFrameCreate(Sender: TObject);
    begin
      Showmessage('Frame Created');
    end;
    
    end.
    

    【讨论】:

    • 我只给出了可见的例子。假设我们正在讨论 Frame 内 TEdit 的可见值(或任何其他属性)。抱歉误导,我在问题中添加说明。
    【解决方案2】:

    您不能在构造函数中编写对属性敏感的代码,因为正如您所指出的,当构造函数运行时,还没有必要读取 DFM 属性。相反,覆盖框架类的Loaded 方法并将代码放在那里。在从 DFM 加载属性后调用它。

    请注意,Visible 不适用于该技术,但其他属性可以。

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2012-07-06
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多