مشاهدة النسخة كاملة : الوظيفة eval


الخالد
04 Jul 2002, 06:00 AM
الأخوة الأعزاء ...
السلام عليكم

الحقيقة لا أعرف إن كانت هذه الوظيفة قد شرحت من قبل أو لأ ، على كل حال لقد قرأت عن هذه الوظيفة في كتاب Flsh5 Dynamic Content Studio وأحببت أن أنقلها لكم.

وصف المؤلف هذه الوظيفة بالوصف: eval - a usefull function
والترجمة eval وظيفة مفيدة

الشرح :

لنفرض أن لدينا خمسة موفي كليب : kh1 ; kh2 ; kh3 ; kh4 ; kh5 عبارة عن صور لحيوانات ، ونريد تحريكهم أفقياً وبشكل عشوائي وذلك بالضغط على زر محدد.

في هذه الحالة يجب أن يكون لكل موفي كليب زر يوضع فيه الأكشن التالي :
Clip._x = Math.random()*550

حيث Clip هو اسم الموفي كليب مثل :kh1 أو kh2 ....

550 هو عرض المشروع الذي يتحرك فيه الموفي كليب.

ولكن كيف نحرك كل الموفي كليب بضغطة زر واحدة :

نستخدم الوظيفة eval وعلى فكرة هي اختصار للكلمة evaluates وتعني " تخمينات " فهي وظيفة التخمين
لاحظ المثال التالي والأكشن المقصود ثم اضغط الزر.


width = 550 height = 200


عند الضغط على الزر يتم التكرار خمس مرات وذلك عن طريق الحلقة for وفي كل مرة تنفذ الوظيف الأمر عل موفي معين.

thisClip = eval("kh"+i)

والمعنى هنا أن الدالة في البداية تنفذ على kh1 ثم kh2 ثم kh3 ثم kh4 وأخيراً kh5 حيث i يأخذ القيم من 1 إلى 5 كما جاء في السابق.

أرجو أن أكون قد وفقت في الشرح .

كلاشن كوف
04 Jul 2002, 01:15 PM
يعطيك العافية على الشرح وبارك الله فيك .

قرأت في إحدى المنتديات أن هذه الوظيفة تقوم بالحساب , وهي دقيقة جداً في العمليات الحسابية ( وقد قرأت والله أعلم أنها هي الوظيفة الإفتراضية في العمليات الحسابية المعقدة ) .

بارك الله فيك أخي الخالد ... لا تحرمنا من مشاركاتك .


السلام عليكم

الاسطورة
04 Jul 2002, 05:08 PM
هلا اخوي الخالد
وموضوعك جدا حلو ومفيد
الحقيقه هذا الامر شفت في بعض ملفات فلاش كت
ولكن لم اكن اعرف مامعني هذه الوظيفه
ولكن من شرحك بديت افهم عليك كثير شرح واضح ومفهوم
الله يعطيك العافيه
ولكن
وجدت انه لو استخدمت الامر duplicateMovieClip مع الامر setProperty
فهل نقدر نتوصل الى نفس الطريقه وهذا هو الكود

on (release) {
i = 1;
if (i<5) {
duplicateMovieClip ("_root.kh1", "kh1" add i, i);
setProperty ("kh1" add i, _x, random(550));
i++;
}
}



لانه انا حاليا اتصفح من مقهي ولم اجرب
فاتمنى ان نتحاور في هذا الكود فهل يمكن عمل ذلك

شكرا لك

KingArthur
04 Jul 2002, 07:02 PM
الفونكتسيا eval تأخذ variant وتعيد pointer.
(x as pointer) = eval(y as variant)
أي انك تدخل أي قيمة نصية وستقوم الفونكتسيا بحساب الكائن الذي اسمه كذا ويعيد اليك عنوانه في الذاكرة
مثال
m1._x=500;
هي نفسها
x="m";
y="1";
eval(x+y)._x=500;

أي انه يمكن استخدامه مثل المصفوفات مع أن الفلاش 5 أصبح يدعم المصفوفات بشكل ممتاز

وأرجوا أن أكون قد أفدتكم

كلاشن كوف
04 Jul 2002, 09:20 PM
السلام عليكم

يعطيك العافية أخوي KingArthur , وتسلم يمينك على التوضيح .

