2010-01-29 20 views
5

Tôi đã gặp phải một vấn đề khiến tôi gặp khó khăn nhiều lần trong quá trình phát triển dự án Flash. Có vẻ như sau:Cách chính xác để thêm thành phần vào thư viện của Swf là gì?

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at fl.containers::BaseScrollPane/fl.containers:BaseScrollPane::drawBackground() 
at fl.controls::TileList/fl.controls:TileList::draw() 
at fl.core::UIComponent/::callLaterDispatcher() 
TypeError: Error #2007: Parameter child must be non-null. 
at flash.display::DisplayObjectContainer/addChildAt() 
at fl.controls::BaseButton/fl.controls:BaseButton::drawBackground() 
at fl.controls::BaseButton/fl.controls:BaseButton::draw() 
at fl.core::UIComponent/drawNow() 
at fl.controls::ScrollBar/fl.controls:ScrollBar::draw() 
at fl.core::UIComponent/::callLaterDispatcher() 

Bây giờ, trong trường hợp của tôi, lỗi này xuất phát từ thư viện thành phần của fla trong CS4. Trong quá khứ, tôi đã gặp phải vấn đề này khi cố gắng tự động tạo ScrollPanes trong mã. Tôi đã giải quyết nó bằng cách thêm các thành phần ScrollPane vào thư viện Main.fla của tôi. Điều này dường như làm việc một lúc.

Bây giờ, tôi đang cố gắng sử dụng hộp Tự động hoàn thành AstraFlash. Tôi đã nhập các tập tin fla thích hợp vào CS4, và đặt một hộp AutoComplete vào Swf của tôi. Mọi thứ đều tốt, nhưng lỗi trên xảy ra khi Swf được nạp. Suy nghĩ của tôi là hộp AutoComplete đang cố gắng tạo một ScrollPane như là một phần của chức năng của nó. Ok, tôi hiểu điều này, vì vậy tôi thêm thành phần ScrollPane vào thư viện cũng như với các kết quả tương tự.

Thông thường tôi sẽ chỉ lộn xộn với các thành phần/cài đặt thư viện cho đến khi tôi loại bỏ lỗi, nhưng tôi bị bệnh khi chạy vào điều này và tôi muốn biết cách chính xác để giải quyết vấn đề. Vì vậy, đây là một vài câu hỏi mà tôi có:

  • Khi nào bạn cần thêm thành phần vào thư viện của Fla chứ không phải chỉ tạo thành phần trong mã?

  • Bạn cần thêm thành phần nào vào bộ lọc? Chỉ là người sử dụng nó? Hoặc tất cả các bậc cha mẹ của Fla đó là tốt?

  • Giả sử thành phần Tự động điền yêu cầu thành phần ScrollPane. Tại sao phụ thuộc này không được công nhận khi tôi thêm một thành phần? Tại sao tôi phải thêm nó một cách rõ ràng?

  • Sự khác biệt giữa việc thêm thành phần vào thư viện và thêm nó vào thư mục 'Thành phần nội dung' của thư viện là gì? Mục đích của thư mục này là gì?

Tôi thực sự cần thành phần AutoComplete này hoạt động. Giả sử mã AS3 là chính xác và tôi vẫn nhận được lỗi ở trên, bạn cho rằng cài đặt nào có thể không chính xác? Ngoài sự thất vọng, tôi đã thử thêm mọi thành phần có thể vào thư viện, cũng như thư mục tài sản thành phần của thư viện chỉ để có điểm bắt đầu, nhưng tôi vẫn gặp lỗi.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

2

Tôi không chắc mình hiểu rằng bạn đang thiết lập. Những gì tôi giả định là bạn có một fla con có chứa một số thành phần và bạn cần phải tạo ra trường hợp của những thành phần trong một fla cha mẹ (loader).

Nó sẽ hoạt động nếu bạn biên dịch các lớp từ fla con thành fla mẹ, nhưng điều đó sẽ lặp lại mọi thứ.

Vấn đề là khi bạn tải một swf, các lớp học ngồi trong một khác nhau ApplicationDomain. Đơn giản chỉ cần đặt, đó là điều mà quản lý các lớp học trong một swf, do đó bạn không có xung đột lớp giữa một bộ tải và nạp swf và một số công cụ bảo mật khác.

Tôi đã tạo một fla đơn giản chứa thành phần Nút (fl.controls.Button) và được nạp từ bộ nạp trình nạp. Tôi đã không thêm thành phần Button vào fla của trình nạp, nhưng đã tạo ra một cá thể nút, sử dụng miền ứng dụng của swf đã tải.Dưới đây là cách thực hiện:

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
loader.load(new URLRequest('componentContainer.swf')); 

function loaded(event:Event):void { 
    addChild(loader.content); 
    var SWFButton:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('fl.controls.Button') as Class; 
    var button = new SWFButton(); 
    button.label = 'Test'; 
    addChild(button); 
} 

Có một trang trong Lập trình Actionscript 3.0 về loại vấn đề này và cách sử dụng ApplicationDomain, nhưng tôi không hoàn toàn hiểu nó là trung thực.

HTH, George

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