2010-11-16 13 views
6

Ho scritto una procedura guidata in Delphi XE e funziona correttamente. Tuttavia, non ho ancora capito come accedere al nome dell'unità predefinito generato (o nome del modulo o nome del progetto) che l'OTA di Delphi può creare.Come si recupera un nuovo nome di unità dall'API degli strumenti aperti di Delphi

Nel mio wizard vecchio stile sono stato in grado di chiamare ToolServices.GetNewModuleName alla scoperta di un'unità e la forma nome disponibile che potrei usare quando si generano i file di origine associati. Qual è l'equivalente nella odierna API degli strumenti aperti?

In base ai commenti dell'unità ToolsAPI, dovrei restituire uno spazio vuoto dal metodo IOTAModuleCreator.GetImplFileName per consentire a Delphi di generare il nome del file. Sto restituendo una stringa vuota da questo metodo, ma non riesco ancora a vedere dove posso accedere al nome del file che Delphi sta generando.

+0

Non ho ancora capito perché in alcune circostanze Delphi non genera il nome dell'unità predefinito, ma sono convinto che abbia qualcosa a che fare con quale delle interfacce implementate. Mentre la soluzione di Marco ti consente di chiedere direttamente a Delphi un nome, anche le altre due risposte che appaiono in questo momento sono corrette in quanto ModuleIdent (e parametri simili) di solito contengono queste informazioni. Tutte e tre le risposte dovrebbero essere considerate corrette. Pubblicherò un follow-up quando imparo di più. –

risposta

4

C'è un metodo specifico per ottenere una nuova forma e unità nome:

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

Ho usato in alcuni esempi e sembra funzionare bene.

+0

Grazie, Marco! Questa tecnica funziona sicuramente. Sono anche convinto che l'uso corretto di IOTACreators farà anche questo, e sto modificando il mio wizard per creare un progetto, e non solo un modulo unitario per vedere se questo fa la differenza quando il nome predefinito viene generato automaticamente da Delphi. A seconda di ciò che trovo, alla fine potrei contrassegnare tutte e tre le risposte come corrette. –

2

Il metodo IOTAModuleCreator.NewImplSource ha un parametro "ModuleIdent", è il nome dell'unità.

+0

Questo è il metodo che ho implementato per restituire un'implementazione IOTAFile che restituisce l'origine per l'unità. Il valore del parametro ModuleIdent passato a NewImplSource, tuttavia, è vuoto. La mia ipotesi era che se avessi restituito uno spazio vuoto da GetImplFileName, Delphi avrebbe generato il nome dell'unità e lo avrebbe passato a NewImplSource. Invece, ModuleIdent è vuoto. –

2

Nei miei test, funziona come previsto (il parametro nel metodo NewImplSource riceve il nome della nuova unità). Controllare nuovamente l'implementazione, in particolare verificare che:

  • IOTACreator.GetUnnamed restituisce True
  • IOTACreator.GetExisting restituisce false
  • IOTACreator.GetCreatorType restituisce l'identificativo appropriato (sUnit, sForm, ecc) - Non sono sicuro di questo, ma potrebbe essere importante anche

Here è un esempio funzionante. Ho appena controllato e il codice sembra funzionare come previsto in Delphi XE.

+0

Grazie per l'input. Sto restituendo True da GetUnnamed, False da GetExisting e ToolsAPI.sUnit da GetCreator (poiché sto creando un'unità). Ecco il mio decl IOTACreator. Hai implementato altre interfacce? TCompEditorAppModuleCreator = class (TInterfacedObject, IOTACreator, IOTAModuleCreator). Inoltre, hai avuto un'implementazione di IOTAProjectCreator (e IOTAProjectCreate50) in una delle tue implementazioni? Il mio mago no, dal momento che stavo creando solo un'unità, e non un progetto. Mi chiedo se questo faccia la differenza. –

+0

Forse è importante implementare IOTAModuleCreator.GetOwner? La mia implementazione restituisce il progetto attualmente attivo. Nelle versioni recenti di Delphi, puoi utilizzare IOTAModuleServices.GetActiveProject per averlo. –

+0

Aggiungerò un IOTAProjectCreator al mio Wizard per creare un intero progetto, non solo un modulo, e vedrò se questo fa la differenza nella generazione dei nomi di default di Delphi. Pubblicherà i risultati più tardi. –