Как компонент во время разработки может определить каталог проекта - PullRequest
6 голосов
/ 12 марта 2010

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 08 сентября 2011

Начиная с delphi 7, модуль ToolsAPI определяет функцию getActiveProject, которая возвращает интерфейс IOTAProject текущего проекта.

Свойство fileName IOTAProject возвращает полный путь к главному исходному файлу проекта (обычно это файл .dpr).

Итак, во многих случаях можно использовать простую инструкцию, такую ​​как:

if csDesigning in componentState then
    appFolderPath := extractFilePath( getActiveProject.fileName ) 
else
    appFolderPath := extractFilePath( application.exeName );

(и нет необходимости использовать две единицы, как в примере Хайнца выше)

5 голосов
/ 13 марта 2010

Спасибо за подсказки. Open Tools API - это то, что нужно, и использование Open Tools API из компонента в форме во время разработки возможно.

Так вот мое решение:

Мне нужны две единицы: одна для компонента и одна для регистрации компонента и код, использующий API Open Tools.

А вот и компонентный блок:


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.

Вот блок для регистрации компонента и вызова API Open Tools:


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.
2 голосов
/ 12 марта 2010

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

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

1 голос
/ 12 марта 2010

см

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

, а затем

www.href.com / паб / SW / ProjectOptions.html

может быть, это помогает

1 голос
/ 12 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...