Actionscript - проблема со статическими функциями и элементами интерфейса? - PullRequest
0 голосов
/ 14 января 2011

Я нахожусь немного над моей головой здесь с ООП в ActionScript. У меня есть класс Display, который захватывает видео поток. Я пытаюсь создать набор основных кнопок остановки / записи для управления камерой. Очевидно, я не могу объявить функции, которые обращаются к this или к любым переменным, которые позволили бы мне идентифицировать и остановить клип. Компилятор (я использую Haxe) выдает ошибку:

video/Webcam.hx:96: characters 10-14 : Cannot access this from a static function

Возможно, я подхожу к этому неправильно. Вот некоторый (сокращенный) код:

class Webcam extends Display {

  var nc : flash.net.NetConnection;
  ...

  private function addControls(){
    var stopIcon = new StopIcon();
    var b = new flash.display.MovieClip();      
    b.addChild(stopIcon);
    b.useHandCursor = true;
    b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
      trace(this);
      this.stopStream()
    });
    b.x = 210;
    b.y = 20;
  }

  ...
}

Я использую Haxe для компиляции в AS3. Здесь есть список дельт http://haxe.org/doc/flash/as2_compare, которые, кажется, не охватывают эту проблему, поэтому я считаю, что это проблема, с которой я столкнулся в AS. Возможно, это связано с компилятором, но я надеюсь, что нет, потому что мне действительно очень понравился Haxe.

Как создать элементы пользовательского интерфейса, связанные с экземпляром объекта, если компилятор actionscript обрабатывает эти функции как статические?

Ответы [ 2 ]

2 голосов
/ 15 января 2011

I считаю это связано с использованием анонимной функции в вашем обработчике MouseEvent.CLICK без использования самого события. Обработчик события принимает аргумент, которым является сам MouseEvent. Итак, вам нужно выполнить одно из следующих действий:

b.addEventListener(flash.events.MouseEvent.CLICK, function($evt:MouseEvent) {
    trace($evt.target.parent);
    $evt.target.parent.stopStream();  // May require casting, but probably not
}

OR

b.addEventListener(flash.events.MouseEvent.CLICK, __handleStopClick);

private function __handleStopClick($evt:MouseEvent):void {
    this.stopStream();
}
1 голос
/ 15 января 2011

Другим распространенным способом сделать это является следующее:

private function addControls(){
  ...
  var self = this;
  b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
    self.stopStream()
  });
  ...
}

Преимущество состоит в том, что «self» правильно напечатано и не требует приведения.Мы рассматриваем возможность добавления «this» в качестве области действия по умолчанию в таких случаях, что сделает трюк «self» ненужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...