2010-11-16 65 views
6

J'ai écrit un assistant dans Delphi XE, et cela fonctionne très bien. Cependant, je n'ai pas encore compris comment accéder au nom d'unité par défaut généré (ou au nom du formulaire ou au nom du projet) que l'OTA de Delphi peut créer.Comment récupérer un nouveau nom d'unité à partir des outils ouverts de Delphi API

Dans mon ancien assistant, j'ai pu appeler ToolServices.GetNewModuleName pour découvrir une unité disponible et un nom de formulaire que je pouvais utiliser lors de la génération des fichiers source associés. Quel est l'équivalent dans l'API open tools d'aujourd'hui? Selon les commentaires de l'unité ToolsAPI, je devrais retourner un blanc de la méthode IOTAModuleCreator.GetImplFileName pour que Delphi génère le nom du fichier. Je renvoie une chaîne vide de cette méthode, mais ne peux toujours pas voir où je peux accéder au nom de fichier généré par Delphi.

+0

Je n'ai toujours pas compris pourquoi dans certaines circonstances Delphi ne génère pas le nom d'unité par défaut, mais je suis convaincu qu'il a quelque chose à voir avec laquelle des interfaces que vous implémentez. Tandis que la solution de Marco vous permet de demander directement un nom à Delphi, les deux autres réponses qui apparaissent à ce moment sont également correctes en ce que ModuleIdent (et les paramètres similaires) contiennent généralement cette information. Les trois réponses doivent être considérées comme correctes. Je posterai un suivi quand j'apprendrai plus. –

Répondre

4

Il y a une méthode spécifique pour obtenir une nouvelle forme et le nom de l'unité:

(BorlandIDEServices que IOTAModuleServices) .GetNewModuleAndClassName ( '', UnitIdent, FormName, filename);

Je l'ai utilisé dans quelques exemples et cela semble fonctionner correctement.

+0

Merci, Marco! Cette technique fonctionne certainement. Je suis également convaincu que la bonne utilisation des IOTACreators le fera également, et je modifie mon assistant pour créer un projet, et pas seulement un module d'unité pour voir si cela fait une différence lorsque le nom par défaut est automatiquement généré par Delphi. En fonction de ce que je trouve, je peux finalement marquer ces trois réponses comme correctes. –

2

La méthode IOTAModuleCreator.NewImplSource possède un paramètre "ModuleIdent", il s'agit du nom de l'unité.

+0

C'est la méthode que j'ai implémentée pour retourner une implémentation IOTAFile qui renvoie la source de l'unité. La valeur du paramètre ModuleIdent transmis à NewImplSource est cependant vide. Ma supposition était que si je retournais un blanc à partir du GetImplFileName, Delphi générerait le nom de l'unité et le passerait à NewImplSource. Au lieu de cela, ModuleIdent est vide. –

2

Dans mes tests, cela fonctionne comme prévu (le paramètre ModuleIdent dans la méthode NewImplSource reçoit le nouveau nom d'unité). Vérifiez votre mise en œuvre à nouveau, surtout assurez-vous que:

  • IOTACreator.GetUnnamed renvoie True
  • IOTACreator.GetExisting Faux retourne
  • IOTACreator.GetCreatorType renvoie l'identificateur approprié (sUnit, sForm, etc.) - Je ne suis pas sûr de cela, mais il pourrait être important, aussi

Here est un exemple de travail. Je viens de le vérifier et le code semble toujours fonctionner comme prévu dans Delphi XE.

+0

Merci pour votre contribution. Je renvoie True à partir de GetUnnamed, False à partir de GetExisting et ToolsAPI.sUnit à partir de GetCreator (puisque je crée une unité). Voici mon déclic IOTACreator. Avez-vous implémenté d'autres interfaces? TCompEditorAppModuleCreator = class (TInterfacedObject, IOTACreator, IOTAModuleCreator). En outre, avez-vous également eu une implémentation IOTAProjectCreator (et IOTAProjectCreate50) dans l'une de vos implémentations? Mon sorcier ne l'a pas fait, puisque je ne faisais que créer une unité, et pas un projet. Je me demande si cela fait une différence. –

+0

Peut-être est-il important d'implémenter IOTAModuleCreator.GetOwner? Ma mise en œuvre renvoie le projet actuellement actif. Dans les versions récentes de Delphi, vous pouvez utiliser IOTAModuleServices.GetActiveProject pour l'obtenir. –

+0

Je vais ajouter un IOTAProjectCreator à mon assistant afin de créer un projet entier, pas seulement un module, et je verrai si cela fait une différence dans la génération de noms par défaut de Delphi. Publiera les résultats plus tard. –