2013-06-05 35 views
1

我已經在一個單獨的單元擴展TForm的...的RegisterClass X擴展TForm的/ EFilerError「命名TForm的一類已經存在」

TForm = class(Forms.TForm) 
protected 
{ convenient extensions } 
public 
{ more extensions } 
end; 

而這個單元(與擴展TForm的)中的所有聲明窗體的單位,我想申請但這些擴展...

,在一些單位有下面的代碼片段:

Initialization 
    RegisterClass(TFormN); 

Finalization 
    UnRegisterClass(TFormN); 

可是這樣我得到的消息[EFilerEr ROR]「命名的TForm的一類已經存在」

我花了幾天的尋找一種方式來解決/工作解決此衝突,但沒有成功......

有沒有人經歷過這樣的......?或者可以闡明爲什麼這個問題......?


的問題是,我已經實現了這個單元,具有擴展形式,在2個項目 - 成功...

剛纔,在第三個項目,表單類被稱爲而不實例化...我不能擴展的類形式從改變:

TForm的=類(Forms.TForm)

到:

TStyleForm = A類(Forms.TForm)

...


什麼我需要的是這樣的:

TFormStyle = class(Forms.TForm) 
public 
    constructor Create(AOwner: TComponent); override; 
end; 

TForm = ^TFormStyle; 

但在單位我不能這樣做:

TMyForm = class(TForm) 
    { something... } 
end; 

因爲現在它是一個指針......

回答

0

您現在可以在你的程序兩種截然不同的類型,這兩種名爲TForm。 VCL中聲明的名稱是TForm。由於您試圖將您的TForm註冊到全局註冊表中,使用與VCL版本相同的名稱,註冊自然會失敗。

一些可能的前進方向:

  1. 重新命名方式,以避免衝突。
  2. 根本不要註冊你的課程。你不需要註冊表單,因爲它們沒有被流式框架實例化。你通過提供一個元類來實例化它們。可以是Application.CreateForm,也可以是標準構造函數TForm.Create。您需要確保您始終在Forms之後的任何使用條款中列出聲明您的TForm的設備。或者使用完全範圍的類型,如MyForms.TForm
  3. 如果您使用了Delphi的更高版本,則可以使用類助手來添加您的擴展。

就我個人而言,我傾向於做上面的1和2。

請注意,我假設您的意圖是您的TForm用於所有表單而不是Forms.TForm