Как сделать так, чтобы мой публичный метод статического ведения журнала записывал данные в поле ввода? - PullRequest
0 голосов
/ 28 июня 2009

Я понял, как создать статический метод, доступный везде, например:

UtilLib.as:

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

Я могу получить доступ к этому везде, выполнив UtilLib.getTimeStamp () - Теперь я хочу создать новый метод staic с именем log (msg: String). Это должно записать сообщение в многострочное поле ввода.

Проблема, однако, заключается в том, что это поле ввода должно быть создано где-то и должно быть доступно и постоянно отображаться, и я не хочу постоянно передавать его через параметры функции, так как это вызовет много проблем пришлось бы пропустить это через объекты, а также ..).

Итак, как мне сделать "публичное текстовое поле", чтобы мой метод статического журнала мог писать в него?

UPDATE: Я сейчас попробовал следующий класс со статическим конструктором (я думаю). Однако объект текстового поля не отображается. Когда я делаю addChild (debugField) после его создания, он выдает мне ошибку 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);
        }

    }
}

Я инициализирую это так:

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

И я записываю новое сообщение так:

Logger.log("test");

К сожалению, textField не отображается.

Ответы [ 4 ]

2 голосов
/ 29 июня 2009

По сути вам нужно:

  • где-нибудь для регистрации сообщения, которое доступно по всему миру
  • возможность обновления текстового поля при каждом изменении сообщения журнала

Простое решение с использованием объектов может выглядеть так:

Пример

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 {}

Здесь важно то, что сообщение может быть зарегистрировано из любого места, используя

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

и о чем угодно можно уведомить, когда сообщение было зарегистрировано, используя

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

в любой момент текущий журнал сообщений может быть получен с помощью

MessageLogger.getInstance().getLog();
1 голос
/ 29 июня 2009

Создайте новый класс Logging, и у этого класса будет статический конструктор. Добавьте ваш метод регистрации в этот класс. Заставьте статический конструктор сохранить поле регистрации в приватную переменную. Теперь, прежде чем вызывать метод регистрации, просто вызовите статический конструктор с полем ввода, которое вы хотите использовать. Это создаст класс, настроит поле ввода как место назначения, и теперь вы можете просто вызвать функцию log из любого места.

0 голосов
/ 29 июня 2009

В вашем обновленном сообщении текстовое поле отладки нужно где-то добавить в список отображения. Прямо сейчас это выглядит так, как будто оно просто создано и используется во время этого метода журнала. Вы добавляете экранные объекты в список отображения, вызывая addChild (displayObject: DisplayObject): Boolean; на DisplayObjectContainer, который уже является дочерним по отношению к stage.

0 голосов
/ 29 июня 2009

Традиционно способ, с помощью которого статические методы взаимодействуют с закрытыми переменными, заключается в их передаче. Передача указателя на текстовое поле.

так вместо

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

у вас есть

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

Синтаксис может быть неправильным, так как я не являюсь разработчиком AS, но вы понимаете, о чем я? Оттуда этот блок кода может получить доступ к messageBox, как если бы он был локальной переменной. Ну, это так.

(Я переименовал имя метода для ясности. Вы могли бы даже остановить его, возвращая переменную, если это не нужно, но вам нужно будет изменить объявление дальше.)

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