6
votes

Comment un composant de la conception peut-il déterminer le répertoire de projet

J'écris un composant qui devrait stocker des informations relatives au répertoire de projet. Chaque fois qu'une propriété de mon composant est modifiée, il devrait écrire un fichier. Alors, comment un composant peut-il déterminer le répertoire de projet actuel au moment de la conception?

Merci d'avance

EDIT:
Je souhaite générer un fichier source Delphi chaque fois qu'une propriété de mon composant est modifiée, de sorte que je reçois toujours la dernière version lorsque je compile mon code. Pensez-y comme une sorte de générateur de code.

Pour le moment, j'ai défini entier chemin et nom de fichier où la source doit être stockée, mais je préfère un chemin relatif du projet (ou le formulaire / DataModule contenant mon composant) pour faciliter la copie du projet sur différentes machines de développeurs .


0 commentaires

5 Réponses :


1
votes

Je ne pense pas que cela puisse. Vous pouvez déterminer le répertoire que votre EXE fonctionne facilement suffisamment, mais votre composant au moment de la conception est en cours d'exécution dans le cadre de l'IDE. Je doute qu'il y ait un moyen pour le composant d'accéder à des informations sur le projet par l'intermédiaire de l'IDE.


4 commentaires

Ce n'est pas ce que je veux entendre. :-) J'espérais que je puisse accéder à l'API de design de l'IDE de ma composante.


Jetez un coup d'œil à Otapi, qui peut accéder à l'API de design de l'IDE, mais je ne pense pas que vous puissiez mélanger la fonctionnalité OTAPI dans des composants sur une forme.


@Heinz: pas de votre composant, comme le dit Mason. Vous pouvez à partir d'un expert de l'IDE à l'aide de l'API Open Tools (OTAPI).


Mélanger OTAPI avec des composants est possible (voir ma solution)



2
votes

Un composant ne peut pas accéder à votre chemin source, car un composant est placé dans votre application et exécutez-la dans la partie de votre application hors de Delphi IDE.

Si vous souhaitez avoir accès au chemin du projet ou automatiser tout processus à l'intérieur de l'IDE; Vous devez écrire un expert IDE à l'aide de l'API OpenTools, pas un composant.


0 commentaires

1
votes

voir

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

puis

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

Peut-être que cela aide


1 commentaires

Le lien vers Gexperts Otafaq était très serviable.



6
votes

Merci pour les indices. Open Tools API est la voie à suivre et à utiliser l'API d'outils Ouvrir à partir d'un composant sur un formulaire au design du temps de conception est possible.

Voici ma solution: p>

J'ai besoin de deux unités, une pour le composant et une pour enregistrer le composant et le code qui utilisent l'API d'outils ouverts. p>

voici l'unité de composant: p> xxx pré>

Voici l'unité de l'enregistrement Le composant et l'appel à l'API Outils Open Tools: P>

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 commentaires

Je suis à peu près sûr que votre getcurrentUnitpath ne compile pas (au moins l'expression booléenne pour la boucle tandis que la boucle et la boucle tandis que la boucle ne finira jamais. Mais l'idée est intéressante cependant, alors j'ai évoqué votre réponse.


@Jeen: Merci d'avoir souligné cela. L'éditeur Stackoverflow.com a recadré la ligne "Bien que non (((IDX <0) ou SYSUTILS.SUPPORTS (module.getModulefileeditor (IDX), itasourdeditor, Sourceditor)". J'ai ajusté la condition de la boucle tandis que Stackoverflow.com le montre correct. Au fait, le courant actuel est extrait (avec des modifications) du Dunit Wizzard qui est livré avec Delphi.



5
votes

Démarrage avec Delphi 7, l'unité OutilsAPI définit une fonction GetActiveProject qui renvoie l'interface d'iotaproject du projet en cours.

La propriété FileName de IoProject renvoie le chemin de source principal du projet (typiquement le fichier .dPR fichier).

Donc, dans de nombreux cas, il est possible d'utiliser une instruction simple telle que: xxx

(et il n'y a pas besoin d'utiliser deux unités Comme dans l'exemple de Heinz ci-dessus)


0 commentaires