المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس السابع : التنقل في ملف الميديا - دورة CSharp 2005


khaledbelal
03-22-2010, 03:37 PM
الدرس السابع


التنقل في الملف

ملف الصوت أو الفيديو يحتوي على خاصية طول الملف أي أن كل ملف له طول زمني

ويتم قياس الطول في مشغلات ميكروسوفت بالثانية , وفي مشغلات rm بالملي ثانية

يتم إيجاد طول الملف من خلال الخاصية Duration في مشغلات ميكروسوفت

أو الخاصية GetLength في مشغلات rm

مثلا التعليمة التالية :

ap.Duration;

ستنتج رقم يحدد طول الملف بالثواني مثلاُ إذا أنتجت رقم 100 يعني هذا أن طول الملف 100 ثانية

أم التعليمة التالية:


rp.GetLength();

فهي تنتج رقم يحدد طول الملف بالملي ثانية مثلاً إذا أنتجت 50000 يعني أن طول الملف 50 ثانية

إذاً هناك فرق كبير بين قيمة طول الملف في مشغلات ميكروسوفت ومشغلات rm

من أهم الوظائف لأي مشغل ميديا هو إمكانية التنقل عبر الملف سوءاً تقديماً أو تأخيراً

ويتم التنقل عبر الملف من خلال تعديل خاصية من خصائص كائن التشغيل

الخاصية ترجع قيمة تحتوي على رقم يمثل موقع التشغيل الحالي

مثلاً إذا أرجعت الخاصية الرقم 50 في مشغل ميكروسوفت فهذا يعني أن تشغيل الملف وصل إلى الثانية رقم 50

أما إذا أرجعت 40000 في مشغلات rm فهذا يعني أن تشغيل الملف وصل إلى الثانية رقم 40

الخاصية في مشغلات ميكروسوفت هي CurrentPosition سواءاً لقراءة القمية أو لتعديلها

فمثلاً التعليمة التالية:


ap.CurrentPosition;

ترجع رقم يمثل رقم الثانية الذي وصل إليها التشغيل , فمثلاً لو كان طول الملف 100 ثانية

وأرجعت الرقم 50 فهذا يعني أن تشغيل الملف وصل إلى المنتصف

أما التعليمة التالية:

ap.CurrentPosition=60;

هذه التعليمة تقوم بنقل التشغيل إلى الثانية رقم 60 , أي أن التشغيل يقفز من موقعه إلى الثانية رقم 60

وفي مشغلات rm هي GetPosition لقراءة القمية أو SetPosition لتعديل القيمة

فمثلاً التعليمة :

rp.GetPosition();

ترجع رقم يمثل رقم الملي ثانية الذي وصل إليها التشغيل فمثلاُ إذا كان طول الملف 10000 ملي ثانية

وأرجعت الرقم 5000 فهذا يعني أن التشغيل وصل إلى الثانية رقم 5 اي إلى منتصف الملف

أما التعليمة التالية:

rp.SetPosition(60000);

هذه التعليمة تقوم بنقل التشغيل إلى الثانية رقم 60 , لاحظ أن جميع تعاملات مشغل rm تكون بالملي ثانية

وليست بالثانية كما في مشغلات ميكروسوفت , والثانية الواحد = 1000 ملي ثانية

إذاً التنقل عبر الملف يتم من خلال تعديل خاصية موقع التشغيل

الموقت Timer

المؤقت هو عبارة عن كائن لضبط الوقت , ويستخدم لتكرار حدث معين خلال فترة زمنية محددة

مثلاً إظهار رسالة كل 50 ثانية , أو تنفيذ كود معين كل 10 ثوان

http://absba7.absba.org/teamwork8/455943/53.jpg

يتم تحديد طول الفترة الزمنية من خلال تعديل الخاصية "الصفة" Interval

حيث أن هذه الخاصية تأخذ الزمن بالملي ثانية أي أنه إذا أردنا أن تكون الفتره ثانية واحدة

فإن الخاصية Interval يجب ان تكون قيمتها 1000 , وإذا أردنا ثانيتين تكون 2000

ويتم كتابة الكود المراد تنفيذه من خلال الضغط مزدوجاً على المؤقت

في هذا الدرس سنستخدم الموقت ليفحص موقع تشغيل الملف كل ثانية

التطبيق

إفتح تطبيق الدرس السابق , وأضف زرين للتقديم والتأخير

أضف مؤقت Timer , ستلاحظ انه سيضاف إلى الشريط الأصفر تحت نافذة التصميم

http://absba7.absba.org/teamwork8/455943/54.jpg

إختر المؤقت وقم بتعديل خاصية Interval إلى 1000 ,"ثانية واحدة"

وعدل قيمة الخاصية Enabled إلى True , هذه الخاصية تقوم بتشغيل أو تعطيل عمل الموقت

