2012-12-09 108 views
3

我有問題,在Delphi 7需要的OnCreate事件TFRAME兒童框架和繼承

假設我定義了一個框架與visible=false(設計時間)。 現在我以某種形式嵌入此框架,並在框架的嵌入式實例(也在設計時)上設置visible=true

現在假設我想根據在設計時設置的可見屬性來初始化嵌入幀。問題是簡單重寫框架的構造函數不起作用,因爲在構造函數中我總是得到visible=false(我猜是因爲DFM屬性還沒有被讀取)。我也不想把初始化代碼放在Form單元中,因爲這個邏輯只屬於Frame。

對於處理這種情況,你最好的經驗法則是什麼?

說明性 Frame.Visible只是一個例子。該問題與框架的所有其他屬性或其內部組件有關,這些屬性都是在設計時設置的。例如,假設我們正在討論幀內TEdit的顏色。

回答

3

因爲,正如你指出,DFM的性能不一定是讀的構造運行然而,當你不能寫在constructor屬性敏感的代碼。相反,重寫框架類的Loaded方法並將代碼放在那裏。在從DFM加載屬性後調用它。

添加註釋,Visible將無法​​使用該技術,但其他屬性會。

+0

已經想通了,但謝謝你的明確答案。 – gamliela

2

Visible屬性在設計時被忽略。所有關於可見性的信息只存儲在幀的dfm中。 使用框架將窗體中可見的實例設置爲true將不會存儲在窗體的dfm中。手動添加它不會有幫助,它會在下次保存時被忽略並刪除。

澄清之後,可以用例如屬性顏色。 在設計時創建一個框架顏色clBlack,在Form中使用了2個框架,顏色設置爲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的Form中實現代碼。

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. 
+0

我只給出了可見的例子。假設我們正在討論框架內TEdit的可見值(或任何其他屬性)。對不起,誤導,我在問題中加了澄清。 – gamliela