2010-11-16 4 views
6

He escrito un asistente en Delphi XE, y está funcionando bien. Sin embargo, aún no he descubierto cómo acceder al nombre de la unidad predeterminada generada (o nombre del formulario o nombre del proyecto) que la OTA de Delphi puede crear.Cómo recuperas un nuevo nombre de unidad de las herramientas abiertas de Delphi API

En mi asistente de estilo antiguo, pude llamar a ToolServices.GetNewModuleName para descubrir una unidad disponible y un nombre de formulario que podría usar al generar los archivos fuente asociados. ¿Cuál es el equivalente en la API de herramientas abiertas de hoy?

De acuerdo con los comentarios de la unidad ToolsAPI, debo devolver un espacio en blanco del método IOTAModuleCreator.GetImplFileName para que Delphi genere el nombre del archivo. Estoy devolviendo una cadena vacía de este método, pero todavía no puedo ver dónde puedo acceder al nombre de archivo que Delphi está generando.

+0

Todavía no entiendo por qué, en algunas circunstancias, Delphi no genera el nombre de unidad predeterminado, pero estoy convencido de que tiene algo que ver con cuál de las interfaces implementa. Si bien la solución de Marco le permite pedirle directamente a Delphi un nombre, las otras dos respuestas que aparecen en este momento también son correctas porque ese ModuleIdent (y parámetros similares) por lo general contienen esta información. Las tres respuestas deben considerarse correctas. Publicaré un seguimiento cuando sepa más. –

Respuesta

4

Hay un método específico para obtener una nueva forma y la unidad nombre:

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

He usado en algunos ejemplos y parece funcionar bien.

+0

¡Gracias, Marco! Esta técnica ciertamente funciona. También estoy convencido de que el uso adecuado de IOTACreators también hará esto, y estoy modificando mi asistente para crear un proyecto, y no solo un módulo de unidad para ver si eso hace una diferencia cuando Delphi genera automáticamente el nombre predeterminado. Dependiendo de lo que encuentre, al final puedo marcar las tres respuestas como correctas. –

2

El método IOTAModuleCreator.NewImplSource tiene un parámetro "ModuleIdent", es el nombre de la unidad.

+0

Ese es el método que implementé para devolver una implementación de IOTAFile que devuelve el origen de la unidad. El valor del parámetro ModuleIdent pasado a NewImplSource, sin embargo, está en blanco. Mi suposición era que si devolvía un espacio en blanco de GetImplFileName, Delphi generaría el nombre de la unidad y lo pasaría a NewImplSource. En cambio, ModuleIdent está en blanco. –

2

En mis pruebas, funciona como esperaba (el parámetro ModuleIdent en el método NewImplSource recibe el nuevo nombre de unidad). Compruebe su aplicación una vez más, sobre todo asegurarse de que:

  • IOTACreator.GetUnnamed devuelve True
  • IOTACreator.GetExisting devuelve False
  • IOTACreator.GetCreatorType devuelve el identificador apropiado (sUnit, sForm, etc.) - No estoy seguro de esto, pero podría ser importante, también

Here es un ejemplo de trabajo. Acabo de comprobarlo y el código aún parece funcionar como se esperaba en Delphi XE.

+0

Gracias por su contribución. Estoy devolviendo True de GetUnnamed, False de GetExisting y ToolsAPI.sUnit de GetCreator (ya que estoy creando una unidad). Aquí está mi IOTACreator decl. ¿Implementaron otras interfaces? TCompEditorAppModuleCreator = class (TInterfacedObject, IOTACreator, IOTAModuleCreator). Además, ¿también tenía una implementación IOTAProjectCreator (e IOTAProjectCreate50) en una de sus implementaciones? Mi asistente no lo hizo, ya que estaba creando solo una unidad y no un proyecto. Me pregunto si eso hace la diferencia. –

+0

Quizás es importante implementar IOTAModuleCreator.GetOwner? Mi implementación devuelve el proyecto actualmente activo. En las versiones recientes de Delphi, puede usar IOTAModuleServices.GetActiveProject para obtenerlo. –

+0

Voy a agregar un IOTAProjectCreator a mi asistente para crear un proyecto completo, no solo un módulo, y veré si eso hace una diferencia en la generación de nombre predeterminada de Delphi. Publicará los resultados más tarde. –

Cuestiones relacionadas