線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3369
推到 Plurk!
推到 Facebook!

为什么要RegisterClass?

答題得分者是:vitojeng
like
一般會員


發表:30
回覆:35
積分:18
註冊:2005-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-29 10:45:24 IP:61.242.xxx.xxx 訂閱

[code delphi]

unit Unit1;

interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit2, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Panel1: TPanel;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var s:Tmemorystream;
rr:Twriter;
ff:TFrame2;
begin
ff:=TFrame2.Create (self);
ff.Parent :=Panel1;
s:=Tmemorystream.Create ;
s.WriteComponent(ff);
s.SaveToFile('a');
s.Free; end;
procedure TForm1.Button2Click(Sender: TObject); var
s:Tmemorystream;
ff:TFrame2; begin
classes.RegisterClass(TFrame2);
classes.RegisterClass(Tlabel);
classes.RegisterClass(TButton);
s:=Tmemorystream.Create ;
s.LoadFromFile('a');
ff := TFrame2(TFrame.Create(Self));
ff.Parent :=self;
s.ReadComponent(ff) ;
s.Free;
end;

[/code]


为什么要RegisterClass(TFrame2)?我在interface引用了Unit2呀,上述代码执行后,[red]报错,提示'Class TLabel not found',这是为何?也要RegisterClass(TLabel)吗?为什么呢?为什么也还要RegisterClass(TButton)呢?[/red]在TForm的Publisher部分有TLabel呀

定义时TButton和TLabel的类信息就注册到运行时信息库中了,但为何在后面还要用RegisterClass(TButton)和RegisterClass(TLabel)呢? 为什么在定义Button:TButton时,不要先注册TButton呢?

实在是不明白,还请各位大大指点,万分感谢!
編輯記錄
Coffee 重新編輯於 2007-10-12 11:09:45, 註解 修改分類為問題‧
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-29 18:30:03 IP:59.124.xxx.xxx 未訂閱
ReadComponent / WriteComponent 會用到的 class 都必須執行 ReigsterClass
通常都放在 initinalization 區段
至於為什麼, 我也不知道...
vitojeng
一般會員


發表:2
回覆:13
積分:13
註冊:2003-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-02-05 12:49:37 IP:61.224.xxx.xxx 訂閱
* 在 published 區段只表示可透過 RTTI 讀取到屬性值, 所以會出現在 WriteComponent 寫入的資料之中.
* 使用 RegisterClass 或 RegisterClasses 的原因是在 ReadComponent 時, 讀取到 class name 時, 會需要使用 GetClass 來實現動態建立物件.
* 使用 ReadComponent 時, 必須要確認的是 stream 內資料使用到的 class 均在事前已經 RegisterClass, 而且整個 Application 只須要RegisterClass 一次, 這也是通常將需要 Reg 的 class 獨立成一個 unit (因為可能會很多), 且在 initization 區段進行的原因.


* 個人覺得 po 出來的 sample code 有點奇怪, 既然 TFrame2 已經 RegisterClass 了, 又何需要使用 TFrame2(TFrame.Create(Self)) 的方式建立物件 ? 若有特別的原因則另當別論了, 個人也能理解.
* 若發揮整個 delphi 串流機制, unit1 就不需要引用 unit2, 也能產生 TFrame2 的物件, unit1, unit2 之間也就互相沒有相依性了.

寫得不好, 僅供參考~
系統時間:2024-07-02 22:53:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!