كيف أجعل طريقة التسجيل الثابتة العامة الخاصة بي تكتب في حقل الإدخال؟

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() - الآن، أريد إنشاء طريقة ثابتة جديدة تسمى log(msg:String).يجب أن يقوم هذا بتسجيل رسالة إلى حقل إدخال متعدد الأسطر.

ومع ذلك، تكمن المشكلة في أنه يجب إنشاء حقل الإدخال هذا في مكان ما ويجب أن يكون متاحًا ومرئيًا طوال الوقت، ولا أريد تمريره عبر معلمات الوظيفة طوال الوقت لأن هذا قد يسبب الكثير من المتاعب (كنت سأفعل ذلك لتمريرها من خلال الأشياء أيضًا..).

إذًا، كيف يمكنني إنشاء "حقل نصي عام" حتى تتمكن طريقة السجل الثابت الخاصة بي من الكتابة فيه؟

تحديث:لقد جربت الآن الفصل التالي باستخدام مُنشئ ثابت (على ما أظن).ومع ذلك، لا يظهر كائن textfield.عندما أقوم بعمل addChild(debugField) بعد إنشائه، فإنه يعطيني الخطأ 1180.

المسجل.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();

نصائح أخرى

أنشئ فئة تسجيل جديدة واجعل هذه الفئة تحتوي على مُنشئ ثابت.أضف طريقة التسجيل الخاصة بك إلى هذا الفصل.اجعل المُنشئ الثابت يحفظ حقل التسجيل في متغير خاص.الآن قبل استدعاء طريقة التسجيل، ما عليك سوى الاتصال بالمنشئ الثابت الخاص بك باستخدام حقل الإدخال الذي ترغب في استخدامه.سيؤدي هذا إلى إنشاء الفصل، وإعداد حقل الإدخال كوجهة، والآن يمكنك ببساطة استدعاء وظيفة السجل من أي مكان.

تقليديًا، الطريقة التي تسمح بها للطرق الثابتة بالتفاعل مع المتغيرات الخاصة هي تمريرها.قم بتمرير المؤشر إلى مربع النص الخاص بك.

لذلك بدلا من

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

لديك

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

قد يكون بناء الجملة غير صحيح لأنني لست مطورًا AS، لكن هل تفهم ما أعنيه؟ومن هناك، يمكن الوصول إلى تلك الكتلة من التعليمات البرمجية messageBox كما لو كان متغيرا محليا.حسنا هي كذلك.

(لقد قمت بإعادة تسمية اسم الطريقة من أجل الوضوح.يمكنك حتى إيقافه عن إرجاع متغير إذا لم يكن بحاجة إلى ذلك ولكنك ستحتاج إلى تغيير الإعلان بشكل أكبر.)

في مشاركتك المحدثة، يجب إضافة حقل نص التصحيح إلى قائمة العرض في مكان ما.يبدو الآن أنه تم إنشاؤه واستخدامه للتو أثناء طريقة السجل هذه.يمكنك إضافة كائنات العرض إلى قائمة العرض عن طريق استدعاء addChild(displayObject:DisplayObject ):Boolean;على DisplayObjectContainer الذي يعد بالفعل طفلاً للمرحلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top