我编写了一个组件,它应该存储一些与项目目录相关的信息.每次更改组件的属性时,都应该写一个文件.那么组件如何在设计时确定当前项目目录.
提前致谢
编辑:
我想在每次更改组件的属性时生成delphi源文件,以便在编译代码时始终获得最新版本.可以把它想象成一种代码生成器.
目前我设置了存储源的整个路径和文件名,但我更喜欢项目的相对路径(或包含我的组件的表单/ datamodule),以便更容易在不同的开发人员机器上复制项目.
解决方法
谢谢你的提示. Open Tools API是一种可行的方式,可以在设计时使用表单上的组件中的Open Tools API.
所以这是我的解决方案:
我需要两个单元,一个用于组件,一个用于注册组件和使用Open Tools API的代码.
这是组件单元:
unit TestLabels; interface uses SysUtils,Classes,Windows,Controls,StdCtrls; type TTestLabel = class(TLabel) private FTestProperty: Boolean; procedure SetTestProperty(const Value: Boolean); procedure Changed; published property TestProperty: Boolean read FTestProperty write SetTestProperty; end; var OnGetUnitPath: TFunc; implementation { TTestLabel } procedure TTestLabel.Changed; begin if not (csDesigning in ComponentState) then Exit; // I only need the path at designtime if csLoading in ComponentState then Exit; // at this moment you retrieve the unit path which was current before if not Assigned(OnGetUnitPath) then Exit; // only for demonstration Caption := OnGetUnitPath; MessageBox(0,PChar(ExtractFilePath(OnGetUnitPath)),'Path of current unit',0); end; procedure TTestLabel.SetTestProperty(const Value: Boolean); begin if FTestProperty Value then begin FTestProperty := Value; Changed; end; end; end.
unit TestLabelsReg; interface uses SysUtils,StdCtrls,TestLabels; procedure register; implementation uses ToolsAPI; function GetCurrentUnitPath: String; var ModuleServices: IOTAModuleServices; Module: IOTAModule; SourceEditor: IOTASourceEditor; idx: integer; begin Result := ''; SourceEditor := nil; if SysUtils.Supports(BorlandIDEServices,IOTAModuleServices,ModuleServices) then begin Module := ModuleServices.CurrentModule; if System.Assigned(Module) then begin idx := Module.GetModuleFileCount - 1; // Iterate over modules till we find a source editor or list exhausted while (idx >= 0) and not SysUtils.Supports(Module.GetModuleFileEditor(idx),IOTASourceEditor,SourceEditor) do System.Dec(idx); // Success if list wasn't ehausted. if idx >= 0 then Result := ExtractFilePath(SourceEditor.FileName); end; end; end; procedure register; begin RegisterComponents('Samples',[TTestLabel]); TestLabels.OnGetUnitPath := GetCurrentUnitPath; end; end.