فإذا كانت القمية True فالمؤقت مفعل , أما إذا كانت False فهو معطل ولن يعمل

http://absba7.absba.org/teamwork8/455943/55.jpg

أضف كائن التنقل TrackBar ليستخدم كأداة تنقل عبر الملف

http://absba7.absba.org/teamwork8/455943/56.jpg

إختر كائن التنقل و عدل الخاصية TickFrequency إلى 0 لكي تختفي خطول القياس

وعدل الخاصية TickStyle إلى Both إذا أردت

http://absba7.absba.org/teamwork8/455943/57.jpg

كائن التنقل يرجع قيمة بين الخاصيتين Minimum و Maximum

فمثلاً إذا كان Minimum = 0 و Maximum=50 فإن الخاصية Value سترجع قيمة بين 0 و 50

تمثل مكان المؤشر بالنسبة للكائن فمثلاً إذا كان المؤشر في منتصف الكائن فإن Value سترجع الرقم 25

وبما اننا نحتاج للتنقل عبر الملف فالمفروض أن نعدل الخاصية Minimum إلى 0

ونعدل الخاصية Maximum إلى طول الملف حتى ترجع القمية Value رقم بين 0 وطول الملف

وبما أن طول كل ملف يختلف عن الملف الآخر , فإننا سنعدل الخاصية Maximum عند تحميل أي ملف

ولن نحتاج لتعديل الخاصية Minimum لأن قيمتها الإفتراضية هي 0

سيصبح شكل النافذه هكذا:

http://absba7.absba.org/teamwork8/455943/58.jpg

إجراء ضبط كائن التنقل

إنقل هذا الكود إلى شفرة البرنامج مع مراعات أن يكون خارج أي إجراء آخر

void SetTrackBar()
{
if (type=="V")
{
trackBar1.Maximum=Convert.ToInt32(vp.Duration);
}
else if (type=="A")
{
trackBar1.Maximum=Convert.ToInt32(ap.Duration);
}
else if (type=="R")
{
trackBar1.Maximum=Convert.ToInt32(rp.GetLength());
}
}

إسم الإجراء هو SetTrackBar ونقوم فيه بفحص نوع الملف كما شرحنا في الدرس السابق

فإذا كان نوع الملف صوت أو فيديو فإنا نأخذ طول الملف عبر الخاصية Duration

ثم نحول الرقم إلى عدد صحيح عبر كائن التحويل Convert.ToInt32

والرقم الناتج نحملة لخاصية Maximum في كائن التنقل , وبهذا مهما تنقلنا في الكائن فأن القيمة الناتجة ستكون بين 0 و طول الملف

إما إذا كان نوع الملف rm فإنا نأخذ طول الملف عبر الخاصية GetLength ونحول الرقم إلى عدد صحيح ونحمله للخاصية Maximum

ذلك هو إجراء ضبط القيمة العظمى لكائن التنقل ,لكن أين نستدعي هذا الإجراء ؟؟؟

أفضل مكان لإستدعاء هذا الإجراء هو بعد تحميل الملف أي بعد إستدعاء إجراء التحميل LoadFile

إفتح كود زر فتح الملف وأضف تعليمة الإستدعاء بعد تعليمة إستدعاء إجراء تحميل الملف:


OF.ShowDialog();
LoadFile(OF.FileName);
SetTrackBar();
PlayFile();

اللون الأزرق يمثل الزيادة التي أضفناها إلى الشفرة.

بعد أن قمنا بضبط القمية العظمى لكائن التنقل نحتاج لكود التنقل عبر الملف

إي أننا نحتاج لكود يقوم بالتنقل عبر الملف بمجرد تغيير مؤشر كائن التنقل

إضغط مزدوجا على كائن التنقل لتنتقل إلى الكود الذي يتنفذ بمجرد تغيير المؤشر TrackBar1Scroll

إنسخ الكود التالي :

if (type=="V")
{
vp.CurrentPosition=trackBar1.Value;
}
else if (type=="A")
{
ap.CurrentPosition=trackBar1.Value;
}
else if (type=="R")
{
rp.SetPosition(trackBar1.Value);
}

عند تغيير مؤشر كائن التغيير سيقوم المعالج بتنفيذ الكود السابق

trackBar1.Value ترجع رقم بين 0 و طول الملف على حسب موقع المؤشر

حيث نقوم بفحص نوع الملف فإذا كان فيديو أو صوت نعدل موقع التشغيل عبر الخاصية CurrenPosition

أما إذا كان rm فنعدل موقع التشغيل عبر الخاصية SetPosition.

الآن نحتاج إلى كود لتحريك مؤشر كائن التنقل ليحدد الموقع الذي وصل إليه التشغيل

لعمل ذلك نحتاج لإستخدام المؤقت حيث نقوم كل ثانية بفحص موقع التشغيل ونعدل موقع المؤشر

