2013-11-27 27 views
1

我在FireMonkey(Delphi XE5)中編寫了一個自定義組件(TGMailLabel),一切似乎都沒問題,但是當我在FireMonkey(桌面)窗體上有組件實例並嘗試「編輯自定義樣式」時,IDE放置正確我的表單上有一個TStyleBook實例,並打開樣式設計器,但沒有任何項目。爲什麼自定義FireMonkey組件的「編輯自定義樣式」在TStyleBook中導致空樣式?

如果你做同樣的事情,但試圖「編輯默認樣式」,它的工作原理...

您可以在http://blog.delphiedintorni.it/2013/11/tgmaillabel-un-esempio-di-custom.html 找到我的博客文章完整的源代碼(有完整的源代碼的鏈接文章結尾處的zip)

function TGMailLabel.GetStyleObject(const Clone: Boolean): TFmxObject;` 
begin 
    if (StyleLookup = '') then 
    Result := TFmxObject(TStyleManager.LoadFromResource(HInstance, GMailLabelStyleName, RT_RCDATA)) 
    else 
    Result := inherited GetStyleObject(Clone); 
end; 

此方法實現是否完全正確?

+0

你的代碼的相關部分應該在這裏發佈,而不是鏈接到外部網站。如果由於某種原因鏈接不可用,這個問題就失去了很多意義。此外,此處不能搜索異地內容。請參閱[幫助]指南,特別是[主題](http://stackoverflow.com/help/on-topic),編號列表項目#2。 –

+0

對不起,我很難指出哪一部分是相關的,我認爲這足以在我的第一個陳述中總結出問題,並且在我的博客上有完整源代碼的鏈接。 我要編輯帖子添加方法實現我更懷疑... – AndreaMagni

回答

0

用於加載樣式的方法(即覆蓋GetStyleObject)由組件供應商使用,因爲它使安裝和使用其組件對於最終用戶來說更容易。事實上,在完成開發之後,部署自己的組件可能是一種有用的方式,因爲它解決了FireMonkey管理風格方面的一些不足。但是,它也繞過了造型系統的一些默認行爲,這在開發和編輯樣式時非常有用。

通常,FireMonkey根據組件類名稱或StyleLookup屬性搜索活動樣式和任何樣式書籍以找到合適的樣式。您正在使用的代碼直接從資源加載它的樣式,並忽略活動樣式和樣式簿中的任何內容,但如果設置了StyleLookup,它將保留默認行爲。

爲了編輯樣式,您需要將它加載到樣式簿組件中。首先你需要包裝在TLayout風格,

object TLayout 
    ...Your style here 
end 

(不用擔心壓痕)。

您現在可以雙擊樣式書並打開文件。

通過獲取組件的類名稱,刪除T並追加'樣式',設置樣式的StyleName(它的「根」對象)。例如。 TMyEdit將成爲'myeditstyle'。

註釋掉你的GetStyleObject例程,你的組件應該拿起這個樣式。

現在你來談談部署的問題。

  • 您可以恢復到GetStyleObject方法。
  • 您可以將樣式加載到您想要使用的每種表單上的樣式簿中。
  • 您可以創建一個全局樣式書並將每個表單的StyleBook屬性指向它(在釋放每個表單之前,請確保您沒有屬性)。
  • 您可以編輯您用來包含它的默認樣式(不可用系統樣式)。
  • 或者,我還沒有嘗試通過將樣式元素的Parent設置爲由TStyleManager.ActiveStyle返回的對象將您的樣式元素注入到活動樣式中。
+0

你好邁克,感謝您的回覆,但我認爲有一個誤解......我想嵌入資源的風格作爲組件是自定義的,我不想把樣式放在每個表單的樣式表中(也不要讓每個程序員使用我的組件來做同樣的事情)......我的問題是:爲什麼IDE似乎無法找到在設計時按下「編輯自定義樣式」時組件的樣式?風格是可用的,因爲如果你嘗試「編輯默認風格」,一切似乎都OK ......任何想法? – AndreaMagni

+0

IDE只能在系統樣式或樣式簿中找到該樣式。沒有什麼可以阻止你使用資源進行部署,但是在開發時你需要在樣式手冊中使用該編輯器。 –

+0

對不起邁克,但你試過了嗎? IDE在開發時可以找到我的風格,並且在單擊「編輯默認樣式」時可以很好地播放......它必須是別的...... – AndreaMagni