وصول الدرس الحادي عشر من دورة تعلم لغة autoit

بسم الله الرحمان الرحيم; والصلاة والسلام على أشرف الخلق والمرسلين.
أما بعد فأيها الأحباب, أيها الكرام, أيها الإخوى والأخوات; بتحية الإسلام أحييكم وتحية الإسلام السلام فالسلام عليكم ورحمة الله تعالى وبركاته.
نلتقي اليوم بفضل الله مع الدرس الحادي عشر في لغة البرمجة الرائعة, السهلة, البسيطة شكلا والقوية عملا, لغة autoit المتميزة.
حيث كنا في الدرس العاشر قد تعرفنا على الدوال الخاصة بالتحكم في النوافذ

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

مقدمة

أولا علينا أن نفهم ما المقصود بدوال التحكم في تشغيل الملفات الصوتية
هي مجموعة من الدوال الموجودة في لغة autoit بشكل تلقائي وهي تسمح لنا بتشغيل ملفاتنا الصوتية المختلفة وتسمح لنا بإدارة التشغيل كالإيقاف المؤقت وكذالك الاستأناف والتقديم أو الترجيع وكذالك الإيقاف ومعرفة الوقت الكلي ومعرفة الموضع الحالي وغير ذالك
وهي تعتمد بشكل كلي على مكتبة النظام الخاصة بتشغيل الصوتيات
أي لو فقدت هذه المكتبة فجميع الدوال لا تعمل, لاكن جميع أنظمة التشغيل الأصلية تحتوي على هذه المكتبة, أحيانا لا تكن موجودة في الأنظمة المخففة كمثلا windows talking القديمة.
متطلبات العمل
نحن في هذا الدرس نحتاج إلى ملف استدعاء يسمى Sound.au3
وكما نعلم أن لإستدعاء ملف فنستخدم الأمر #include
يعني يصبح كالتالي
#include
وكذالك اليوم سوف نستعين بالكثير من الدوال لذا علينا أولا أن نتعرف على الدوال المستخدمة.

ما هي الدوال المستخدمة في هذا الدرس

كما قلت في البداية أني سوف أتطرق إلى الكثير من الدوال لذا علينا إخواني أن نركز قليلا في الدوال لكي لا يختلط علينا الأمر.

_SoundOpen

التعريف بالدالة

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

شكل الدالة

الدالة تحتوي على إعداد واحد وهو مسار الملف حيث هي على الشكل التالي
_soundOpen(“مسار الملف”)
ومسار الملف هو المسار الكامل لأي ملف صوتي مدعوم حيث الملفات المدعومة هي
ogg / MP3 / MP2 / Wav

نتيجة الدالة

النتيجة هي رمز الفتح الذي سنستخدمه في الدوال الأخرى إذا تم الفتح بنجاح
رمز @error يكن 0 إذا تم فتح الملف
أو يكن 1 إذا كان هناك خطء في إستدعاء المكتبة أو 2 إذا كان الملف غير موجود

ملاحظات

يجب إستخدام هذه الدالة في متغير لكي يمكن استخدام المتغير في الدوال التي ترتبط بنتيجة هذه الدالة
كمثلا
global$SoundOpen = _SoundOpen(“c:\test.mp3”)

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من الفتح
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit

_soundPlay

التعريف بالدالة

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

شكل الدالة

الدالة بسيطة جدا جدا حيث هي تعتمد على إعدادان فقط لا ثالث لهما
والدالة على الشكل التالي
_SoundPlay(“مسار الملف / رمز دالة الفتح”, “إنتظار اكتمال المهمة”)
حيث الإعداد الأول إما أن يكن مسار الملف في حال أردت إستخدام الدالة بدون الإستعانة بالدالة الأولة
أو أن يكن الرمز الخاص بالدالة الأولة وهو قيمة المتغير الذي قمنا باستدعاء الدالة به
أما الإعداد الثاني وهو خيحتمل خياران
1 إذا أردت أن يتوقف تنفيذ السكربت إلى أن تنتهي العملية أي يكتمل تشغيل الملف
أو إما أن يكن 0 في حال أردت أن يواصل تنفيذ الأوامر الأخرى التي تكن بعده
وهو افتراضيا على 0
أي فحال لم تريد أن يتوقف تنفيذ الأوامر فتكتفي بالإعداد الأول

نتيجة الدالة

