CodeRage について素晴らしい講演をしてくれた Ray Konopka に感謝し、これらの質問に答える正しい道を示してくれました。
質問 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;
これが他の誰かの役に立てば幸いです。情報を入手するのは非常に難しいと思いました。
マーティン