3

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

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

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

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

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

4

2 回答 2

5

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

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

于 2012-12-10T04:26:31.513 回答
4

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.

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

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.
于 2012-12-09T15:01:20.660 回答