delphi2009でカスタムコンポーネントSkinMgrとSkinPanelを作成しました。SkinMgrがDataModuleまたは他の形式のどこかにある場合でも、2つのコンポーネントが自動的にリンクするようにしたかったのです。
ヘルプ、サンプル、提案。
前もって感謝します。
delphi2009でカスタムコンポーネントSkinMgrとSkinPanelを作成しました。SkinMgrがDataModuleまたは他の形式のどこかにある場合でも、2つのコンポーネントが自動的にリンクするようにしたかったのです。
ヘルプ、サンプル、提案。
前もって感謝します。
TActionList
子孫を使用した簡単なテストを次に示します。コンポーネントTCustomActionManager
のインスタンスがTActionListEx
設計時にフォームにドロップされると、現在のすべてのプロジェクトのモジュールが列挙され、インスタンスが。のフォーム/データモジュールが検索されますTCustomActionManager
。見つかった場合は、新しく作成されたものをコレクションに追加しTActionListEx
ますLinkedActionLists
。
ランタイムパッケージ:
unit TestComponents;
interface
uses
System.Classes, Vcl.ActnList;
type
TActionListEx = class(TActionList)
public
constructor Create(AOwner: TComponent); override;
end;
TNotifyProc = procedure(Sender: TObject);
var
CreateNotify: TNotifyProc = nil;
implementation
{ TActionListEx }
constructor TActionListEx.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if (csDesigning in ComponentState) and Assigned(CreateNotify) then
CreateNotify(Self);
end;
end.
デザインタイムパッケージ:
unit TestComponentsDesign;
interface
procedure Register;
implementation
uses
System.Classes, System.SysUtils,
Vcl.ActnMan,
ToolsAPI,
TestComponents;
procedure CreateNotifyProc(Sender: TObject);
var
ActionList: TActionListEx absolute Sender;
ModuleServices: IOTAModuleServices;
ActiveProject: IOTAProject;
I, J: Integer;
ModuleInfo: IOTAModuleInfo;
Module: IOTAModule;
Editor: IOTAFormEditor;
RootComponent: IOTAComponent;
Component: INTAComponent;
ActionManager: TCustomActionManager;
ActionListItem: TActionListItem;
begin
if not (Sender is TActionListEx) or not (csDesigning in ActionList.ComponentState) then
Exit;
if not Supports(BorlandIDEServices, IOTAModuleServices, ModuleServices) then
Exit;
ActiveProject := ModuleServices.GetActiveProject;
if not Assigned(ActiveProject) then
Exit;
for I := 0 to ActiveProject.GetModuleCount - 1 do
begin
Module := nil;
Editor := nil;
RootComponent := nil;
ModuleInfo := ActiveProject.GetModule(I);
if Assigned(ModuleInfo) and (ModuleInfo.FormName <> '') then
Module := ModuleInfo.OpenModule;
if Assigned(Module) then
for J := 0 to Module.ModuleFileCount - 1 do
if Supports(Module.ModuleFileEditors[J], IOTAFormEditor, Editor) then
Break;
if Assigned(Editor) then
RootComponent := Editor.GetRootComponent;
if Assigned(RootComponent) then
for J := 0 to RootComponent.GetComponentCount - 1 do
if Supports(RootComponent.GetComponent(J), INTAComponent, Component) and (Component.GetComponent is TCustomActionManager) then
begin
ActionManager := TCustomActionManager(Component.GetComponent);
ActionListItem := ActionManager.LinkedActionLists.Add as TActionListItem;
try
ActionListItem.ActionList := ActionList;
Editor.MarkModified;
Exit;
except
ActionListItem.Free;
raise;
end;
end;
end;
end;
procedure Register;
begin
RegisterComponents('Test', [TActionListEx]);
CreateNotify := CreateNotifyProc;
end;
initialization
finalization
CreateNotify := nil;
end.