2012-03-24 40 views
10

Tôi đang cố gắng tạo gói cho thành phần tùy chỉnh mà tôi đã tạo. Nó dựa trên một số thư viện, bao gồm Graphics32, GraphicEx và CCR.Exif.Địa chỉ phụ thuộc thành phần tùy chỉnh

Tôi tạo ra một dự án Gói, đã viết đơn vị bao gồm cả thủ tục đăng ký của mình, bổ sung một số tài liệu tham khảo thêm Delphi thông báo cho tôi về đến đòi hỏi phần (bao gồm dbrtl.dcp, inet.dcp, soaprtl.dcp, vclimg. dcp, xmlrtl.dcp và dclGraphicEx140.dcp) và thêm nhiều đơn vị vào chứa phần để tránh cảnh báo về nó xảy ra ngầm định. Dự án biên dịch và có thể được cài đặt và sử dụng trên máy của riêng tôi mà không gặp vấn đề gì. Tuy nhiên, khi tôi muốn cài đặt nó trên một máy khác, những rắc rối bắt đầu. Cuối cùng, tôi đã phải sao chép tất cả các DCU từ tất cả các thành phần của bên thứ 3 mà tôi đã sử dụng, cộng với cả DCP và BPL từ GraphicEx, mà tôi phải cài đặt ngay cả.

Việc cung cấp nhiều tệp là một số ít, nhưng không thể vượt qua, nhưng phải cài đặt các gói khác cũng như là không đi. Tôi có thể loại bỏ DCP và BPL đó bằng cách đặt nhiều đơn vị hơn trong phần chứa phần, nhưng điều đó dẫn đến thông báo lỗi trên máy của riêng tôi khi GraphicEx thực sự được cài đặt. Điều này gây nhầm lẫn với tôi, bởi vì với Graphics32 không có gì xảy ra ...

Dù sao, làm cách nào để giữ phân phối ở mức tối thiểu và tránh những tình huống như vậy? Tôi muốn các nhà phát triển khác trong nhóm của tôi có thể sử dụng gói mà không phải lo lắng về những gì tôi đã sử dụng để xây dựng nó. Để bắt đầu, không thể tất cả các đơn vị bên thứ 3 được biên dịch vào DCU của riêng tôi?

+7

Cài đặt thành phần là một sự xấu hổ của Delphi, liên tục bị bỏ qua bởi Embarcadero. – kludg

+0

Bạn đang làm loại phân phối nào, cho người dùng các ứng dụng được biên soạn hoặc các nhà phát triển khác để họ sử dụng trong IDE? – afrazier

+0

@afrazier Gói có điều khiển cho các nhà phát triển khác (thành viên nhóm) sử dụng. –

Trả lời

0

Tóm tắt

đã không sử dụng Delphi cho một thời gian, nhưng, đã phát triển điều khiển hình ảnh tùy chỉnh của tôi (cuối phiên bản tôi làm việc là Delphi 6).

Có 2 vấn đề khi xử lý các gói phụ thuộc. Một là cài đặt tại môi trường Delphi, làm cho điều khiển xuất hiện trên bảng thành phần, cộng với, biên tập viên thành phần & biên tập viên bất động sản.

Và một khi phân phối các gói đã biên dịch thành máy khách hàng.

Nó cũng phụ thuộc vào phiên bản trên Delphi bạn đang chạy.

Thiết kế Thời gian

Khi phát triển một gói tùy chỉnh, có một tab cho các tùy chọn gói, cho biết các thư mục đích.

Hướng dẫn thường cho các nhà phát triển để trống những hộp văn bản đó. Điều đó đôi khi hoạt động, đôi khi không. Tôi explicity viết từng đường dẫn thư mục, trong hộp văn bản tương ứng.

Có đường dẫn hộp văn bản cho tệp ".dcp", khác cho " .dcu", v.v.

Nếu bạn có các điều khiển trực quan và nội dung như trình chỉnh sửa thuộc tính hoặc trình chỉnh sửa thành phần, tốt hơn là chia mã trong 2 gói ("Thời gian chạy" & "Designtime").

Tôi thường đặt các dự án delphi (gói) bên ngoài thư mục cài đặt delphi.

Run Time

Thông thường, cách nhanh chóng là để đưa "* .bpl" ".dcp" tập tin trong Windows (32)/thư mục hệ thống, hoặc tương tự như "thư mục DLL" cửa sổ.


Gói cấu trúc thư mục mã nguồn gợi ý

Giám gói có thể khó khăn. Tôi không biết bao nhiêu quá trình cài đặt đã thay đổi với Embarcadero, và các phiên bản mới hơn của Delphi. Biểu đồ sau đây là một ví dụ về cách tổ chức mã nguồn. Hy vọng nó giúp.

