Pergunta

Eu descobri como criar um método estático que está disponível em todos os lugares, por exemplo:

UtilLib.as:

package
{   
     public final class UtilLib
     {  
          public static function getTimeStamp():uint
          {
               var now:Date = new Date();
               return now.getTime();
          }
     }
}

I pode acessar esta em todos os lugares, fazendo UtilLib.getTimeStamp () - Agora, eu quero criar um novo método staic chamado log (msg: String). Isso deve registrar uma mensagem a um inputField multi-line.

O problema, porém, é que esta inputField deve ser criado em algum lugar e deve ser acessível e visível o tempo todo, e eu não quero passá-lo através dos parâmetros da função o tempo todo, pois isso poderia causar um monte de problemas (I 'd tem que passá-lo através de objetos nele assim ..).

Então, como posso fazer uma "textfield pública" para o meu método log estática pode escrever para ele?

UPDATE: Agora eu tentei o seguinte classe, com um construtor estático (eu acho). No entanto, o objeto campo de texto não está mostrando. Quando eu faço um addChild (debugField) depois de criá-la, dá-me erro 1180.

Logger.as

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldType;

    public class Logger extends Sprite
    {
        public static var debugField:TextField;

        /* static block */
        {
            trace("Logger initializing.");
            debugField = new TextField();
            debugField.width = 500;
            debugField.height = 100;
            debugField.x = 100;
            debugField.y = 400;
            debugField.background = true;
            debugField.backgroundColor = 0xFFFFFF;
            debugField.defaultTextFormat = new CustomTextFormat();
            debugField.mouseWheelEnabled = true;
            debugField.multiline = true;
            debugField.type = TextFieldType.DYNAMIC;
        }

        public static function log(msg:String):void
        {
            if (debugField) debugField.appendText(msg);
        }

    }
}

Eu inicialize-o assim:

var test:Logger = new Logger();
addChild(test);

E eu registrar uma nova mensagem como esta:

Logger.log("test");

Infelizmente, o textField não está mostrando.

Foi útil?

Solução

Essencialmente, você precisa:

  • um lugar para registrar uma mensagem que é globalmente acessível
  • a capacidade de atualizar um campo de texto sempre que as alterações de mensagens de log

Uma solução simples usando objetos poderia ser assim:

Exemplo

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.Event;

    public class Example extends Sprite {
        private var messageLog:TextField;

        public function Example() {
            createTextField();
            MessageLogger.getInstance().addEventListener( MessageLogger.LOG, handleMessageLoggerUpdate );
            MessageLogger.getInstance().log( "Message!" );
        }

        private function handleMessageLoggerUpdate( event:Event ):void {
            messageLog.text = MessageLogger.getInstance().getLog();
        }

        private function createTextField():void {
            messageLog = new TextField();
            addChild( messageLog );
        }
    }
}

MessageLogger

package {
    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class MessageLogger extends EventDispatcher {
        private static var instance:MessageLogger;
        public static function getInstance():MessageLogger {
            if ( !instance ) {
                instance = new MessageLogger( new InstanceKey() );
            }
            return instance;
        }

        public static var LOG:String = "MessageLoader#log";

        private var messageLog:String;

        public function MessageLogger(key:InstanceKey) {
            messageLog = "";
        }

        public function log( message:String ):void {
            messageLog += message;
            notify();
        }

        public function getLog():String {
            return messageLog;
        }

        private function notify():void {
            dispatchEvent( new Event( LOG ) );
        }
    }
}
class InstanceKey {}

O importante aqui é que uma mensagem pode ser registrada em qualquer lugar usando

MessageLogger.getInstance().log( "Your Message Here" );

e tudo pode ser notificado quando uma mensagem foi registado usando

MessageLogger.getInstance().addEventListener( MessageLogger.LOG, listenerFunction );

em qualquer ponto do log mensagem atual pode ser obtido usando

MessageLogger.getInstance().getLog();

Outras dicas

Crie uma nova classe de registo e ter essa classe tem um construtor estático. Adicione o seu método de registro para esta classe. Faça o construtor estático salvar o campo de registro para uma variável privada. Agora, antes de chamar o método de registro apenas chamar seu construtor estático com o campo de entrada que você gostaria de uso. Isto irá criar a classe, configure o campo de entrada como o destino, e agora você pode simplesmente chamar a função log de qualquer lugar.

Tradicionalmente, a maneira como você deixe métodos estáticos interagir com variáveis ??privadas é passar-los. Passe em um ponteiro para a sua caixa de texto.

então ao invés de

public static function getTimeStamp():uint { ... }

Você

public static function writeTimeStamp(messageBox):uint { ... }

A sintaxe pode estar incorreta, como eu não sou um dev AS mas, você vê o que eu quero dizer? A partir daí, esse bloco de acesso código pode messageBox como se fosse uma variável local. Pois é.

(I renomeado o nome do método para maior clareza. Você até poderia impedi-lo de retornar uma variável se não precisa, mas você precisa de mudar mais a declaração.)

Em seu post atualizou os depuração necessidades campo de texto para ser adicionado à lista de exibição em algum lugar. Agora parece que é apenas criado e usado durante esse método de log. Você pode adicionar objetos de exibição à lista de exibição chamando addChild (DisplayObject: DisplayObject): Boolean; em um DisplayObjectContainer que já é um filho de palco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top