إضغط مزدوجاً على كائن المؤقت لتنتقل إلى الكود الذي ينفذ كل ثانية وأنسخ الكود التالي :

if (type=="V")
{
trackBar1.Value=Convert.ToInt32(vp.CurrentPosition );
}
else if (type=="A")
{
trackBar1.Value= Convert.ToInt32(ap.CurrentPosition);
}
else if (type=="R")
{
trackBar1.Value=Convert.ToInt32(rp.GetPosition());
}

الكود السابق سينفذ كل ثانية لإننا حددنا خاصية Interval في المؤقت إلى 1000

يقم الكود السابق بفحص نوع الملف فإذا كان صوت أو فيديو نقوم بأخذ موقع التشغيل الحالي

عبر الخاصية CurrentPosition ونحولها إلى عدد صحيح ونحمل الرقم الناتج إلى الخاصية Value

حيث أن الخاصية Value تمثل موقع مؤشر كائن التنقل .

وإذا كان الملف rm نأخذ طول الملف عبر الخاصية GetPosition ونحولها إلى عدد صحيح

ونحملها في خاصية موقع المؤشر Value

الكود السابق يقوم بتغيير موقع مؤشر كائن التنقل على حسب موقع التشغيل الذي وصل إليه الملف.

بقي لنا كود زري التقديم والتأخير ..

إضغط مزدوجاً على زر التقديم وأنقل الكود التالي :

if (type=="V")
{
vp.CurrentPosition=vp.CurrentPosition+20;
}
else if (type=="A")
{
ap.CurrentPosition=ap.CurrentPosition+20;
}
else if (type=="R")
{
rp.SetPosition(rp.GetPosition()+20000);
}

في الكود السايق نقوم بتعديل موقع التشغيل ليكون موقع التشغيل الحالي + 20 ثانية

أي أننا إذا ضغطنا على زر التقديم فان التشغيل سيقفز 20 ثانية إلى الأمام

يمكن وضع عدد أكبر من العشرين ثانية إذا أردت أو أصغر ..

لاحظ أنه إذا كان نوع الملف rm فإننا إضفنا إلى الموقع الحالي 20000 لأن مشغل rm يتعامل بالملي ثانية

شغل البرنامج وإفتح ملف ميديا وجرب تحريك مؤشر كائن التنقل.

الواجب

* أكتب كود زر التأخير ..

* قد يحدث خطأ في زري التقديم والتأخير إذا تم التأخير لأقل من صفر أو التقديم لأكثر من طول الملف

لذلك يجب وضع كود الزرين داخل جملة try هكذا:


try
{
//كود التقديم أو التأخير
}
catch
{
}

عند حدوث خطأ لن يتم تنفيذ أي شيئ.

* أرسل التطبيق.

ملاحظات:

* تأكد من إتجاه مؤشر كائن التنقل من خلال الخاصية RightToLeft.

* لجعل خلفية الزر شفافة عدل خاصية FlatStyle إلى Popup

و خاصية BackColor إلى Transparent

http://absba7.absba.org/teamwork8/455943/59.jpg

* يمكن تغيير الصور في الأزرار بواسطة الخاصية Image.

* يمكن تعديل لون خلفية الكائن الحاضن للفيديو إلى شفاف لتصبح كما في الصورة .

http://absba7.absba.org/teamwork8/455943/60.jpg

* للأسف ليست كل الكائنات تدعم الخلفية الشفافة , فكائن التنقل مثلاً لا يدعمها ..



ملاحظة لمستخدمي بيئة Sharp Developer:

إحياناً عند الضغط المزدوج على المؤقت يحصل خطأ وتغلق بيئة التطوير

ولكتابة كود المؤقت إذا حدث هذا الخطأ دون الضغط مزدوجاً على المؤقت:

افتح شفرة التصميم من خلال فتح مستعرض الملفات ثم فتح MainForm.Designer.cs

و ابحث عن كود تعريف المؤقت وأضف بعده هذا السطر:


this.timer1.Tick+=new System.EventHandler(this.Timer1Tick);

كما في الصورة :

http://absba7.absba.org/teamwork8/455943/61.jpg

ثم إفتح شفرة البرنامج عند الإجراءات من خلال إختيار MainForm.cs

وأضف هذا الإجراء وتأكد أنه خارج أي إجراء:

void Timer1Tick(object sender, System.EventArgs e)
{
if (type=="V")
{
trackBar1.Value=Convert.ToInt32(vp.CurrentPosition );
}
else if (type=="A")
{
trackBar1.Value= Convert.ToInt32(ap.CurrentPosition);
}
else if (type=="R")
{
trackBar1.Value=Convert.ToInt32(rp.GetPosition());
}
}

.نهاية الدرس السابع.

..