感谢 Ray Konopka,他在 CodeRage 上发表了精彩的演讲,让我走上了正确的轨道来回答这些问题。
问题 1. 我可以在组件中嵌入默认样式吗?
是的,您将要与组件一起分发的默认样式嵌入到 RT_RCDATA 类型的资源中。然后只需将该资源包含到源中:
{$R *.res}
注意:如果您在布局编辑器中创建了外部对象 (TLayout),则需要先将其删除,然后再将其放入 res。
然后重写 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;
我希望这对其他人有所帮助,我发现这一切都很难获得信息。
马丁