الدالة تعيد لك الرقم 1 في حال تم استخدام الدالة بالشكل المطلوب وتم تأدية العمل بنجاح
أو 0 إذا كان هناك خطء
ورمز الخطأ @error يكن كالتالي
0 في حال تم العمل بنجاح
1 في حال كان هناك خطء في تشغيل الملف
2 خطء في الإعداد الثاني
3 خطء في دالة _soundOpen

ملاحظات

هذه الدالة لها دالة أخرى مشابهة لها تماما وهي لا تحتاج أي ملف include واسم الدالة
soundPlay
بدون علامة السطر
وإعداداتها نفس إعدادات الدالة إلا أنها لا تقبل soundOpen ويحدث فيها الكثير من الأخطاء

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف مع الإنتظار
_SoundPlay($aSound, 1)
إعادة تشغيل الملف بدون الإنتظار
_SoundPlay($aSound)
;إغلاق الملف المفتوح
_SoundClose($aSound)
;الخروج من البرنامج
exit
/xmp>

_soundPause

تعريف بالدالة

هذه الدالة تستخدم لإيقاف الملف الصوتي إيقاف مؤقت
حيث يمكن إستأنافه

شكل الدالة

شكل الدالة يكن كالتالي
_soundPause(“رمز الدالة الأولى”)

هذه الدوال التي ستأتي كلها مرتبطة بشكل مباشر مع دالة _SoundOpen
لهذا علينا بأن لا نستغني عن هذه الدالة

نتيجة الدالة

الدالة تعود لنا بالرقم 1 في حال نجحت العملية
أو بالرقم 0 عند حدوث خطء
رمز الخطأ @error يكن
0 في حال تمت العملية بنجاح
1 في حال هناك خطء في الإيقاف المؤقت
أو 2 في حال هناك خطء في دالة _SoundOpen

ملاحظات

يمكن عكس الدالة أي إستأناف التشغيل باستبدال
_SoundPause
بدالة
_Soundresume
والتي لها نفس إعداداتها ونفس النتائج
لذا لا داعي أن نذكرها في قسم مستقل

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف بدون الإنتظار
_SoundPlay($aSound)
;الإنتظار لمدة ثانية
Sleep(1000)
;إيقاف الملف مؤقتا
_SoundPause($aSound)
;الإنتظار لمدة ثانية
Sleep(1000)
;إستأناف الملف
_SoundResume($aSound)
;حلَقة للتأكد من تشغيل الملف كاملا
While 1
	Sleep(100)
	If _SoundPos($aSound, 2) >= _SoundLength($aSound, 2) Then ExitLoop
WEnd
;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit

_SoundStop

تعريف بالدالة

إن هذه الدالة تستخدم للإيقاف النهائي لملف صوتي جاري تشغيله

شكل الدالة

إن هذه الدالة شكلها هو نفسه شكل الدالة السابقة
_soundStop(“نتيجة الدالة الأولى”)

نتيجة الدالة

الدالة تعود لنا بالرقم 1 في حال نجحت العملية
أو بالرقم 0 عند حدوث خطء
رمز الخطأ @error يكن
0 في حال تمت العملية بنجاح
1 في حال هناك خطء في الإيقاف
أو 2 في حال هناك خطء في دالة _SoundOpen

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف مع الإنتظار
_SoundPlay($aSound, 1)
;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit

_SoundLength

التعريف بالدالة

تستخدم هذه الدالة للتعرف على الوقت الكلي لملف صوتي

شكل الدالة

الدالة كذالك بسيطة جدا
حيث شكلها كما يلي
_SoundLength(“رمز دالة _SoundOpen”, النوع =1)
رمز دالة _SoundOpen لقد تعودنا عليه خلاص
أما النوع
فيمكن أن يكن 1 وهو أن تكن النتيجة كشكل الساعة المعروف أي ساعات:دقائق:ثوان
أو أن يكن بجزء الثانية وهو أن يعطيك الوقت عبارة عن عدد أجزاء الثواني وكل 1000 يمثل ثانية

نتيجة الدالة

الدالة تعود لنا بوقت الملف حسب النوع المختار في حال نجحت العملية
أو بالرقم 0 عند حدوث خطء
رمز الخطأ @error يكن
0 في حال تمت العملية بنجاح
1 في حال هناك خطء في النوع
أو 3 في حال هناك خطء في دالة _SoundOpen

ملاحظة

