![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Здравствуйте! Помогите, пожалуйста, разобраться в проблеме!
Есть приложение Flex SDK 3.5, есть экземпляр mx:TitleWindow добавляемый на сцену методом PopUpManager.createPopUp, в этом TitleWindow есть экземпляр mx:AdvancedDataGrid. По событию creationComplete TitleWindow, программно задаётся структура AdvancedDataGrid, десериализируется объект Array и задаётся в качестве источника данных для этого AdvancedDataGrid. Проблема: при выполнении этой процедуры, часто появляется runtime-ошибка: TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null". at mx.controls::AdvancedDataGrid/findHeaderRenderer()[C:\work\flex\dmv_automation\projects\datavisualisation\src\mx\controls\AdvancedDataGrid.as:1352] at mx.controls::AdvancedDataGrid/mouseEventToItemRenderer()[C:\work\flex\dmv_automation\projects\datavisualisation\src\mx\controls\AdvancedDataGrid.as:1317] at mx.controls.listClasses::AdvancedListBase/mouseMoveHandler()[C:\work\flex\dmv_automation\projects\datavisualisation\src\mx\controls\listClasses\AdvancedListBase.as:8085] В чём может быть проблема? Может десериализация источника данных занимает много времени и в момент инициализации AdvancedDataGrid объект dataProvider ещё не готов? Как отследить момент готовности объекта sourse? Что вообще происходит? Вот код всего компонента: <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" creationPolicy="all" creationComplete="componentCompleteHandler()" layout="absolute" width="100%" height="100%" showCloseButton="true" close="mx.core.Application.application.appEventHandler(event);"> <mx:Script> <![CDATA[ import mx.core.Application; import mx.utils.Base64Decoder; import mx.utils.Base64Encoder; import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup; import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; protected function componentCompleteHandler():void{ var baDec:Base64Decoder = new Base64Decoder(); baDec.decode(Application.application.DataGrid1.selectedItem.STOLBEC); var ba2:ByteArray = baDec.toByteArray(); ba2.position = 0; var newAr:Array = ba2.readObject(); var column1:AdvancedDataGridColumn = new AdvancedDataGridColumn(); column1.dataField = "par1"; var column2:AdvancedDataGridColumn = new AdvancedDataGridColumn(); column2.dataField = "par2"; var groupColumnviewDG:AdvancedDataGridColumnGroup = new AdvancedDataGridColumnGroup(); groupColumnviewDG.dataField = "group"; for each(var element:Object in newAr[0].group){ var newDGColumn:AdvancedDataGridColumnGroup = new AdvancedDataGridColumnGroup(); newDGColumn.dataField = "e"+element.ID; var newGroupColumn1:AdvancedDataGridColumn = new AdvancedDataGridColumn(); newGroupColumn1.dataField = "p1"; newGroupColumn1.itemRenderer = new ClassFactory(ItemRend1); var newGroupColumn2:AdvancedDataGridColumn = new AdvancedDataGridColumn(); newGroupColumn2.dataField = "p2"; var newGroupColumn3:AdvancedDataGridColumn = new AdvancedDataGridColumn(); newGroupColumn3.itemRenderer = new ClassFactory(ItemRend2); newGroupColumn3.dataField = "p1"; newDGColumn.children.push(newGroupColumn1, newGroupColumn2, newGroupColumn3); groupColumnviewDG.children.push(newDGColumn); } viewDG.groupedColumns = new Array(column1, column2, groupColumnviewDG); viewDG.dataProvider = newAr; } ]]> </mx:Script> <mx:AdvancedDataGrid id="viewDG" width="{Application.application.stage.width-40}" height="{Application.application.stage.height-60}" lockedColumnCount="2" horizontalScrollPolicy="auto" headerWordWrap="true" variableRowHeight="true" wordWrap="true"/> </mx:TitleWindow> |
|
|||||
|
Modus ponens
|
Возможно есть смысл поэксперементировать с порядком инициализации, т.е. провайдер после колонок, или наоборот и т.п. Но ADG дрянь та еще... я в итоге сдался искать и разбираться, если что-то такое случается - просто наследую класс от ADG и в нем переопределяю функцию которая себя "плохо ведет". У этих ошибок, как правило, нет логического объяснения, просто исходный код очень низкого качества, и, естесственно, ошибки случаются.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Метод, который случайно генерирует ошибку - findHeaderRenderer, имеет идентификатор управления доступом private. Как быть в этом случае?
|
|
|||||
|
Боритесь с причиной, а не последствиями. Ошибка у вас возникает, после того как мышка оказывается над гридом. Попробуйте в начале метода componentCompleteHandler поставить viewDG.endbled = false, в конце true.
P.S. Вы в этой каше, сами хоть ориентируетесь?
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Цитата:
Мне не известно количество колонок поставщика данных, сам AdvancedDataGrid по умолчанию не распознаёт структуру вложенных объектов: sourse={{...},{...},{{...},...,{...}}}. Если Вы подскажите мне, как возможно задекларировать струкутру данных или изменить её, чтобы AdvancedDataGrid увидел вложенные объекты, то я... опять буду признателен Вам! |
|
|||||
|
Я имел ввиду такие конструкции Application.application.DataGrid1.selectedItem.STOLBEC, Application.application.stage.width-40 и т.д.
__________________
משיח לא בא משיח גם לא מטלפן Последний раз редактировалось alatar; 22.01.2012 в 21:21. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Насчёт Application.application.stage==stage согласен. stage она и в IFlexDisplayObject stage. А какая практика лучшая для обращения к объекту расположенному в Application.application?
|
|
|||||
|
Не должно быть такой практики. Дети не должны знать, что внутри их родителей, передавайте необходимые данные при вызове объекта, также и с размерами. PopUpManager.createPopUp возвращает созданный объект. Ссылку на root можно получить через systemManager.getSandboxRoot(), а уже у него можно получить stage.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 177
|
Правильно-ли я понял, что вложенные классы должны содержать собственные свойства-переменные со значением ссылок на объекты других классов?
Чем вызвана необходимость в дополнительных строках кода? ...Впрочем один аргумент я уже открыл для себя: при Вашем подходе ошибка указанная в начале темы исчезла. Чуть раньше я её латал таймером, который с запаздыванием присваивал значение AdvancedDataGrid.enabled=true Хотя, как по мне, визуализация инициализации AdvancedDataGrid раньше была лучше: появлялся пустой AdvancedDataGrid, через долю секунды его содержимое, теперь: появляется AdvancedDataGrid с двумя заполненными колонками, затем через долю секунды AdvancedDataGrid приобретает окончательный вид. Может надо ещё поработать... Последний раз редактировалось zorexundra; 23.01.2012 в 13:09. |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:26. |
|
|
« Предыдущая тема | Следующая тема » |
|
|