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

StackOverflow https://stackoverflow.com/questions/1055593

Вопрос

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

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).Это должно записать сообщение в многострочное поле ввода.

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

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

Обновить: Теперь я попробовал следующий класс со статическим конструктором (я думаю).Однако объект textfield не отображается.Когда я создаю 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");

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

Это было полезно?

Решение

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

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

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

Пример

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 );
        }
    }
}

Мессенджелоггер

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();

Другие советы

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

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

так что вместо

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

у вас есть

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top