Как может компонент во время проектирования определять каталог проекта

Я пишу компонент, который должен хранить некоторую информацию относительно каталога проекта. Каждый раз, когда свойство моего компонента изменяется, это должно записать файл. Таким образом, как компонент может определить текущий каталог проекта во время проектирования.

Заранее спасибо

Править:
Я хочу генерировать исходный файл Дельфи каждый раз, когда свойство моего компонента изменяется, так, чтобы я всегда получил последнюю версию, когда я компилирую свой код. Думайте о нем как своего рода генератор кода.

В данный момент я установил целый путь и имя файла, где источник должен быть сохранен, но я предпочитаю относительный путь проекту (или form/datamodule, который содержит мой компонент) помочь скопировать проект на различных машинах разработчика.

6
задан ErikE 12 August 2010 в 23:56
поделиться

4 ответа

Спасибо за подсказки. 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.

Вот блок для регистрации компонента и вызова 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.
5
ответ дан 8 December 2019 в 17:20
поделиться

см.

http://www.gexperts.org/otafaq.html#project

, а затем

www.href.com /pub/sw/ProjectOptions.html

может помочь

1
ответ дан 8 December 2019 в 17:20
поделиться

Я не думаю, что это возможно. Вы можете достаточно легко определить каталог, в котором работает ваш EXE, но ваш компонент во время разработки работает как часть IDE. Я сомневаюсь, что у компонента есть способ получить доступ к информации о проекте через IDE.

1
ответ дан 8 December 2019 в 17:20
поделиться

Компонент не может получить доступ к вашему пути к исходникам, потому что компонент помещается в ваше приложение и запускается как часть вашего приложения из Delphi IDE.

Если вы хотите иметь доступ к пути проекта, или автоматизировать какой-либо процесс внутри IDE, вам нужно написать эксперта IDE, используя OpenTools API, а не компонент.

2
ответ дан 8 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: