الدرس السابع - التنقل في الملف
صفحة 1 من اصل 1
الدرس السابع - التنقل في الملف
الدرس السابع
التنقل في الملف
ملف الصوت أو الفيديو يحتوي على خاصية طول الملف أي أن كل ملف له طول زمني
ويتم قياس الطول في مشغلات ميكروسوفت بالثانية , وفي مشغلات 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 ثوان
يتم تحديد طول الفترة الزمنية من خلال تعديل الخاصية "الصفة" Interval
حيث أن هذه الخاصية تأخذ الزمن بالملي ثانية أي أنه إذا أردنا أن تكون الفتره ثانية واحدة
فإن الخاصية Interval يجب ان تكون قيمتها 1000 , وإذا أردنا ثانيتين تكون 2000
ويتم كتابة الكود المراد تنفيذه من خلال الضغط مزدوجاً على المؤقت
في هذا الدرس سنستخدم الموقت ليفحص موقع تشغيل الملف كل ثانية
التطبيق في الرد التالي :
التطبيق
إفتح تطبيق الدرس السابق , وأضف زرين للتقديم والتأخير
أضف مؤقت Timer , ستلاحظ انه سيضاف إلى الشريط الأصفر تحت نافذة التصميم
إختر المؤقت وقم بتعديل خاصية Interval إلى 1000 ,"ثانية واحدة"
وعدل قيمة الخاصية Enabled إلى True , هذه الخاصية تقوم بتشغيل أو تعطيل عمل الموقت
فإذا كانت القمية True فالمؤقت مفعل , أما إذا كانت False فهو معطل ولن يعمل
أضف كائن التنقل TrackBar ليستخدم كأداة تنقل عبر الملف
إختر كائن التنقل و عدل الخاصية TickFrequency إلى 0 لكي تختفي خطول القياس
وعدل الخاصية TickStyle إلى Both إذا أردت
كائن التنقل يرجع قيمة بين الخاصيتين Minimum و Maximum
فمثلاً إذا كان Minimum = 0 و Maximum=50 فإن الخاصية Value سترجع قيمة بين 0 و 50
تمثل مكان المؤشر بالنسبة للكائن فمثلاً إذا كان المؤشر في منتصف الكائن فإن Value سترجع الرقم 25
وبما اننا نحتاج للتنقل عبر الملف فالمفروض أن نعدل الخاصية Minimum إلى 0
ونعدل الخاصية Maximum إلى طول الملف حتى ترجع القمية Value رقم بين 0 وطول الملف
وبما أن طول كل ملف يختلف عن الملف الآخر , فإننا سنعدل الخاصية Maximum عند تحميل أي ملف
ولن نحتاج لتعديل الخاصية Minimum لأن قيمتها الإفتراضية هي 0
سيصبح شكل النافذه هكذا:
إجراء ضبط كائن التنقل
إنقل هذا الكود إلى شفرة البرنامج مع مراعات أن يكون خارج أي إجراء آخر
كود:
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
* يمكن تغيير الصور في الأزرار بواسطة الخاصية Image.
* يمكن تعديل لون خلفية الكائن الحاضن للفيديو إلى شفاف لتصبح كما في الصورة .
* للأسف ليست كل الكائنات تدعم الخلفية الشفافة , فكائن التنقل مثلاً لا يدعمها ..
ملاحظة لمستخدمي بيئة Sharp Developer:
إحياناً عند الضغط المزدوج على المؤقت يحصل خطأ وتغلق بيئة التطوير
ولكتابة كود المؤقت إذا حدث هذا الخطأ دون الضغط مزدوجاً على المؤقت:
افتح شفرة التصميم من خلال فتح مستعرض الملفات ثم فتح MainForm.Designer.cs
و ابحث عن كود تعريف المؤقت وأضف بعده هذا السطر:
كود:
this.timer1.Tick+=new System.EventHandler(this.Timer1Tick);
كما في الصورة :
ثم إفتح شفرة البرنامج عند الإجراءات من خلال إختيار 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());
}
}
.نهاية الدرس السابع.
مواضيع مماثلة
» الدرس الثاني - المتغيرات
» الدرس الثالث - الجمل الشرطية:
» الدرس الرابع - الإجراءات
» الدرس الثامن - المصفوفات:
» الدرس التاسع - القوائم
» الدرس الثالث - الجمل الشرطية:
» الدرس الرابع - الإجراءات
» الدرس الثامن - المصفوفات:
» الدرس التاسع - القوائم
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى