#apache-flex #flash-builder
#apache-flex #flash-builder
Вопрос:
у меня возникла проблема с проектом, над которым я работаю во Flash Builder. Ниже приведен мой стек и пример кода. Может кто-нибудь, пожалуйста, сказать мне, что я делаю не так?
Спасибо, что уделили мне время.
— Stack —
Ошибка ссылки: Ошибка # 1069: Свойство page4 не найдено на WOAPPv2 и нет значения по умолчанию. в WOAPPv2/dragDropHandler()[/Users/martinw/Documents/Adobe Flash Builder 4/WOAPPv2/src/WOAPPv2.mxml:165] во flash.events::EventDispatcher/dispatchEventFunction() во flash.events ::EventDispatcher/dispatcheventfunction() во flash.events::EventDispatcher/dispatchEvent() в mx.core::UIComponent/dispatchEvent()[E:dev4.xframeworksprojectsframeworksrcmxcoreUIComponent.as:12528 ] в mx.managers.dragClasses::DragProxy/_dispatchDragEvent()[E:dev4.xframeworksprojectsframeworksrcmxmanagersdragClassesDragProxy.as:374 ] в mx.managers.dragClasses::DragProxy/mouseUpHandler()[E:dev4.xframeworksprojectsframeworksrcmxmanagersdragClassesDragProxy.as:599]
—Пример кода — Это то, что работает
import mx.core.DragSource;
import mx.events.DragEvent;
import mx.managers.DragManager;
private function initiateDrag(event:MouseEvent,value:String):void{
var dragInitiator:Image= event.currentTarget as Image;
var dragSource:DragSource = new DragSource();
dragSource.addData(value, 'value');
DragManager.doDrag(dragInitiator, dragSource, event);
}
private function dragEnterHandler(event:DragEvent):void {
var dropTarget:VBox =event.currentTarget as VBox;
if (event.dragSource.hasFormat('value')) {
DragManager.acceptDragDrop(dropTarget);
}
}
private function dragDropHandler(event:DragEvent):void {
var pageName:String = event.currentTarget.name as String;
var value:String = event.dragSource.dataForFormat('value') as String;
this[pageName].source = "assets/big/" value;
}
<s>
<s:HGroup id="hGr"
requestedColumnCount="2"
variableColumnWidth="false"
columnWidth="475"
height="450"
gap="100"
clipAndEnableScrolling="true" paddingLeft="10" paddingRight="10">
<mx:VBox name="page1"
backgroundColor="#EFEFF0"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
horizontalAlign="center" verticalAlign="middle"
dragEnter="dragEnterHandler(event)"
dragDrop="dragDropHandler(event)"
width="475"
x="0">
<mx:Image id="page1" showBusyCursor="true" width="713" height="692" scaleContent="true" maintainAspectRatio="true" minWidth="713" minHeight="692" scaleX="1" scaleY="1" horizontalAlign="center" verticalAlign="top"/>
</mx:VBox>
</s:HGroup>
Это прерывается, если я делаю это таким образом, создавая контейнеры и изображения во время выполнения
<script>
private function initVars():void {
createSpreads();
}
public function createSpreads():void {
var s:VBox = new VBox();
s.name ="page4";
s.setStyle("backgroundColor","#fe0000");
s.verticalScrollPolicy="off";
s.horizontalScrollPolicy="off";
s.setStyle("horizontalAlign","center");
s.setStyle("verticalAlign","middle");
s.addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
s.addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
s.width= 475;
s.setStyle("x","0");
hGr.addElement(s);
hGrCol4.text = "Vboxname: " s.name "VboxID: " s.id;
var page3:Image = new Image();
page3.id ="page4";
page3.showBusyCursor = true;
page3.width = 713;
page3.height = 692
page3.scaleContent = true;
page3.maintainAspectRatio = true;
page3.minWidth = 713;
page3.minHeight = 692;
page3.scaleX = 1;
page3.scaleY = 1;
page3.source = "assets/big/IMG_7112.jpg";
page3.setStyle("backgroundColor","#ffffff");
page3.setStyle("horizontalAlign","center");
page3.setStyle("verticalAlign","top");
s.addElement(page3);
hGrCol3.text = "Imagename: " page3.name "ImageID: " page3.id;
}
import mx.core.DragSource;
import mx.events.DragEvent;
import mx.managers.DragManager;
private function initiateDrag(event:MouseEvent,value:String):void{
var dragInitiator:Image= event.currentTarget as Image;
var dragSource:DragSource = new DragSource();
dragSource.addData(value, 'value');
DragManager.doDrag(dragInitiator, dragSource, event);
}
private function dragEnterHandler(event:DragEvent):void {
var dropTarget:VBox =event.currentTarget as VBox;
if (event.dragSource.hasFormat('value')) {
DragManager.acceptDragDrop(dropTarget);
}
}
private function dragDropHandler(event:DragEvent):void {
var pageName:String = event.currentTarget.name as String;
var value:String = event.dragSource.dataForFormat('value') as String;
this[pageName].source = "assets/big/" value;
}
</script>
<s>
<s:HGroup id="hGr"
requestedColumnCount="2"
variableColumnWidth="false"
columnWidth="475"
height="450"
gap="100"
clipAndEnableScrolling="true" paddingLeft="10" paddingRight="10">
</s:HGroup>
</s>
Выше без контейнеров в HGroup возвращает ‘свойство page4 не найдено в WOAPPv2 и нет значения по умолчанию’ — мой конечный результат должен быть таким
страница 4.источник = «assets/big/imagename.jpg «;
Я в тупике. Я переосмысливаю это и могу просто создать vboxes, а затем установить триггер для создания изображения и заполнения в samedragDropHandler. Мысли?
Ниже приведено решение — еще раз спасибо alxx. Теперь мне нужно начать делиться своими знаниями с другими людьми здесь.
public function dragDropHandler(event:DragEvent):void {
// Retrieve the Image Name from Drop
var value:String = event.dragSource.dataForFormat('value') as String;
//
event.currentTarget.getChildAt(0).source = "assets/big/" value;
}
Комментарии:
1. Чувак, я не могу найти 165-ю строку в твоем коде! Где это? Кстати, у FB есть отличный отладчик, вы должны им воспользоваться.
2. ХОРОШО, оно должно быть
this[pageName]
. У вашего приложения нет свойства pageName (var pageName не учитывается — свойство будет просматриваться по значению pageName.)3. -1. Вы не можете просто вставить весь свой код и ожидать, что мы отладим его за вас.
4. Приносим извинения. Это первая публикация на доске вопросов и ответов. Я провел свое исследование и не могу понять это. В следующий раз я опубликую только код, в котором ошибка. alxx — спасибо за ваше время. Я попытался создать свойства на основе примеров Adobe. Не могли бы вы, пожалуйста, поделиться ссылкой или пониманием того, как создать свойство для этого? Моей целью было добавить элемент vbox и дочерний элемент image, который разделял имя с идентификатором, и использовать событие для захвата имени currenttarget, являющегося элементом управления изображением — это[pageName] возвращает правильную строку — page4, но вылетает. Должен ли я указывать свойство в объявлениях?
Ответ №1:
… продолжая здесь для правильного форматирования
проблемной строки:
var value:String = event.dragSource.dataForFormat('value') as String;
this[pageName].source = "assets/big/" value;
Моей целью было добавить элемент в vbox и
дочерний образ, который совместно использовал имя с
идентификатор и используйте событие для захвата
имя currenttarget является изображением
управление
Не уверен, правильно ли я это понимаю. Если event.currentTarget — это изображение, которое вам нужно, вы можете просто преобразовать его в Image. Или вам нужно где-то найти другое изображение (сгенерированное в Repeater)?
Обновить
«Я пытаюсь использовать имя VBox в качестве строки для точечной записи для ссылки на изображение внутри него»
Имена DisplayObjects — это только метки, а не ссылки. Если вы думаете, что можете перемещаться по иерархии объектов с именами, подобными именам в JS DOM, то нет, во Flash это делается другим способом. Вы можете получить ссылку на VBox с помощью event.currentTarget
— это более полезно, чем его имя (строка). Вы можете получить изображение внутри него с помощью getChildAt.
Комментарии:
1. event.currentTarget.name возвращает имя Vbox в виде строки и заполняет переменную pageName. Я пытаюсь использовать имя VBox в качестве строки для точечной записи для ссылки на изображение внутри него, которое имеет идентификатор с тем же именем. Это работает, если я создаю контейнеры вручную, но завершается неудачей, если я пытаюсь использовать addElement во время выполнения. Надеюсь, я правильно это объясняю. Я изменю свой код, чтобы показать вам, когда это работает, а когда нет. Еще раз спасибо за ваше время и терпение.
2. Отлично. Теперь это имеет смысл. Спасибо, что прояснили это. Прошлой ночью я потратил около 4 часов на его переработку и нашел решение. Это не так чисто, как нужно. По сути, я создавал новый дочерний элемент и предоставлял ему источник изображения, а затем удалял последнего дочернего элемента. Не очень практично с точки зрения памяти. Я обновил свой приведенный выше код, чтобы отразить решение. Человек… -2 ? Я исследовал и кодировал свой @ $ $ off — я предполагаю, что переход с flash MX и PHP на flex не одобряется. Спасибо alxx — 1 за вас, сэр.
3. Людям просто не нравятся запутанные вопросы с большим количеством кода… Не сдавайтесь, они в любом случае могут быть очень полезны 🙂