Как получить новое имя модуля из API открытых инструментов Delphi

Я написал мастер в Delphi XE, и он отлично работает. Однако я еще не понял, как получить доступ к сгенерированному имени модуля по умолчанию (или имени формы или имени проекта), которое может создать OTA Delphi.

В моем мастере старого стиля я смог вызвать ToolServices.GetNewModuleName, чтобы обнаружить доступный модуль и имя формы, которые я мог использовать при создании связанных исходных файлов. Что эквивалентно сегодняшним API открытых инструментов?

Согласно комментариям модуля ToolsAPI, я должен вернуть пустое значение из метода IOTAModuleCreator.GetImplFileName, чтобы Delphi сгенерировал имя файла. Я возвращаю пустую строку из этого метода, но все еще не вижу, где я могу получить доступ к имени файла, который генерирует Delphi.


person Cary Jensen    schedule 16.11.2010    source источник
comment
Я до сих пор не понял, почему в некоторых случаях Delphi не генерирует имя модуля по умолчанию, но я убежден, что это как-то связано с тем, какой из интерфейсов вы реализуете. Хотя решение Marco позволяет вам напрямую запрашивать имя у Delphi, два других ответа, которые появляются в это время, также верны в том, что ModuleIdent (и аналогичные параметры) обычно содержат эту информацию. Все три ответа следует считать правильными. Я опубликую продолжение, когда узнаю больше.   -  person Cary Jensen    schedule 21.11.2010


Ответы (3)


Существует специальный метод для получения новой формы и имени юнита:

(BorlandIDEServices as IOTAModuleServices).GetNewModuleAndClassName( '', UnitIdent, FormName, FileName);

Я использовал в нескольких примерах, и, похоже, он работает нормально.

person Marco Cantù    schedule 18.11.2010
comment
Спасибо, Марко! Эта техника, безусловно, работает. Я также убежден, что правильное использование IOTACreators также сделает это, и я модифицирую свой мастер для создания проекта, а не только модульного модуля, чтобы увидеть, влияет ли это на то, когда имя по умолчанию автоматически генерируется Delphi. В зависимости от того, что я найду, я в конечном итоге могу отметить все три ответа как правильные. - person Cary Jensen; 18.11.2010

Метод IOTAModuleCreator.NewImplSource имеет параметр "ModuleIdent", это имя модуля.

person Henri Gourvest    schedule 16.11.2010
comment
Это метод, который я применил для возврата реализации IOTAFile, которая возвращает исходный код устройства. Однако значение параметра ModuleIdent, переданного в NewImplSource, пустое. Я предполагал, что если я верну пустое значение из GetImplFileName, Delphi сгенерирует имя модуля и передаст его в NewImplSource. Вместо этого ModuleIdent пуст. - person Cary Jensen; 16.11.2010

В моих тестах он работает так, как вы ожидали (параметр ModuleIdent в методе NewImplSource получает новое имя юнита). Проверьте свою реализацию еще раз, особенно убедитесь, что:

  • IOTACreator.GetUnnamed возвращает Истина
  • IOTACreator.GetExisting возвращает ложь
  • IOTACreator.GetCreatorType возвращает соответствующий идентификатор (sUnit, sForm и т. д.) - я не уверен в этом, но это тоже может быть важно

Вот рабочий пример. Я только что проверил это, и код все еще работает, как и ожидалось, в Delphi XE.

person Ondrej Kelle    schedule 17.11.2010
comment
Спасибо за ваш вклад. Я возвращаю True из GetUnnamed, False из GetExisting и ToolsAPI.sUnit из GetCreator (поскольку я создаю модуль). Вот мой деклар IOTACreator. Реализовали ли вы какие-либо другие интерфейсы? TCompEditorAppModuleCreator = class(TInterfacedObject, IOTACreator, IOTAModuleCreator). Кроме того, была ли у вас также реализация IOTAProjectCreator (и IOTAProjectCreate50) в одной из ваших реализаций? Мой мастер не делал, так как я создавал только юнит, а не проект. Интересно, есть ли разница? - person Cary Jensen; 18.11.2010
comment
Возможно, важно реализовать IOTAModuleCreator.GetOwner? Моя реализация возвращает текущий активный проект. В последних версиях Delphi для его получения можно использовать IOTAModuleServices.GetActiveProject. - person Ondrej Kelle; 18.11.2010
comment
Я собираюсь добавить IOTAProjectCreator в свой мастер, чтобы создать целый проект, а не только модуль, и я посмотрю, повлияет ли это на генерацию имени по умолчанию в Delphi. Результаты опубликую позже. - person Cary Jensen; 18.11.2010