Я пишу компонент, который должен хранить некоторую информацию относительно каталога проекта. Каждый раз, когда свойство моего компонента изменяется, это должно записать файл. Таким образом, как компонент может определить текущий каталог проекта во время проектирования.
Заранее спасибо
Править:
Я хочу генерировать исходный файл Дельфи каждый раз, когда свойство моего компонента изменяется, так, чтобы я всегда получил последнюю версию, когда я компилирую свой код. Думайте о нем как своего рода генератор кода.
В данный момент я установил целый путь и имя файла, где источник должен быть сохранен, но я предпочитаю относительный путь проекту (или form/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.
Вот блок для регистрации компонента и вызова 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.
см.
http://www.gexperts.org/otafaq.html#project
, а затем
www.href.com /pub/sw/ProjectOptions.html
может помочь
Я не думаю, что это возможно. Вы можете достаточно легко определить каталог, в котором работает ваш EXE, но ваш компонент во время разработки работает как часть IDE. Я сомневаюсь, что у компонента есть способ получить доступ к информации о проекте через IDE.
Компонент не может получить доступ к вашему пути к исходникам, потому что компонент помещается в ваше приложение и запускается как часть вашего приложения из Delphi IDE.
Если вы хотите иметь доступ к пути проекта, или автоматизировать какой-либо процесс внутри IDE, вам нужно написать эксперта IDE, используя OpenTools API, а не компонент.