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? P>
Merci d'avance p>
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. p>
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 . P>
5 Réponses :
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. P>
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)
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. P>
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. P>
voir p>
http://www.gexperts.org/otafaq.html#project p>
puis p>
www.href.com/pub/sw/projectoption.html p>
Peut-être que cela aide p>
Le lien vers Gexperts Otafaq était très serviable.
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> 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.
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.
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). p>
Donc, dans de nombreux cas, il est possible d'utiliser une instruction simple telle que: p> (et il n'y a pas besoin d'utiliser deux unités Comme dans l'exemple de Heinz ci-dessus) p> p>