Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Flash > Команда кнопок и один обработчик


Автор: BISON* 5.12.2005, 18:31
Дано
создал команду кнопок при помощи attachMovie
Вопрос
Как сделать чтобы при нажати на любую из кнопок, вызывался один обработчик, где в нем я мог бы получить имя вызвавшей кнопки?

Автор: MOHCTEP 6.12.2005, 00:09
Через ссылку, при аттаче. Ну примерно так:

// аттачим 10 кнопок
for(var i=0;i<10;i++){
var mc=this.attachMovie("linkage_name", "new_name"+i,getNextHighestDepth());
mc.onPress=oops(this)
}
function oops(mc){
trace(mc._name);
}

Автор: AlDev 6.12.2005, 07:04
вариант 1-й:

прописать в кнопке, которую аттачишь:
Код

this.onRelease = function()
{
}


вариант 2-й:
сделать наследование от MovieClip и приписать класс
Код

class myButton extends MovieClip
{
  private function onRelease():Void
  {
    //your code here
  }
}

и приписываешь as2 class для всех кнопок в библиотеке килбо извращаешься с registerClass

вариант 3-й (как написал некто MOHCTEP, только с небольшой вариацией)
функцию можно объявить таким образом:
Код

var my_f:Function = function():Void
{
  trace (this);
}
var b_1:MovieClip = this['button_instance_name'];
b_1.onRelease = my_f;

this в данном случае будет в коде функции ссылаться на b_1.

ну и ещё один вариант (из разряда маловероятного smile ), который для ActionScript 3
Код

package 
{
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.display.Shape;
    import flash.events.MouseEvent;
    import flash.events.MouseEventType;
    import flash.util.trace;
    
    public class myApp extends Sprite
    {
        protected var b:myButton;
        public function myApp() 
        {
            this.b = new myButton();
            this.b.x = 60;
            this.b.y = 10;
            this.b.addEventListener(MouseEventType.CLICK,this.onButtonClick);
            this.addChild(this.b);
        }
        
        private function onButtonClick(evnt:MouseEvent):Void
        {
            trace ('onRelease called');
        }
    }
    
    private class myButton extends SimpleButton
    {
        protected var downSprite:Shape;
        protected var upSprite:Shape;
            
        public function myButton()
        {
            this.downSprite = new Shape();
            this.downSprite.graphics.lineStyle(2, 0x202020);
            this.downSprite.graphics.beginFill(0x00FF00);
            this.downSprite.graphics.drawRect(10, 10, 50, 50);
             
            this.upSprite = new Shape();
            this.upSprite.graphics.lineStyle(2, 0x202020);
            this.upSprite.graphics.beginFill(0xFFFF00);
            this.upSprite.graphics.drawRect(10, 10, 50, 50);
            
            this.upState = upSprite;
            this.overState = upSprite;
            this.downState = downSprite;
            this.useHandCursor = true;
            this.hitTestState = this;
        }
    }
}

Автор: BISON* 7.12.2005, 08:02
MOHCTEP и Alex Batsuev
Благодарю за советы, они очень помогли!!!!!! smile
Alex Batsuev
я воспользовался 3 вариантом, он очень хорошо подходит для моей реализации!!!! Все получилось!!!

Автор: BISON* 12.12.2005, 13:51
Возникла такая проблема,что внутри обработчика onLoad, присваивая функцию для события клика по кнопке, это событие не отрабатывается, но кнопки рисуются, а вот кнопки добавленные с символа bt1, все ОК... рисуются и обрабатывают событие замечетельно!!!!
Вообщем парадокс да и только! уперся в эту проблему, теперь думаю ее разрешить!!
DataGeo -это классы в которых все ОК!!

Код

var i=0;
var a,b,c,d,strn,num,n;
var data:Array=new Array();
var data1:Array=new Array();
var q:LoadVars=new LoadVars();
System.useCodepage=true;
function fbtn():Void {
    strn=this._name;
    a=strn.split("n");
    num = parseInt(a[1]);
    tf.htmlText = data[num].name;
    trace("addsdsd");
}


q.onLoad=function(success:Boolean) {
    if (success) {
        n=parseInt(q.count)-1;
        for (i=0;i<=n;i++) {
            attachMovie("bt","bn"+i,getNextHighestDepth());
            a=q["k1"+i].split(",");
            setProperty("bn"+i, _x, i*30);
            setProperty("bn"+i, _y, 100);
            this["bn"+i].onRelease=fbtn;
            b=q["k2"+i].split(",");
            c=q["tf1"+i].split(",");
            d=q["tf2"+i].split(",");
            data[i]=new DataGeo1(q["cid"+i],q["content"+i],q["name"+i],a[0],a[1],b[0],b[1],c[0],c[1],c[2],c[3],d[0],d[1]);
            trace(data[i].cid+"/"+data[i].name);
        }
    } else {
        trace("Error loading/parsing LoadVars.");
    }
}
q.load("http://.....", q, "GET");
//---
for(i=0;i<=10;i++){
    attachMovie("bt1","btn"+i,getNextHighestDepth());
    setProperty("btn"+i,_x,i*30);
    setProperty("btn"+i,_y,30);
    data1[i]=new DataGeo("nameCity"+i,i);
    this["btn"+i].onRelease=fbtn;
}


Буду рад любым предположениям, почему это не работает!!

Автор: BISON* 14.12.2005, 08:52
Мне удалось разрешить эту проблему, сделав что после прохода цикла я вызываю функцию, которая всем приатаченым кнопкам присваивает обработчик события!!!!!
но все таки непонятно, почему внутри того цикла не присваивалась функция обработки? (это так и осталось тайной smile )

Автор: AlDev 14.12.2005, 12:09
Цитата
.onLoad=function(success:Boolean) {
    if (success) {
        n=parseInt(q.count)-1;
        for (i=0;i<=n;i++) {
            attachMovie(


удивительно, что это вообще работало.
q - объект класса loadVars. ты перегружаешь метод этого класса, следовательно ссылка на this будет ссылкой на q. А потом ты используешь методы MovieClip. не указывая ни пути, ни чего-либо ещё. Как это вообще могло работать?
и вообще много замечаний по коду. например зачем объявлять переменные в movieClip-е если они используются только в методе?

Код

System.useCodepage=true;

var q:LoadVars=new LoadVars();
var ths:MovieClip = this;

function fbtn():Void 
{
    trace ('onRelease called for '+this);
}
q.onLoad=function(success:Boolean) :Void
{
    if (success) 
    {
        var n:Number = parseInt(this.count)-1;
        var i:Number;
        var tmp_mc:MovieClip;
        for (i=0;i<=n;i++) 
        {
            tmp_mc = ths.attachMovie("bt","bn"+i,ths.getNextHighestDepth());
            tmp_mc._x = i*30;
            tmp_mc._y = 100;
            tmp_mc.onRelease = fbtn;
        }
    } else 
    {
        trace("Error loading/parsing LoadVars.");
    }
}
q.load("http://.....", q, "GET");

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)