gpt4 book ai didi

delphi - 组件如何在设计时确定项目目录

转载 作者:行者123 更新时间:2023-12-03 14:56:49 34 4
gpt4 key购买 nike

我编写了一个组件,它应该存储一些与项目目录相关的信息。每次更改组件的属性时,它都应该写入一个文件。那么组件如何在设计时确定当前项目目录。

提前致谢

编辑:
我想在每次更改组件的属性时生成一个 delphi 源文件,以便在编译代码时始终获得最新版本。将其视为一种代码生成器。

目前,我设置了应存储源的完整路径和文件名,但我更喜欢项目的相对路径(或包含我的组件的表单/数据模块),以便更轻松地在不同的开发人员计算机上复制项目.

最佳答案

感谢您的提示。开放工具 API 是可行的方法,并且可以在设计时从表单上的组件使用开放工具 API。

这是我的解决方案:

我需要两个单元,一个用于组件,另一个用于注册组件和使用开放工具 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.

这里是注册组件和调用 Open Tools API 的单元:


unit TestLabelsReg;

interface

uses
SysUtils, Classes, Controls, 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.

关于delphi - 组件如何在设计时确定项目目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2433580/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com