Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Drag And Drop между кастомными компонентыми (http://www.flasher.ru/forum/showthread.php?t=136568)

MyChemic 19.02.2010 18:43

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 уберу, то я могу таскать чайлды, но канвас их не воспринимает, и не дает дропить

Sheff_88 20.02.2010 18:06

В блоках с кодом поменяйте тип на AS3, а то вы подсвечиваете его как php. Код читать невозможно.

MyChemic 21.02.2010 12:10

поправил

Sheff_88 23.02.2010 16:17

Во-первых, заполнение 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);
                }
            }

Как-то так:)

MyChemic 28.02.2010 13:30

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

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


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

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