Просмотр полной версии : Удалить объект
motoroller
09.01.2011, 05:09
НЕ получается удалить объект
public function drawSprite():void {
var instance = new (getDefinitionByName("db")); //
this.addChild(instance);
instance.name='db'
instance.addEventListener (MouseEvent.CLICK, deleteImage);
if(data.data.action=='loaded')
this.removeChild(instance)
}
Собственно создается картинка, но если есть параметр loaded картинка должна удаляться, а вот это не происходит, помогите :)
А зачем создавать объект, если можно сначала сделать проверку?
Не удаляется со сцены или из памяти? Если 2е - так, во-первых, нужно отписатсья от слушателя (смотрите про мягкие ссылки), а во-вторых, почитать на тему gc.
motoroller
09.01.2011, 14:45
не удаляется со сцены
А вы уверены, что условие выполняется?
motoroller
09.01.2011, 15:46
Короче совсем замучался странная ситуация: в целом все работает, но наблюдается странная ситуация,
что у меня через cellrender заново отрисовываются картинки, где они отрисовываться не должны.
Собственно cellrender
package com {
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.CellRenderer;
import flash.utils.getDefinitionByName;
import fl.controls.listClasses.ListData;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
public class SecondCellRenderer extends CellRenderer implements ICellRenderer {
private var instance:SimpleButton
public function SecondCellRenderer():void {
super();
this.mouseChildren = true;
}
public function drawSprite():void {
if(data.rowColor=='red') {
var instance = new (getDefinitionByName("db"));
this.addChildAt(instance, 0);
instance.addEventListener (MouseEvent.CLICK, deleteImage);
}
}
private function deleteImage(event:MouseEvent):void {
data.data.action = "delete";
}
override public function set listData(value:ListData):void {
_listData = value;
label = "";
drawSprite();
}
override public function get listData():ListData {
trace(data.data.action);
return _listData;
}
override public function get data():Object {
return _data;
}
override public function set data(value:Object):void {
_data = value;
}
public static function getStyleDefinition():Object {
return CellRenderer.getStyleDefinition();
}
override protected function drawBackground():void {
// set skins
switch (data.rowColor) {
case "green" :
setStyle("upSkin", CellRenderer_upSkinGreen);
setStyle("downSkin", on);
setStyle("overSkin", on);
setStyle("selectedUpSkin", CellRenderer_upSkinGreen);
setStyle("selectedDownSkin", CellRenderer_upSkinGreen);
setStyle("selectedOverSkin", on);
break;
case "red" :
setStyle("upSkin", CellRenderer_upSkinRed);
setStyle("downSkin", on);
setStyle("overSkin", on);
setStyle("selectedUpSkin", CellRenderer_upSkinRed);
setStyle("selectedDownSkin", CellRenderer_upSkinRed);
setStyle("selectedOverSkin", on);
break;
default :
break;
}
super.drawBackground();
}
}
}
Состояние после выбора файлов, но перед загрузкой:
http://www.kapusta-lab.ru/3.png
Потом, нажимаю кнопку выгрузить, они выгружаются и через cellrender цвет строки становятся зелеными ну и при этом заново кнопочка удаления соотвественно не отрисовывается. В этом этапе все работает как часы :-)
http://www.kapusta-lab.ru/2.png
А вот в следующем шаге начинается чехарада: я допустим еще хочу добавить файлов, они добавляются уже красным цветом и опять с кнопкой удалить, тут тот все верно, но теперь еще почему-то у зеленых файлов (уже выгруженных, добавляются опять кнопки удалить) и поверх накладываются иконки не выгруженных файлов ...
http://www.kapusta-lab.ru/1.png
Если кому надо более побробный глаынй класс могу скинуть. Помогите разобраться, уже замучился два дня, а толку ноль.
Подозрения что-то может в этих функциях ...override public function set listData
drawSprite перенесите из set listData в set data.
override public function set data(value:Object):void {
_data = value;
drawSprite();
}
override public function set listData(value:ListData):void {
_listData = value;
label = "";
}
motoroller
09.01.2011, 16:24
К сожалению осталась так же ситуация :(
Что у вас приходит в data.rowColor? Где вы его выставляете?
motoroller
09.01.2011, 16:40
Спасибо Alatar, поменял как вы просили ... и потом еще переменную вынес как
private var instance;
Так что кнопки удаления теперь не появляются:
http://www.kapusta-lab.ru/4.png
data.rowColor рабоает отлично как вы видите на примерах, цвета везде корректные....при выгрузке файлов ...
ставлю его тут после загрузки файла в флеш
dp.addItem({data:dataDP, fileName:[file.name] + " (" +round([file.size])+' MB)', status:'Не выгружено', rowColor:"red", out:""});
как файл выгружен:
dp.getItemAt(numRowUploadedFile).rowColor="green";
Но проблема в другом столбце с наложение осталась ...
привожу кусок другого cellrendera
public class FirstCellRenderer extends CellRenderer implements ICellRenderer {
private var instance;
public function FirstCellRenderer():void {
super();
}
public function drawSprite():void {
if(data.rowColor=='green')
instance = new (getDefinitionByName('rb'));
else if(data.rowColor=='red')
instance = new (getDefinitionByName('addb'));
this.addChild(instance);
}
....
Все ItemRenderer используются повторно (хотя в компонентах flashIDE я не уверен), поэтому перед тем как добавлять новый инстанс кнопки, убедитесь, что удалили старый.
motoroller
09.01.2011, 16:54
Пробовал вот так:
public function drawSprite():void {
if(data.rowColor=='green')
this.addChildAt(rb, 0);
else if(data.rowColor=='red')
this.addChildAt(addb, 0);
}
Ситуация стала еще хуже:
http://kapusta-lab.ru/5.png
Добавлено через 5 минут
Сделал вот так:
public function drawSprite():void {
if(data.rowColor=='green')
instance= new (getDefinitionByName('addb'));
else if(data.rowColor=='red')
instance= new (getDefinitionByName('rb'));
this.addChildAt(instance, 0);
}
http://kapusta-lab.ru/6.png
Все стало как при загрузке файла, что можно сделать вывод что data.rowColo неадекватный?
А тогда почему все-таки цвета проставляются верно?
public function drawSprite():void {
if (instance)
removeChild(instance);
if(data.rowColor=='green')
instance= new (getDefinitionByName('addb'));
else if(data.rowColor=='red')
i nstance= new (getDefinitionByName('rb'));
this.addChildAt(instance, 0);
}
motoroller
09.01.2011, 17:06
Спасибо огромное все заработало :)
Добавлено через 49 секунд
Кому надо вот рабочий класс ... с загрузкой картинок в datagrid
package com {
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.CellRenderer;
import flash.utils.getDefinitionByName;
import fl.controls.listClasses.ListData;
public class FirstCellRenderer extends CellRenderer implements ICellRenderer {
private var instance;
public function FirstCellRenderer():void {
super();
}
public function drawSprite():void {
if (instance) removeChild(instance);
if(data.rowColor=='green')
instance= new (getDefinitionByName('rb'));
else if(data.rowColor=='red')
instance= new (getDefinitionByName('addb'));
addChild(instance);
}
override public function set listData(value:ListData):void {
_listData = value;
label = "";
}
override public function get listData():ListData {
return _listData;
}
override public function get data():Object {
return _data;
}
override public function set data(value:Object):void {
_data = value;
drawSprite();
}
public static function getStyleDefinition():Object {
return CellRenderer.getStyleDefinition();
}
override protected function drawBackground():void {
// set skins
switch (data.rowColor) {
case "green" :
setStyle("upSkin", CellRenderer_upSkinGreen);
setStyle("downSkin", on);
setStyle("overSkin", on);
setStyle("selectedUpSkin", CellRenderer_upSkinGreen);
setStyle("selectedDownSkin", CellRenderer_upSkinGreen);
setStyle("selectedOverSkin", on);
break;
case "red" :
setStyle("upSkin", CellRenderer_upSkinRed);
setStyle("downSkin", on);
setStyle("overSkin", on);
setStyle("selectedUpSkin", CellRenderer_upSkinRed);
setStyle("selectedDownSkin", CellRenderer_upSkinRed);
setStyle("selectedOverSkin", on);
break;
default :
break;
}
super.drawBackground();
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.