2009-08-01 23 views
18

Cố gắng sắp xếp lại các gói của tôi cho một tập hợp TFrame-descendent components, tôi thấy có vẻ cần thiết để tách ra một số tiện ích TFrame của tôi tách biệt khỏi các hộp thoại sử dụng chúng, chủ yếu là vì trước đây được đăng ký bảng màu và điều đó dường như gây nhầm lẫn cho IDE đôi khi đối với các dạng hộp thoại sử dụng chúng. Các dạng hộp thoại lần lượt được gọi bởi các thành phần không nhìn thấy, là một phần của gói thứ ba. Điều này, cho đến nay, dường như làm cho hầu hết các biên dịch của dependency-related complaints/nhầm lẫn biến mất. (Tôi chưa ra, tuy nhiên).Là "nhập khẩu ngầm" luôn luôn là một điều xấu trong các gói Delphi?

Khi biên dịch gói với các hình thức thoại (mà gọi Frames), tôi nhận được cảnh báo "Đơn vị 'MyFrames' ngầm nhập khẩu vào gói 'MyDialogForms"

Cho rằng nó hiển thị lên như một cảnh báo trình biên dịch, tôi đã lâu nhận được ấn tượng rằng "nhập khẩu ngầm" một đơn vị thường không phải là một điều tốt. Có trường hợp cụ thể mà không phải là trường hợp? tức là nơi nhập khẩu ngầm một đơn vị là OK và/hoặc thực hành phù hợp? ... và nếu có, thì những trường hợp cụ thể đó là gì?

Trả lời

28

Đây là vấn đề:

Bạn chỉ có thể có một bản sao của một đơn vị trong chương trình của mình. Nếu bạn cố gắng tải cùng một đơn vị hai lần thông qua các gói, nó sẽ tăng một ngoại lệ và gói sẽ không tải lần thứ hai. Cách để tránh điều này là cấu trúc các gói của bạn để không có đơn vị nào được sử dụng trong nhiều hơn một trong số chúng.

Mã cho mọi đơn vị bạn biên soạn phải nằm trong gói. Trình biên dịch sẽ bắt đầu với tất cả các đơn vị bạn khai báo trong phần chứa, nhưng bất kỳ đơn vị nào khác được các đơn vị đó sử dụng cũng phải được biên dịch để có thể truy cập được, trừ khi các đơn vị đó được chứa trong gói khác được liệt kê dưới yêu cầu. Các tính năng bổ sung này là các đơn vị "được nhập khẩu ngầm". Sự cố là, chúng được nhập hoàn toàn, không được nêu rõ trong phần chứa phần nơi chúng sẽ hiển thị thuận tiện trong Trình quản lý dự án ở bên phải. Điều này có nghĩa rằng bạn có thể không nhận thấy rằng đơn vị của bạn đang ở trong một gói, và kết thúc đặt nó trong một gói khác. Sau đó, khi bạn cố gắng chạy chương trình của bạn và tải các gói, mọi thứ phá vỡ. Đó là lý do tại sao trình biên dịch cảnh báo bạn về nó.

Đó là cảnh báo và không phải là lỗi vì lý do. Miễn là bạn hiểu cách thức hoạt động của hệ thống, về mặt kỹ thuật, an toàn là sử dụng các hàng nhập ẩn. Chỉ cần nhớ rằng những đơn vị đó sẽ kết thúc trong gói cho dù bạn khai báo hay không. Nhưng sau đó một lần nữa, kể từ khi họ kết thúc ở đó cho dù bạn khai báo hay không, nó có thể đơn giản chỉ để chính thức thêm chúng và tiết kiệm cho mình những rắc rối.

+2

(lưu ý rằng trong gói không có nghĩa là trong BPL. Xem $ weakpackageunit;) –

+1

Mason - CẢM ƠN BẠN! Đây là tổng quan khái niệm gọn gàng, gọn gàng nhất tôi đã đọc về điều này kể từ khi gói sagas của tôi bắt đầu. – Jamo

+0

Làm thế nào để Delphi xử lý các tham chiếu theo định kỳ tới các đơn vị cơ bản như SysUtils, Forms, vv trên các gói? Có vẻ như chúng sẽ gây ra cùng một vấn đề. – Jamo

10

+1 cho Mason's answer. Nơi mà các đơn vị nhập khẩu ngầm trở thành một vấn đề là trên một dự án lớn, nơi nó trở nên theo cấp số nhân khó khăn hơn để theo dõi các đơn vị được liên kết từ bất cứ nơi nào.

Tôi tìm cách tốt nhất cho đến nay là có một thư mục cho mỗi gói và thư mục đó chứa tất cả các tệp cho gói. Nếu tôi thấy cảnh báo "nhập ẩn", tôi có thể thêm gói được yêu cầu hoặc thêm đơn vị vào gói. Vì vậy, tất cả các đơn vị được quy định trong gói có chứa chúng và tất cả chúng đều nằm trong cùng một thư mục. Tôi không bao giờ thêm các thư mục vào đường dẫn tìm kiếm, bởi vì mọi dự án đều biết về tất cả các tệp của nó một cách trực tiếp.

Cấu trúc này thực sự không khó để duy trì và nó bảo vệ bạn khỏi các vấn đề mà các đơn vị khác nhau chứa các phiên bản khác nhau của một tệp.

+0

Điều này nghe có vẻ giống như một đề xuất vững chắc - tôi có thể dùng thử! Cảm ơn bạn đã trả lời, Cobus. Nhiều đánh giá cao. – Jamo

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