الخالد
05 Jul 2002, 02:05 AM
أخي كلاشن كوف
أخي الأسطورة
تحياتي واحترامي لكم وللجميع

وبالمنسبة لتقيب الأخ الأسطورة:
لاحظ أن الوظيفة eval تقلل كود الأكشن المكتوب، وقد تحل مشكلة تبدو أحياناً معقدة أو مستعصية ، ومن هنا جاءت أهميتها كوظيفة أو دالة مفيدة .

شكرا لتفاعلكم الجميل والمفيد.

فاشل بالفلاش
05 Jul 2002, 02:50 AM
هلا فيك اخوي الخالد

تسلم يدينك على الدرس والشرح

ومشكور ما تقصر


تحياتي

الخالد
05 Jul 2002, 03:00 AM
الله يسلمك أخوي / فاشل بالفلاش

الخالد
05 Jul 2002, 05:00 AM
عفواً أخي الأسطورة
بخصوص الحوار :

أولا: تراني يا أخي مبتدأ ولا زلت أتعلم منكم، ولكن مايمنع أن أحاول ، وشكراً على هذا التكريم.

الأخ الحبيب :
الحقيقة أعجبتني فكرتك ولكن إذا كان الهدف هو كود آخر يؤدي نفس الفكرة ، لماذا استخدمت : duplicateMovieClip
كان بالإمكان الوصول لنفس الهدف باستخدام : setProperty فقط مع الحلقة for

انظر المثال :

width = 550 height = 200

KingArthur
05 Jul 2002, 12:01 PM
اخواني
لقد جاءت الفونكتسيا eval من أجل تمكين المصفوفات (وان كان بشكل غير مباشر) في الفلاش 4 ولكن في الفلاش 5 فما فوق فيمكن استخدام المصفوفات بشكل طبيعي كما يستخدم في أي لغة برمجة ويمكن الحصول على النتيجة نفسها أيضاً باستخدام setprority ولكن في الحالات المعقدة من البرمجة قد يحتاج شخص ما الى استخدام eval ولكن أظن أن أغلب الذين يستخدمون الأكشن لن يستخدموا شيء كهذا لأن استعمالهم للاكشن هو فقط لبعض الحركات البسيطة وليس لكتابة برامج مثلما يقومون في الفجوال باسيك أو الفجوال سي++:wer

كلاشن كوف
15 Jul 2002, 05:30 PM
السلام عليكم

شرح موجز ومختصر للوظيفة ;() eval :

تقوم هذه الوظيفة بالحسبات المنطقية ... وقد صمِّمت في برنامج الفلاش أساساً لهذا الغرض . وبعبارة أخرى أنها هي الوظيفة الإفتراضية التي تقوم بجمع قيمتين نصيتين أو أكثر لتظهر قيمة المنطقية الفعلية عند جمعهما والتحامهما .

لا تيأس , فهذا المثال سيوضح لك ما أقصده :


movieClip._x = 550;


a = 'movieClip.' + '_x'; // concatenate - string

propo = eval ('movieClip.' + '_x') // concatenate - value


trace(a) // movieClip._x

trace (propo) // 550


أولاً عندي فيلم movieClip وقيمة خاصيته x_ هي 550 .

ثانياً عندي متغير اسمه a قيمته هي حاصل الجمع بين نصين ( concatenate ) وليس بين قيمتين == يعني " منتدى " + " سفن " يساوي منتدى سفن .

تعالو معي إلى هنا ( هنا خلاصة الموضوع ) :

إن الوظيفة ;() eval لا تعترف بالقيم النصية هذه , فهي تتعمق أكثر وتُخرج لنا ناتج الجمع بين هذه القيمة النصية , فهي تقوم أولاً بدمج هذا التركيب النصي 'movieClip.' + '_x' ليصبح بهذا الشكل movieClip._x ثم تنظر إلى قيمة هذا التركيب لتعيده لنا .


جرب هذا المثال :


a = eval("a" + "b");

trace(a)



ستجمع الوظيفة بينهما ثم ستبحث عن قيمتهما بعد الجمع لكنها ستعود خالية اليدين .

أرجو أن أكون قد وفقت في نقل المعلومة والسلام عليكم