Comment faire en sorte que ma méthode de journalisation statique publique écrive dans un champ de saisie?

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

Question

J'ai compris comment créer une méthode statique disponible partout, par exemple:

UtilLib.as:

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

Je peux accéder à cela partout en faisant UtilLib.getTimeStamp () - Maintenant, je veux créer une nouvelle méthode staic appelée log (msg: String). Cela devrait consigner un message dans un champ de saisie multiligne.

Cependant, le problème est que ce champ de saisie doit être créé quelque part, qu'il doit être accessible et visible tout le temps, et que je ne souhaite pas le passer constamment dans les paramètres de la fonction, car cela poserait beaucoup de problèmes ( Je devrais aussi passer à travers des objets ..).

Alors, comment puis-je créer un " champ de texte public & "; alors ma méthode de journal statique peut écrire?

MISE À JOUR: J'ai maintenant essayé la classe suivante, avec un constructeur statique (je pense). Cependant, l'objet textfield n'est pas affiché. Lorsque je crée un addChild (debugField) après l'avoir créé, l'erreur 1180 s'affiche.

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

    }
}

Je l'initialise comme ceci:

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

Et je me connecte un nouveau message comme ceci:

Logger.log("test");

Malheureusement, le champ textField n'est pas affiché.

Était-ce utile?

La solution

Il vous faut essentiellement:

  • quelque part pour enregistrer un message accessible de manière globale
  • possibilité de mettre à jour un champ de texte chaque fois que le message du journal est modifié

Une solution simple utilisant des objets pourrait ressembler à ceci:

Exemple

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

L'important ici est qu'un message puisse être enregistré depuis n'importe où en utilisant

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

et tout ce qui peut être notifié lorsqu'un message a été enregistré avec

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

à tout moment, le journal des messages actuel peut être obtenu à l'aide de

MessageLogger.getInstance().getLog();

Autres conseils

Créez une nouvelle classe de journalisation et attribuez-lui un constructeur statique. Ajoutez votre méthode de journalisation à cette classe. Faites en sorte que le constructeur statique enregistre le champ de journalisation dans une variable privée. Maintenant, avant d'appeler la méthode de journalisation, appelez simplement votre constructeur statique avec le champ de saisie que vous souhaitez utiliser. Cela créera la classe, configurera le champ de saisie comme destination et vous pourrez désormais appeler la fonction de journal de n’importe où.

Traditionnellement, vous laissez les méthodes statiques interagir avec des variables privées pour les transmettre. Transmettez un pointeur sur votre zone de texte.

donc au lieu de

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

vous avez

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

La syntaxe est peut-être incorrecte car je ne suis pas un développeur AS mais voyez-vous ce que je veux dire? À partir de là, ce bloc de code peut accéder à messageBox comme s'il s'agissait d'une variable locale. Et bien ça l'est.

(J'ai renommé le nom de la méthode pour plus de clarté. Vous pouvez même l'empêcher de renvoyer une variable si elle n'en a pas besoin, mais vous devrez modifier la déclaration davantage.)

Dans votre message mis à jour, le champ de texte de débogage doit être ajouté quelque part à la liste d'affichage. À l'heure actuelle, il semble qu'il soit simplement créé et utilisé lors de cette méthode de journalisation. Vous ajoutez des objets d'affichage à la liste d'affichage en appelant addChild (displayObject: DisplayObject): Boolean; sur un DisplayObjectContainer qui est déjà un enfant de stage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top