Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.01.2012, 12:29
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 1  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Question Инициализация AdvancedDataGrid

Здравствуйте! Помогите, пожалуйста, разобраться в проблеме!
Есть приложение 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? Что вообще происходит?
Вот код всего компонента:
Код AS3:
<?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>

Старый 14.01.2012, 13:24
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Возможно есть смысл поэксперементировать с порядком инициализации, т.е. провайдер после колонок, или наоборот и т.п. Но ADG дрянь та еще... я в итоге сдался искать и разбираться, если что-то такое случается - просто наследую класс от ADG и в нем переопределяю функцию которая себя "плохо ведет". У этих ошибок, как правило, нет логического объяснения, просто исходный код очень низкого качества, и, естесственно, ошибки случаются.
__________________
Hell is the possibility of sanity

Старый 19.01.2012, 19:20
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 3  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Цитата:
Сообщение от wvxvw Посмотреть сообщение
...просто наследую класс от ADG и в нем переопределяю функцию которая себя "плохо ведет"...
Метод, который случайно генерирует ошибку - findHeaderRenderer, имеет идентификатор управления доступом private. Как быть в этом случае?

Старый 19.01.2012, 20:22
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 4  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Вызывайте componentCompleteHandler в creationComplete самого грида. Остальной код очень жуткий.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 19.01.2012, 20:39
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 5  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Боритесь с причиной, а не последствиями. Ошибка у вас возникает, после того как мышка оказывается над гридом. Попробуйте в начале метода componentCompleteHandler поставить viewDG.endbled = false, в конце true.

P.S. Вы в этой каше, сами хоть ориентируетесь?
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 20.01.2012, 13:33
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 6  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Цитата:
Сообщение от alatar Посмотреть сообщение
...Ошибка у вас возникает, после того как мышка оказывается над гридом...
Диагноз абсолютно точный. alatar, уже не знаю, как выражать признательность.
Цитата:
Сообщение от alatar Посмотреть сообщение
...P.S. Вы в этой каше, сами хоть ориентируетесь?
Мне не известно количество колонок поставщика данных, сам AdvancedDataGrid по умолчанию не распознаёт структуру вложенных объектов: sourse={{...},{...},{{...},...,{...}}}. Если Вы подскажите мне, как возможно задекларировать струкутру данных или изменить её, чтобы AdvancedDataGrid увидел вложенные объекты, то я... опять буду признателен Вам!

Старый 22.01.2012, 12:24
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Я имел ввиду такие конструкции Application.application.DataGrid1.selectedItem.STOLBEC, Application.application.stage.width-40 и т.д.
__________________
משיח לא בא
משיח גם לא מטלפן


Последний раз редактировалось alatar; 22.01.2012 в 21:21.
Старый 23.01.2012, 11:56
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 8  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Насчёт Application.application.stage==stage согласен. stage она и в IFlexDisplayObject stage. А какая практика лучшая для обращения к объекту расположенному в Application.application?

Старый 23.01.2012, 12:28
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 9  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Не должно быть такой практики. Дети не должны знать, что внутри их родителей, передавайте необходимые данные при вызове объекта, также и с размерами. PopUpManager.createPopUp возвращает созданный объект. Ссылку на root можно получить через systemManager.getSandboxRoot(), а уже у него можно получить stage.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 23.01.2012, 12:40
zorexundra вне форума Посмотреть профиль Отправить личное сообщение для zorexundra Найти все сообщения от zorexundra
  № 10  
Ответить с цитированием
zorexundra

Регистрация: Dec 2010
Сообщений: 177
Правильно-ли я понял, что вложенные классы должны содержать собственные свойства-переменные со значением ссылок на объекты других классов?
Чем вызвана необходимость в дополнительных строках кода?
...Впрочем один аргумент я уже открыл для себя: при Вашем подходе ошибка указанная в начале темы исчезла.
Чуть раньше я её латал таймером, который с запаздыванием присваивал значение AdvancedDataGrid.enabled=true
Хотя, как по мне, визуализация инициализации AdvancedDataGrid раньше была лучше: появлялся пустой AdvancedDataGrid, через долю секунды его содержимое, теперь: появляется AdvancedDataGrid с двумя заполненными колонками, затем через долю секунды AdvancedDataGrid приобретает окончательный вид. Может надо ещё поработать...


Последний раз редактировалось zorexundra; 23.01.2012 в 13:09.
Создать новую тему Ответ Часовой пояс GMT +4, время: 14:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 14:26.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.