我在delphi2009中创建了一个Custom组件SkinMgr和SkinPanel.我希望这两个组件自动链接在一起,即使SkinMgr在DataModule中或在其他形式的任何地方. 任何帮助,样品或建议. 先感谢您. 这是使用TActionL
任何帮助,样品或建议.
先感谢您.
这是使用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.