[-]--+--c: 
.....| 
.....+--[-]--+--software 
.............| 
.............+--[+]-----java 
.............| 
.............+--[+]-----php 
.............| 
.............+--[-]--+--delphi (not the delphi folder in program files) 
.....................| 
.....................+--[+]-----apps (source code for delphi programs) 
.....................| 
.....................+--[+]-----other 
.....................| 
.....................+--[-]--+--packages (all delphi packages source code here) 
.............................| 
.............................+--[+]-----lib (a single package for non visual controls, libraries) 
.............................| 
.............................+--[+]-----tools (package pair for non visual tcomponent descendants) 
.............................| 
.............................+--[+]-----json (example) 
.............................| 
.............................+--[+]-----xml (example) 
.............................| 
.............................+--[-]--+--mycontrols (folder custom visual controls) 
.............................|.......| 
.............................|.......+--[-]--+--delphi40 (folder for delphi40 version of "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+----------dsgvclctrls40.dpk (design-time package "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+----------runvclctrls40.dpk (run-time package "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--demos (individual example for each "mycontrol") 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--design ("*.pas" component editors destination folder) 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--sources ("*.pas" source code destination folder) 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--bin ("*.dcu" destination folder) 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi50 (folder for delphi50 version of "mycontrols") 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi60 (folder for delphi60 version of "mycontrols") 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi70 (folder for delphi70 version of "mycontrols") 
.............................|................ 
.............................+--[-]-----etc... 

Cheers.

+3

Xin lỗi, nhưng tôi không thấy cách này trả lời câu hỏi của tôi về cách viết và/hoặc phân phối một thành phần theo cách mà người dùng (nhà phát triển) không phải thực hiện các biện pháp đặc biệt (tải xuống/cài đặt phụ thuộc) theo một cách cụ thể) để sử dụng nó. –

+0

"Thời gian thiết kế" là bước trước đó cho mục tiêu của bạn. "Thời gian chạy" được hướng nhiều hơn đến phân phối. – umlcat

0

Thijs, bạn chỉ đơn giản là không thể làm điều đó chỉ với một gói. Nhà phát triển mục tiêu sẽ yêu cầu hầu hết mọi thứ bạn đã thêm vào gói. Nhưng có một cách thay thế để làm những gì bạn muốn: Xây dựng một DLL với tất cả các thành phần/thư viện bạn đang sử dụng trong thành phần của riêng bạn và bọc tất cả các thành phần/thư viện bên ngoài đó vào một số mã bạn sẽ xuất từ ​​tệp DLL. Sau đó, xây dựng thành phần của bạn mà không cần sử dụng các thành phần bên ngoài trực tiếp nhưng DLL bạn đã xây dựng. Bạn không thể trong bạn thành phần "sử dụng" bất kỳ đơn vị nào của các thành phần/Thư viện bên ngoài khác. Bạn phải xây dựng một đơn vị mới với tất cả các kiểu dữ liệu và yêu cầu khai báo cho bất cứ điều gì bạn xuất từ ​​DLL của bạn. Tất cả điều này là hoàn toàn làm việc nhưng sẽ nhanh chóng trở nên rất phức tạp đối với một số lượng lớn các thành phần hoặc thư viện bên ngoài.

+0

Thay vì một DLL, tôi có thể sử dụng BPL, để có thể sử dụng các đối tượng không? Và không phải là có thể biên dịch một BPL vào exe? –

2

Điều bạn trải nghiệm là điều bình thường đối với những người viết các thành phần. Sự phân bố luôn như vậy. Các gói không mang theo các gói khác, được insted họ tham khảo chúng. Đó là bản chất của họ.

Để khắc phục tình huống như vậy, tôi luôn đối xử với các thành phần của mình theo cách tương tự như khi bán sản phẩm: Tôi xây dựng trình hướng dẫn thiết lập phân phối và đăng ký mọi thứ cần thiết.

Trong trường hợp của tôi InnoSetup hoạt động rất tốt (http://www.jrsoftware.org/isinfo.php).

+0

Làm cách nào để kiểm tra xem gói chưa được cài đặt (vì bạn không thể có gói này hai lần)? Không có một vị trí cố định nào để mong đợi nó. –

+0

@ThijsvanDien: tất cả các gói đã đăng ký với IDE được liệt kê trong Windows Registry trong 'HKEY_CURRENT_USER \ Software \ Embarcadero \ BDS \ 7.0 \ Known Packages'. Phiên bản BDS phụ thuộc vào phiên bản Delphi. Nếu tôi không nhầm, 7.0 có nghĩa là Delphi 2010. Hãy xem các mục bên dưới khóa đó để xác định xem một gói nào đó đã có trong IDE chưa. – AlexSC

0

Tôi nghĩ AlexSC có câu trả lời đúng nhất, nhưng tôi nghĩ có thể có một giải pháp thay thế nếu bạn an toàn phải có một thành phần tùy chỉnh không có phụ thuộc.

Tôi gặp phải sự thất vọng phụ thuộc Delphi một chút trong khi cố gắng tạo một thành phần nội bộ cho các nhà phát triển của chúng tôi. Đề nghị của tôi:

  1. Gỡ bỏ tất cả phụ thuộc thành phần của bạn sử dụng

  2. Trong gói thành phần của bạn, loại bỏ các DCP trên từ phần từ gói của bạn yêu cầu.

  3. Sao chép các tập tin nguồn của sự phụ thuộc của bạn với các thành phần của bạn

Khi bạn phân phối các thành phần, bạn sẽ phải distibute nó với mã của dependecies cần

Bạn sẽ chạy vào các vấn đề nếu bạn muốn sử dụng dependcies một cách riêng biệt vì Delphi sẽ không cho phép bạn có tên đơn vị trùng lặp trong các gói đã cài đặt.

Ngoài ra, lý do bạn không muốn sử dụng DCUs là việc DCUs được biên dịch cho một nền tảng và trình biên dịch cụ thể. Vì vậy, trừ khi bạn chắc chắn rằng tất cả các devolpers trên cùng một nền tảng quảng cáo sử dụng cùng một phiên bản của Delphi, mã phụ thuộc cần phải được biên dịch lại.

Một lần nữa, AlexSC có câu trả lời tốt nhất và InnoStudio là một công cụ tuyệt vời.

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