感謝Ray Konopka在CodeRage上做了一次精彩的演講,並讓我在正確的軌道上回答了這些問題。
問題1.我可以在組件中嵌入默認樣式嗎?
是的,您將要與組件一起分發的默認樣式嵌入RT_RCDATA類型的資源中。然後簡單地包含資源到源:
{$R *.res}
注意:您需要,如果你在佈局編輯器把它放入res之前創建它來去除外界物體(TLayout)。
然後覆蓋GetStyleObject方法從資源加載樣式。
function TLFButton.GetStyleObject: TControl;
var
S: TResourceStream;
obj: TLayout;
const
Style = 'LFButtonStyle';
begin
result := inherited GetStyleObject;
if FStyleLookup = 'cornerbuttonstyle' then
begin
if FindResource(HInstance, PChar(Style), RT_RCDATA) <> 0 then
begin
S := TResourceStream.Create(HInstance, Style, RT_RCDATA);
try
obj := TLayout(TStyleManager.LoadFromResource(HInstance, Style, RT_RCDATA));
//obj := TLayout(CreateObjectFromStream(nil, S)); << XE2 version
Result.AddObject(obj);
Exit;
finally
S.Free;
end;
end;
end;
end;
問題2:如何將它與默認樣式合併。
在我的情況下,我的組件的基礎是TCornerButton。我修剪了我的.style文件,以便它只是我想要的額外位的代碼。在這種情況下,一個小三角形來表示一個下拉按鈕和線分割按鈕:
object TLayout
Align = alRight
Position.Point = '(76,0)'
Locked = True
Width = 15.000000000000000000
Height = 24.000000000000000000
object TPath
StyleName = 'dropdownbutton'
Align = alCenter
Position.Point = '(4,9)'
Width = 8.000000000000000000
Height = 5.000000000000000000
HitTest = False
Fill.Color = claBlack
Stroke.Kind = bkNone
Data.Path = {
04000000000000000000000000000000010000000000803F0000000001000000
0000003F0000803F030000000000000000000000}
end
object TLine
StyleName = 'dropdownsplit'
Align = alLeft
Width = 1.000000000000000000
Height = 24.000000000000000000
HitTest = False
LineType = ltLeft
end
end
我將它放入一個資源以完全相同的方式。
在我的構造函數中我設置StyleLookup是「cornerbuttonstyle」
constructor TLFButton.Create(AOwner: TComponent);
begin
FStyleLookup := 'cornerbuttonstyle';
FDropDownButton := false;
inherited;
end;
然後我改變GetStyleObject,使其加載新的東西,把它添加到現有的樣式。
function TLFButton.GetStyleObject: TControl;
var
S: TResourceStream;
obj: TLayout;
const
Style = 'LFButtonStyle';
begin
result := inherited GetStyleObject;
if FStyleLookup = 'cornerbuttonstyle' then
begin
if FindRCData(HInstance, Style) then
begin
S := TResourceStream.Create(HInstance, Style, RT_RCDATA);
try
obj := TLayout(CreateObjectFromStream(nil, S));
Result.AddObject(obj);
Exit;
finally
S.Free;
end;
end;
end;
end;
我希望這可以幫助別人,我發現這一切都很難得到的信息。
Martin
我已經編輯了上述內容,以便在XE3中工作 – Martin
非常有幫助。謝謝! – Nix