我在Delphi 7中遇到Frames和继承问题。
假设我使用visible=false
定义了一个框架(在设计时)。
现在我将这个框架嵌入到某个窗体中,并在窗体内嵌入的框架实例上设置visible=true
(也在设计时)。
现在假设我想根据设计时设置的可见属性初始化嵌入帧。问题是简单地覆盖框架的构造函数不起作用,因为在构造函数内部我总是得到visible=false
(我想因为还没有读取DFM属性)。我也不想将初始化代码放在Form单元中,因为这个逻辑只属于Frame。
处理此类案件的最佳经验是什么?
澄清
Frame.Visible
只是一个例子。该问题与在设计时设置的框架或其内部组件的所有其他属性相关。例如,假设我们正在讨论框架内TEdit的颜色。
答案 0 :(得分:3)
您无法在构造函数中编写属性敏感代码,因为正如您所指出的,当构造函数运行时,DFM属性尚未被读取。相反,覆盖框架类的Loaded
方法并将代码放在那里。在从DFM加载属性后调用它。
添加注明,Visible
将不适用于该技术,但其他属性将。
答案 1 :(得分:2)
在设计时忽略Visible属性。关于可见的所有信息仅存储在帧的dfm中。 在使用框架的表单中将实例的可见性设置为true将不会存储在表单的dfm中。手动添加它没有帮助,它会被忽略并在下次保存时删除。
澄清后,可以用例如物业颜色。 在设计时clBlack创建了一个框架颜色,在Form中使用了2个Frames,Color设置为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.
使用以下示例如何在Form中实现代码,然后使用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.