2009-06-28 11 views
0

私は、たとえば、どこでも利用できる静的メソッドを作成する方法を考え出し:パブリック静的ロギングメソッドを入力フィールドに書き込む方法を教えてください。

UtilLib.as:

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

を私はUtilLib.getTimeStamp()を実行してどこでもこれをアクセスすることができます - 今、私はlog(msg:String)という新しいステイックメソッドを作成します。これは、複数行の入力フィールドにメッセージを記録する必要があります。

しかし、この入力フィールドはいつもどこかに作成しなければならず、常にアクセス可能で表示可能でなければならず、これは関数のパラメータを常に通過させたくないため、多くの問題が発生します私はオブジェクトを介して渡す必要がありますも..)。

私は静的なログメソッドがそれに書き込むことができるように "public 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"); 

残念ながら、textFieldは表示されません。

答えて

2

基本的にあなたが必要とする:

  • をどこかにログメッセージは、オブジェクトを可能性が使用して簡単な解決策

を変更するたびにテキストフィールドを更新する機能

  • グローバルにアクセス可能であるというメッセージをログに記録します次のようになります。

    ここ

    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(); 
    
  • +0

    私は分かりません。作成したテキストフィールドをどこにでもアクセス可能にすることは何ですか? – Tom

    +2

    テキストフィールドはどこにでもアクセスすることはできませんが、メッセージロガーはです。メッセージロガーは、メッセージがログに記録されたときにイベントを送出します。だからどこでも、メッセージ・ログをテキスト・フィールドに表示するだけで、メッセージ・ログを通知して表示することができます。 – michaelavila

    +0

    私はすべてのオブジェクトのテキストフィールドを再作成したくないので、適合しません。 – Tom

    0

    伝統的に、静的メソッドをプライベート変数とやりとりさせる方法は、それらを渡すことです。テキストボックスへのポインタを渡します。

    私はAS devのではないんだけど、あなたは私が何を意味するか見ていますように、あなたが

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

    を持っている代わりに

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

    の構文が正しくない可能性がありますか?そこから、そのコードブロックはローカル変数であるかのようにmessageBoxにアクセスできます。そうです。

    (私はそれが必要ない場合でも、変数を返す、それを止めることができます。明確にするためのメソッド名の名前を変更していますが、さらに宣言を変更する必要があります。)

    +0

    残念ながら、テキストフィールドをパラメータに渡すと、私が作成するすべての新しいオブジェクトでこのテキストフィールドを引数として渡す必要があるため、実際には不快になります。 – Tom

    1

    新しいロギングクラスを作成し、そのクラスに静的なコンストラクタがあるようにしてください。このクラスにロギングメソッドを追加します。静的コンストラクターに、ログフィールドをプライベート変数に保存させます。これで、ロギングメソッドを呼び出す前に、使用したい入力フィールドを持つ静的コンストラクタを呼び出してください。これにより、クラスが作成され、入力フィールドが宛先として設定されます。これで、どこからでも簡単にログ関数を呼び出すことができます。

    +0

    コンストラクタを静的にしようとすると、エラー1026が発生します。 – Tom

    0

    更新された投稿では、デバッグテキストフィールドを表示リストのどこかに追加する必要があります。今は、それが作成され、そのログメソッドで使用されたように見えます。表示リストに表示オブジェクトを追加するには、addChild(displayObject:DisplayObject):Boolean;を呼び出します。既にステージの子であるDisplayObjectContainerに追加します。

    +0

    私は知っています。私は自分自身から引用します: "addChild(debugField)を作成した後、エラー1180が表示されます。 – Tom

    +0

    どこからaddChildを呼び出していますか? addChildはDisplayObjectContainerのメソッドです。静的ログメソッドから呼び出す場合は、おそらく定義されていないメソッドエラーが発生する可能性があります。すでにステージの子であるものは、Loggerクラスの外からaddChild debugFieldを持たなければなりません。 – michaelavila

    関連する問題