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

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

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

Регистрация: Jan 2007
Сообщений: 91
По умолчанию Drag And Drop между кастомными компонентыми

Добрый день, Есть 2 кастомных компонента, один на основе канвас, другой на основе tilelist с кастомным рендером. Мне необходимо перетаскивать из тайллиста в компонент канвас объекты, но не просто перетаскивать, а перетаскивать данные, допустим, каждый чайл тайллиста имеет 2 параметра, _name и _weight, у меня есть 2 массива, один отвечает за имена, другой за вес. я перетаскиваю чайлд на канвас, отпускаю и тут же мои массивы принимают переданные параметры.

Завис в самом начале, в компонент тайллиста, разрешил драг энд дроп и повесил событием mouseMove с создание датапрокси, но не пойму как передать значение чайлда, который надо формировать из xml

Код AS3:
<comp:TileListEx x="0" width="223" height="302" backgroundAlpha="0" borderStyle="none" dataProvider="{xmlListColl}"
            itemRenderer="components.TileListBigItemRenderer"
            columnWidth="70"
            rowHeight="70"
            useRollOver="false"
            id="pattern"
            dragEnabled="true"
            dropEnabled="true"
            dragMoveEnabled="true"
            focusAlpha="0"
            bottom="0"
            mouseDown="onMouseMove(event)"/>
 
private function onMouseMove(event:MouseEvent):void
{
                        var dragInitiator:Image = new Image();
        		dragInitiator.source = 'assets/ico1.png';
        		var datasource:DragSource = new DragSource(); 
// в идеале, тут буду брать данные из xml, опираясь на индекс чайлда
        		datasource.addData("1", "value");
                        datasource.addData("somename", "name"); 
 
        		var canvasProxy:Canvas = new Canvas(); 
        		canvasProxy.height = 25; 
        		canvasProxy.width = 25; 
        		DragManager.doDrag(dragInitiator, datasource, event, canvasProxy); 
			}
картинкой ico1.png я сделал обычную прозрачную пнг, так как мне не надо картинки перетаскивать, а только данные собирать, понимаю, что это ламерство, но другого решения не нашел

мой канвас компонент имееет такой код для обработки событий

Код AS3:
private var totalValue:Array;
private var totalName:Array;
 
			private function dragEnterHandler(event:DragEvent):void
			{
				trace("dragEnterHandler: "+event.target);
				if (event.dragSource.hasFormat("value"))
				{ 
					DragManager.acceptDragDrop(Canvas(event.currentTarget)); 
				} 
            }
 
            private function dragOverHandler(event:DragEvent):void
            {
            	trace("dragOverHandler");
                var dropTarget:Canvas=event.currentTarget as Canvas;                
            }
 
            private function dragDropHandler(event:DragEvent):void
            {
		trace("dragDropHandler");
                var value:uint = event.dragSource.dataForFormat('value') as uint;
                var name:String = event.dragSource.dataForFormat('name') as String;
                totalValue.push(value);
                totalName.push(name);
            }
на данном этапе получаю ошибку: TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

если я mouse move уберу, то я могу таскать чайлды, но канвас их не воспринимает, и не дает дропить


Последний раз редактировалось MyChemic; 20.02.2010 в 21:25.
Старый 20.02.2010, 18:06
Sheff_88 вне форума Посмотреть профиль Отправить личное сообщение для Sheff_88 Найти все сообщения от Sheff_88
  № 2  
Ответить с цитированием
Sheff_88

Регистрация: Dec 2008
Сообщений: 20
В блоках с кодом поменяйте тип на AS3, а то вы подсвечиваете его как php. Код читать невозможно.

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

Регистрация: Jan 2007
Сообщений: 91
поправил

Старый 23.02.2010, 16:17
Sheff_88 вне форума Посмотреть профиль Отправить личное сообщение для Sheff_88 Найти все сообщения от Sheff_88
  № 4  
Ответить с цитированием
Sheff_88

Регистрация: Dec 2008
Сообщений: 20
Во-первых, заполнение dragSource
Код AS1/AS2:
private function onMouseMove(event:MouseEvent):void
{
                       var dragInitiator:Image = new Image();
        		      dragInitiator.source = 'assets/ico1.png';
 
                      var datasource:DragSource = new DragSource(); 
        		     datasource.addData( tileListChildData, "items");
 
        		var canvasProxy:Canvas = new Canvas(); 
        		     canvasProxy.height = 25; 
        		     canvasProxy.width = 25;
 
        		DragManager.doDrag(dragInitiator, datasource, event, canvasProxy); 
			}
Но это вообще необязаттельно, так как TileList поддерживает drag нативно. Для этого задайте свойство dragEnabled="true" для TileList.

canvas'у, естественно, dragDrop нативно не прописан.
Добавляем хэндлер на дроп
Код AS1/AS2:
private function dragEnterHandler(event:DragEvent):void
			{
				trace("dragEnterHandler: "+event.target);
				if (event.dragSource.hasFormat("items"))
				{ 
					DragManager.acceptDragDrop(Canvas(event.currentTarget)); 
				} 
 
private function dragDropHandler(event:DragEvent):void
            {
	     trace("dragDropHandler");
 
                //получаем массив дропнутых данных
                var droppedData:Array = event.dragSource.dataForFormat('items') as Array;
 
                //обрабатываем данные
                var item:Object;
                for each( object in droppedData )
                {
                    totalValue.push(object.value);
                    totalName.push(object.name);
                }
            }
Как-то так

Старый 28.02.2010, 13:30
MyChemic вне форума Посмотреть профиль Отправить личное сообщение для MyChemic Найти все сообщения от MyChemic
  № 5  
Ответить с цитированием
MyChemic

Регистрация: Jan 2007
Сообщений: 91
спасибо за ответ, но я получил такую ошибку при попытке перетащить объект из листа TypeError: Error #1009: Cannot access a property or method of a null object reference.

очевидно, что она происходит при инициализации драг инициатора, если убрать ивент на маусмув, а оставить только enable drag то на канвас не дропится

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

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

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


 


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


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