يستحسن استدعاء الدالة في متغير حتى يختصر عليك الوقت إن أردت أن تستخدم القيمة لاحقا

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف بدون الإنتظار
_SoundPlay($aSound, 0)
;معرفة الوقت الكلي
MsgBox($MB_SYSTEMMODAL, "الوقت الكلي للملف", "الوقت الكلي للملف بصيغة :" & @CRLF & "hh:mm:ss - " & _SoundLength($aSound, 1) & @CRLF & "بالجزء من الثانية - " & _SoundLength($aSound, 2))
;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit


_SoundPos

التعريف بالدالة

تستخدم هذه الدالة للتعرف على الموضع الحالي لملف صوتي

شكل الدالة

الدالة كذالك بسيطة جدا
حيث شكلها كما يلي
_SoundPos(“رمز دالة _SoundOpen”, النوع =1)
رمز دالة _SoundOpen لقد تعودنا عليه خلاص
أما النوع
فيمكن أن يكن 1 وهو أن تكن النتيجة كشكل الساعة المعروف أي ساعات:دقائق:ثوان
أو أن يكن بجزء الثانية وهو أن يعطيك الوقت عبارة عن عدد أجزاء الثواني وكل 1000 يمثل ثانية

نتيجة الدالة

الدالة تعود لنا موضع الملف حسب النوع المختار في حال نجحت العملية
أو بالرقم 0 عند حدوث خطء
رمز الخطأ @error يكن
0 في حال تمت العملية بنجاح
1 في حال هناك خطء في النوع
أو 3 في حال هناك خطء في دالة _SoundOpen

ملاحظة

يستحسن استدعاء الدالة في متغير حتى يختصر عليك الوقت إن أردت أن تستخدم القيمة لاحقا

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف بدون الإنتظار
_SoundPlay($aSound, 0)

;الإنتظار لمدة ثانيتين
sleep(2000)
MsgBox($MB_SYSTEMMODAL, "الموضع الحالي للملف", "الموضع الحالي للملف بصيغة :" & @CRLF & "hh:mm:ss - " & _SoundPos($aSound, 1) & @CRLF & "بالجزء من الثانية - " & _SoundPos($aSound, 2))
;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit

_SoundSeek

تعريف بالدالة

تستخدم هذه الدالة للإنتقال إلى موضع معين في الملف الصوتي
كالذهاب إلى الأمام أو الرجوع إلى الخلف

شكل الدالة

هذه الدالة فيها بعض الإعدادات حيث سنتعرف عليها
_SoundSeek(“رمز دالة _SoundOpen”, ساعات, دقائق, ثوان)
حيث الرمز إنتهينا منها هي معروفة لدينا
أما الساعات فهي نستخدمها لو أردنا التنقل لساعة معينة في الملف
دقائق للانتقال لدقيقة معينة في الملف
ثوان للإنتقال إلى ثانية معينة في الملف

نتيجة الدالة

النتيجة تكن كما يلي
1 في حال نجاح العملية
0 في حال فشل العملية
والرمز @error يكن كالتالي
0 نجاح العملية
1 فشل العملية
3 خطء في _SoundOpen

ملاحظات

الدقائق لا يجب أن تتجاوز 59 والثوان كذالك
فلو تجاوزت الثوان 59 فعند بلوغها ال60 تصبح 1 دقيقة يعني تنقل إلى خانة الدقائق والباقي منها على الثوان وأكمل حسب ذالك
ونفس الشيء للدقائق لو وصلت 59 دقيقة فال60 تصبح 1 ساعة وما تبقى منها على الدقائق والثوان وأكمل على ذالك

مثال على الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف بدون الإنتظار
_SoundPlay($aSound, 0)

;الإنتظار لمدة ثانيتين
sleep(2000)
;التقديم إلى الثانية الرابعة في الملف
_SoundSeek($aSound, 0, 0, 4)
;معرفة الموضع الحالي
MsgBox($MB_SYSTEMMODAL, "الموضع الحالي للملف", "الموضع الحالي للملف بصيغة :" & @CRLF & "hh:mm:ss - " & _SoundPos($aSound, 1) & @CRLF & "بالجزء من الثانية - " & _SoundPos($aSound, 2))
;تكميل تشغيل الملف
_SoundPlay($aSound, 0)
;حلقة للتأكد من التشغيل الكلي للملف
While 1
	Sleep(100)
	If _SoundPos($aSound, 2) >= _SoundLength($aSound, 2) Then ExitLoop
