2010-11-16 23 views
6

Tôi đã viết một thuật sĩ trong Delphi XE, và nó hoạt động tốt. Tuy nhiên, tôi chưa tìm ra cách truy cập tên đơn vị mặc định đã tạo (hoặc tên biểu mẫu hoặc tên dự án) mà OTA của Delphi có thể tạo ra.Làm thế nào để bạn lấy tên đơn vị mới từ các công cụ mở của Delphi API

Trong trình hướng dẫn kiểu cũ, tôi có thể gọi ToolServices.GetNewModuleName để khám phá một đơn vị và tên biểu mẫu có sẵn mà tôi có thể sử dụng khi tạo tệp nguồn được liên kết. Tương đương với API công cụ mở ngày nay là gì?

Theo nhận xét của đơn vị ToolsAPI, tôi phải trả về trống từ phương thức IOTAModuleCreator.GetImplFileName để có Delphi tạo tên tệp. Tôi đang trả về một chuỗi rỗng từ phương thức này, nhưng vẫn không thể thấy nơi tôi có thể truy cập tên tệp mà Delphi đang tạo ra.

+0

Tôi vẫn chưa tìm ra lý do tại sao trong một số trường hợp Delphi không tạo ra tên đơn vị mặc định, nhưng tôi tin rằng nó có liên quan đến giao diện nào bạn thực hiện. Trong khi giải pháp của Marco cho phép bạn hỏi Delphi trực tiếp cho một tên, hai câu trả lời khác xuất hiện tại thời điểm này cũng đúng trong đó ModuleIdent (và các tham số tương tự) thường chứa thông tin này. Tất cả ba câu trả lời nên được coi là chính xác. Tôi sẽ đăng phần tiếp theo khi tôi tìm hiểu thêm. –

Trả lời

4

Có một phương pháp cụ thể để có được một hình thức và đơn vị tên mới:

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

Tôi đã sử dụng trong một vài ví dụ và có vẻ như hoạt động tốt.

+0

Cảm ơn, Marco! Kỹ thuật này chắc chắn hoạt động. Tôi cũng tin rằng việc sử dụng IOTACreators thích hợp cũng sẽ làm điều này, và tôi đang sửa đổi trình hướng dẫn của mình để tạo một dự án, và không chỉ là một mô-đun đơn vị để xem điều đó có tạo ra sự khác biệt khi tên mặc định được Delphi tạo tự động hay không. Tùy thuộc vào những gì tôi thấy tôi cuối cùng có thể đánh dấu cả ba câu trả lời này là chính xác. –

2

Phương thức IOTAModuleCreator.NewImplSource có bộ mô-đun "ModuleIdent", đó là tên đơn vị.

+0

Đó là phương pháp mà tôi đã thực hiện để trả về một triển khai IOTAFile trả về nguồn cho đơn vị. Tuy nhiên, giá trị của tham số ModuleIdent được chuyển đến NewImplSource là trống. Giả định của tôi là nếu tôi trả về một trống từ GetImplFileName, Delphi sẽ tạo ra tên đơn vị và chuyển nó cho NewImplSource. Thay vào đó, ModuleIdent trống. –

2

Trong thử nghiệm của tôi, nó hoạt động như bạn mong đợi (ModuleIdent tham số trong phương thức NewImplSource nhận tên đơn vị mới). Kiểm tra thực hiện của bạn một lần nữa, đặc biệt là đảm bảo rằng:

  • IOTACreator.GetUnnamed trả về true
  • IOTACreator.GetExisting lợi nhuận False
  • IOTACreator.GetCreatorType trả về nhận dạng thích hợp (sUnit, sForm, vv) - Tôi không chắc chắn về điều này nhưng điều đó cũng quan trọng, quá

Here là ví dụ làm việc. Tôi chỉ cần kiểm tra nó và mã vẫn có vẻ như làm việc như mong đợi trong Delphi XE.

+0

Cảm ơn bạn đã nhập. Tôi trả về True từ GetUnnamed, False từ GetExisting và ToolsAPI.sUnit từ GetCreator (vì tôi đang tạo một đơn vị). Dưới đây là tuyên bố IOTACreator của tôi. Bạn có triển khai bất kỳ giao diện nào khác không? TCompEditorAppModuleCreator = class (TInterfacedObject, IOTACreator, IOTAModuleCreator). Ngoài ra, bạn cũng có triển khai IOTAProjectCreator (và IOTAProjectCreate50) trong một trong các triển khai của bạn không? Trình hướng dẫn của tôi không, vì tôi chỉ đang tạo một đơn vị chứ không phải một dự án. Tôi tự hỏi liệu điều đó có tạo nên sự khác biệt hay không. –

+0

Có lẽ điều quan trọng là phải triển khai IOTAModuleCreator.GetOwner? Việc triển khai của tôi trả về dự án hiện đang hoạt động. Trong các phiên bản gần đây của Delphi, bạn có thể sử dụng IOTAModuleServices.GetActiveProject để có được nó. –

+0

Tôi sẽ thêm một IOTAProjectCreator vào Trình hướng dẫn của tôi để tạo toàn bộ một dự án, không chỉ là một mô-đun, và tôi sẽ xem nó có tạo ra sự khác biệt trong việc tạo tên mặc định của Delphi hay không. Sẽ đăng kết quả sau. –

Các vấn đề liên quan