2010-08-25 48 views
1

經過大量搜索後,它看起來像我必須分配RegisterComponentsProcRegisterPropertyEditorProc,我已經完成。如何在運行時註冊組件和屬性編輯器?

但是,我想我可以打電話給我的設計時間寄存器功能,即<myComponentUnit>.Register();

當我這樣做,我得到堆棧溢出,因爲,嗯...

procedure myComponentUnit.Regiter; 
begin 
    RegisterPropertyEditor(TypeInfo(Integer), 
         TMyComponent, 'myProperty', TMyProperty); 

末;

procedure RegisterPropertyEditor(PropertyType: PTypeInfo; 
    ComponentClass: TClass; const PropertyName: string; 
    EditorClass: TPropertyEditorClass); 
begin 
    if Assigned(RegisterPropertyEditorProc) then 
    RegisterPropertyEditorProc(PropertyType, ComponentClass, PropertyName, 
     EditorClass); 
end; 

所以,我叫.Register();
這就要求RegisterPropertyEditor()
其稱之爲RegisterPropertyEditorProc()
這就要求RegisterPropertyEditor()< === aaargh!

那麼,我應該在我的RegisterPropertyEditorProc的主體中有什麼?

經過進一步搜索,它看起來像我想直接調用DesignEditors.RegisterPropertyEditor(),但它不是在接口部分...

回答

4

有在嘗試註冊在運行時的屬性編輯器沒有意義的,因爲它在運行時不能用於開始。它只能在設計階段在IDE中使用。

+0

不,如果你寫自己的財產編輯器,我希望。不幸的是,沒有答案在http://www.drbob42.com/delphi/property.htm或http://delphi.about.com/library/bluc/text/uc092501a.htm等 – Mawg 2010-08-25 06:17:54

+0

感嘆,我想你是正確。我會找到另一種方式。 – Mawg 2010-08-25 10:08:33

+0

同樣,屬性編輯器(和組件編輯器)僅在設計時可用,因爲它們僅在設計時包中實現,並且不允許在運行時可執行文件中使用設計時包。你首先想完成什麼? – 2010-08-25 23:18:23

4

Delphi不包含DesignEditors單元的源代碼;它的實現僅在DesignIDE包中提供。該軟件包可以訪問IDE內部,如註冊財產編輯列表。 IDE將值分配給RegisterComponentsProc和RegisterPropertyEditorProc回調函數。如您注意到的,RegisterPropertyEditor調用RegisterPropertyEditorProc。 IDE提供了自己的函數來處理該事件。

如果您想在運行時註冊屬性編輯器,那麼您的程序將扮演IDE的角色。您需要爲這些回調函數提供實現,以便使用您自己的屬性編輯框架來註冊屬性編輯器類。你可能只是把所有東西放在一個簡單的列表中。然後,當您想知道某種類型的財產需要顯示哪種編輯器時,請查閱列表以查找最佳匹配。

你是對的,你應該打電話給你的單位註冊程序。但這就是你如何發起的註冊過程,而不是你如何實現它。這部分取決於你;德爾福沒有爲你提供任何這方面的信息。

+0

+1謝謝,羅布。 – Mawg 2010-08-25 10:07:57

+0

我當時讀過[this](http://www.drbob42.com/delphi/property.htm),其中提到了必須實施的功能。經過反思,我認爲它可能更簡單,只有兩個有兩列的面板,左邊是屬性名稱,右邊是值,點擊即可更改。我正在谷歌搜索教程。你知道嗎? – Mawg 2017-03-29 17:37:52

+1

使用'TValueListEditor'。德爾福自2005年以來,或者更早的時候就達到標準。 – 2017-03-29 19:04:47

相關問題