Frage

ich herausgefunden, wie eine statische Methode zu schaffen, die überall verfügbar ist, zum Beispiel:

UtilLib.as:

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

Das kann ich überall zugreifen, indem UtilLib.getTimeStamp tun () - Nun, ich mag eine neue staic Methode namens Protokoll erstellen (msg: String). Dies sollte eine Nachricht an einen mehrzeiligen Inputfield loggt sein.

Das Problem ist jedoch, dass diese irgendwo Inputfield erstellt werden muß und zugänglich und sichtbar die ganze Zeit, und ich will es nicht durch die Funktionsparameter die ganze Zeit übergeben, da dies eine Menge Ärger verursachen würde (I Würd es durch Objekte passieren müssen aswell ..).

Also, wie kann ich ein „public Textfeld“ so meine statische Methode lügt, um es schreiben?

UPDATE: Ich versuchte nun die folgende Klasse, mit einem statischen Konstruktor (glaube ich). Jedoch ist das Textfield-Objekt nicht angezeigt. Wenn ich eine addChild tun (debugField) nach dem Erstellen, es gibt mir Fehler 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);
        }

    }
}

Ich initialisieren es wie folgt aus:

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

Und ich log eine neue Nachricht wie folgt aus:

Logger.log("test");

Leider ist das Textfeld nicht angezeigt wird.

War es hilfreich?

Lösung

Im Grunde brauchen Sie:

  • irgendwo eine Nachricht zu protokollieren, die global zugänglich ist
  • die Fähigkeit, ein Textfeld zu aktualisieren, wenn die Log-Nachricht ändert

Eine einfache Lösung Objekte mit könnte wie folgt aussehen:

Beispiel

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

Message

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

Das Wichtigste dabei ist, dass eine Nachricht von jedem beliebigen Ort mit protokolliert werden kann

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

und alles kann benachrichtigt werden, wenn eine Nachricht protokolliert wurde mit

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

an einer beliebigen Stelle der aktuellen Nachrichtenprotokoll kann erhalten werden unter Verwendung

MessageLogger.getInstance().getLog();

Andere Tipps

Erstellen Sie eine neue Logging-Klasse und haben diese Klasse einen statischen Konstruktor haben. Fügen Sie Ihre Protokollierungsmethode zu dieser Klasse. Machen Sie den statischen Konstruktor das Protokollierungsfeld in eine private Variable speichern. Nun, bevor Sie die Protokollierungsmethode rufen Sie einfach Ihre statischen Konstruktor mit dem Eingabefeld aufrufen würden Sie verwenden möchten. Dadurch wird die Klasse erstellen, setzen Sie das Eingabefeld als Ziel, und jetzt können Sie einfach nur die Log-Funktion aufrufen, von jedem Ort aus.

Traditionell ist die Art und Weise Sie statische Methoden mit privaten Variablen interagieren lassen, sie in zu übergeben. Der Pass in einen Zeiger auf Ihre Textbox.

so anstelle von

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

Sie haben

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

Die Syntax ist möglicherweise falsch, da ich nicht ein AS Entwickler bin, aber, sehen Sie, was ich meine? Von dort können die Codeblock zugreifen messageBox, als ob es sich um eine lokale Variable waren. Nun, es ist.

(I den Methodennamen für Klarheit umbenannt. Sie auch eine Variable Rückkehr stoppen könnte, wenn es nicht benötigt, aber Sie werden die Erklärung weiter ändern müssen.)

In Ihrem aktualisierten Beitrag des Debug-Textfeld muss irgendwo auf die Anzeigeliste hinzugefügt werden. Im Moment sieht es aus wie es gerade erstellt wird und während dieser Log-Methode verwendet. Sie Anzeigeobjekte auf der Anzeigeliste hinzufügen, indem Aufruf addChild (displayobject: Display): Boolean; auf einem Display, die bereits ein Kind der Bühne ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top