WEnd

;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit


_SoundStatus

تستخدم هذه الدالة لمعرفة حالة الملف الصوتي

شكل الدالة

الدالة بسيطة جدا حيث لها إعداد واحد وهو رمز دالة _SoundOpen
شكلها كما يلي
_SoundStatus(“رمز _SoundOpen”)

نتيجة الدالة

حالة الملف عند نجاح العملية
0 في حال فشلت العملية
@error يكن كالتالي
0 عند نجاح العملية
3 عند حدوث خطء في _SOundOpen

قائمة الحالات

الدالة تعود بحالات الملف التالية
“playing”: عندما يكن الملف قيد التشغيل
“paused”: عندما يكن الملف في حالة إيقاف مؤقت
“stopped”: عندما يكن الملف في حالة إيقاف
“not ready”: عندما يكن الملف غير مفتوح أصلا

مثال عن الدالة


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف بدون الإنتظار
_SoundPlay($aSound, 0)
;معرفة حالة الملف
MsgBox($MB_SYSTEMMODAL, "حالة الملف عند التشغيل", _SoundStatus($aSound))
;الإنتظار لمدة ثانيتين
sleep(2000)
;إيقاف الملف مؤقتا
_SoundPause($aSound)
;معرفة حالة الملف
MsgBox($MB_SYSTEMMODAL, "حالة الملف عند الإيقاف المؤقت", _SoundStatus($aSound))
;إيقاف الملف
_SoundStop($aSound)
;معرفة حالة الملف
MsgBox($MB_SYSTEMMODAL, "حالة الملف عند الإيقاف", _SoundStatus($aSound))

;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit


_SoundClose

التعريف بالدالة

تستخدم هذه الدالة لغلق ملف صوتي
أو لكي تنهي عمل دالة _SOundOpen
ويجب استخدامها قبل الخروج من البرنامج الخاص بك في حال استخدمت دالة _SoundOpen

شكل الدالة

_SoundClose (“رمز دالة _SoundOpen”)

مثال


;إستدعاء الملفات اللازمة
#include <MsgBoxConstants.au3>
#include <Sound.au3>
;فتح الملف
Local $aSound = _SoundOpen(@WindowsDir & "\media\tada.wav")
;أمر شرطي للتأكد من فتح الملف
If @error = 2 Then
	MsgBox($MB_SYSTEMMODAL, "Error", "لم يتم العثور على الملف")
	Exit
Else
	MsgBox($MB_SYSTEMMODAL, "نجاح", "تم فتح الملف بنجاح")
EndIf
;تشغيل الملف مع الإنتظار
_SoundPlay($aSound, 1)
;غلق الملف الذي تم فتحه
_SoundClose($aSound)
;الخروج من البرنامج
exit


ملاحظة مهمة بخصوص الدورة

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

خاتمة

أعزائي هذا ما استطعت أن أقدمه في هذا الدرس
فأرجو أن تعذروني على أي تقصير.
كما أرجو أن لا تؤاخذوني إذا كان الدرس طويل فهو مرتبط ولا يمكنني أن أقسمه لجزئين
كما أرجوكم لا تنسوني من دعائكم الصالح
وفضلا قمو بنشر الدورة حتى تعم الفائدة
أكرر لأقول
أنا بريء أمام الله عز وجل من كل من يستغل هذه الدروس في إيذاء الناس أو فعل ما يغضبه سبحانه وتعالى
إنما أنا أقدمها من باب المعرفة
ولكي نكن مستقلين جميعا في تعاملنا مع الحاسوب
كما لتطبيق أفكارنا على أرض الواقع
تقبلو تحياتي
وقبل أن أختم أحب أن أقدم لكم
رابط
الدرس الحادي عشر
الذي سيكن متوفر قريبا على الرابط السابق
أكرر وأرجوكم
لا تنسوني من دعائكم
والله أنا بالحاجة إليه
كما أرجو زيارة موقعنا وطرح أي إستفسار في منتدى لغة autoit
إليكم رابط الموقع
https://mx-blind.com/
ملاحظات :
لأي سؤال في الدورة إذا كان متعلق بأي درس من الدروس فيرجى طرح السؤال في تعليق في المنشور المتعلق بالدرس في المنتديات
وإلا بإمكانكم طرح السؤال في موضوع مستقل داخل منتدى اللغة

ومسك الختام السلام فالسلام عليكم ورحمة الله تعالى وبركاته