منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : (/showthread.php?tid=4522)



كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : - مبرمج أوتار - 27-09-12

ملاحظة منقول من المنتدي السابق للعضو:- أنس محمود


بسم الله الرحمن الرحيم





بداية ، يجب أن تعرف انه لحساب موعد الأذان لأي صلاة يجب أن يتوافر ما يلي :-
  • خط الطول للمدينة ( longitude ) .
  • خط العرض للمدينة ( latitude ) .
  • فارق التوقيت للمدينة .
  • تاريخ اليوم المراد حساب توقيت صلاة به .
  • مذهب المدينة ( لصلاة العصر ) .
  • طريقة حساب باقي الصلوات ( اقصد المؤسسة أو التقويم الذي تتبعه المدينة ويتم حساب الصلوات على أساسه )
إذا توافر ما سبق أمكن حساب مواقيت الصلاة .
طبعا في موضوع للأخ silverlight قدم الفئة PrayerTimes .
تطبعا أولا تنشأ كائن جديد من الفئة ، ثم تستدعي الإجراء setCalculationMethod وتمرر له طريقة حساب الصلاة ؛ قيمة من :

  1. Makkah : تقويم أم القرى .
  2. Egypt : الهيئة المصرية العامة للمساحة .
  3. Karachi : جامعة العلوم الإسلامية بكراتشي .
  4. ISNA : المجتمع الإسلامي بأمريكا الشمالية .
  5. MWL : رابطة العالم الإسلامي .
ثم الدالة GetPrayerTimes ، وتمرر إليها :

  1. كائن من النوع Data يمثل اليوم المراد حساب المواقيت عنده .
  2. خط العرض من النوع Double .
  3. خط الطول من النوع Double .
  4. فارق التوقيت من النوع Integer .
تعود هذه الدالة بمصفوفة من النوع String عدد عناصرها 7 يمثل مواقيت الصلاة لليوم المدخل ( شاملة شروق الشمس ( بعد الفجر ) وغروب الشمس ( بعد المغرب ) ) .
أضفت لهذه الفئة طريقة باسم GetPrayerTimes_Date بنفس المدخلات تعود بمواقيت الصلاة ولكن بمصفوفة من النوع Date .


لذلك قمت بعمل قاعدة بيانات تحتوي على بيانات 252 دولة و9512 مدينة ! ( باستخدام السلسلة لفئات خاصة أيضاً ) والتعامل معها أيضا في منتهى السهولة ،
كيف اصنع برنامج للتنبيه بمواقيت الأذان ؟ :

يمكن ذلك بمنتهى البساطة ( تعمدت اختيار ابسط طريقة حتى لا يكون هناك صعوبة في فهم الدرس )،

  • افتح مشروع جديد من النوع WindowsApplication وغير اسم المشروع إلى AzanProject ،
  • أنسخ ملف قاعدة البيانات إلى المجلد Bin\Debug من ملفات مشروعك ،
أضف مرجع المكتبة من قائمة Project ç الأمر Add Reference ç التبويب Browse ç ثم اختر الملف WindowsApplication5.dll .

أضف الفئة PrayerTimes من قائمة Project çAdd Existing File ç ثم اختر الملف PrayerTimes.vb .
  • الآن عدل النموذج المنشأ ليصبح شبيه بما يلي :-


طبعا للـ AzanTimer الخاصية Enabled بـ True ، Interval بـ 2000 .



الآن إلى الكود :-
  • أولا قم باستيراد مجال الأسماء التالي :-
كود :
[align=left]Imports ContriesAzanInfo[/align]
  • الآن قم بتعريف الحدث التالي الذي يتم إطلاقه عند حلول وقت صلاة ما .
كود :
[align=left]   'حدث حلول ميعاد الأذان
  Event AzanTime(ByVal PrayName As String)[/align]
  • ثم قم بتعريف الحقول التالية في التصريحات العامة :-
كود :
[align=left]   'كائن حساب الأذان
  Dim PrayerTimesObj As New PrayerTimes[/align]

[align=left]   'Date كائن مواقيت الصلاة لليوم من النوع
  Dim PrayerTimesDate As Date()[/align]

[align=left]   'كائن قاعدة البيانات
  Dim CountriesInfo As New AzanInfo(Application.StartupPath & "\Azan.adb")[/align]

[align=left]   'مصفوفة باسماء الصلوات الخمس والشروق والغروب
  Dim PreysNames() As String = {"الفجر", "الشروق", "الظهر", "العصر", _
                                 "الغروب", "المغرب", "العشاء"}[/align]

[align=left]   'مصفوفة لعدم تكرار التنبية بنفس الصلاة اكثر من مرة
  Dim MM() As Integer = {0, 0, 0, 0, 0, 0, 0}[/align]


أريد أن أوضح أن مشيد الفئة AzanInfo يتطلب وسيطة تمثل مسار قاعدة بيانات الدول .
  • الآن عرف الإجراء التالي والذي يختبر هل الوقت الحالي يمثل احد عناصر المصفوفة المرسلة ( بمعنى هل الوقت الحالي معاد أذان أم لا ) ، و بناء على ذلك يطلق الحدث AzanTime :-
كود :
[align=left]   'اجراء إختبار هل حان موعد اي صلاة
  Sub CheckAthan(ByVal PrayTimes() As Date)[/align]

[align=left]       For CurPrayIndex As Integer = 0 To PrayTimes.Length - 1[/align]

[align=left]           If CurPrayIndex = 1 Or CurPrayIndex = 4 Then 'ـ 1 تعبر عن الشروق 4 تمثل الغروب
              CurPrayIndex += 1
          End If[/align]

[align=left]           If Now.Minute + (Now.Hour * 60) = (PrayerTimesDate(CurPrayIndex).Minute) + (PrayTimes(CurPrayIndex).Hour * 60) Then[/align]

[align=left]               ' اذا تحقق شرط نفس ميعاد الصلاة ،
              ' فانه يتم اختبار هل تم اطلاق الحدث خلال هذه الدقيقة ام لا [/align]

[align=left]               If MM(CurPrayIndex) = 0 Then[/align]

[align=left]                   ' في حال لم يتم اطلاق الحدث في هذه الدقيقة_
                  ' فانه يتم تعليم هذه الصلاة بانه تم اطلاق الحدث لها
                  ' وازالة التعليم من باقي الصلوات
                  ' ثم إطلاق الحدث[/align]

[align=left]                   For a As Integer = 0 To MM.Length - 1
                      MM(a) = 0
                  Next[/align]

[align=left]                   MM(CurPrayIndex) = 1[/align]

[align=left]                   RaiseEvent AzanTime(PreysNames(CurPrayIndex))[/align]

[align=left]                   Application.DoEvents()
              End If[/align]

[align=left]           End If[/align]

[align=left]       Next
  End Sub[/align]




الآن انتهينا من جزء التصريحات ،


أحداث الكائنات :-
  • داخل الحدث Load لـ Form1 اكتب :-
كود :
[align=left]       'ملى قائمة الدول من قاعدة البيانات
      For Each Country As Country In CountriesInfo.Contries
          Me.CountryLst.Items.Add(Country.CountryName)
      Next[/align]

[align=left]       'اختيار الدولة الأولى والمدينة الأولى بها ( يمكنك تغييرها ) ـ
      CountryLst.SelectedIndex = 0
      TownsLst.SelectedIndex = 0[/align]

  • داخل الحدث SelectedIndexChanged لـ Countrylst اكتب :-
كود :
[align=left]       'افراغ قائمة المدن
      Me.TownsLst.Items.Clear()[/align]


[align=left]       'ملىء قائمة المدن من قاعدة البيانات
      For Each Town As Town In CountriesInfo.Contries(Me.CountryLst.SelectedIndex).Towns
          Me.TownsLst.Items.Add(Town.TownName.Split("-")(0))
      Next[/align]

[align=left]       'اختيار المدينة الأولى
      TownsLst.SelectedIndex = 0[/align]
  • داخل الحدث SelectedIndexChanged لـ TownsLst اكتب :-
كود :
[align=left]       'المدينة الحالية
      With CountriesInfo.Contries(Me.CountryLst.SelectedIndex). _
                            Towns(Me.TownsLst.SelectedIndex)[/align]

[align=left]           'تعيين طريقة الحساب
          PrayerTimesObj.setCalculationMethod([Enum].Parse(GetType(PrayerTimes.Methods), .CalcMethod.ToString))[/align]

[align=left]           '( Now ايجاد مواقيت الصلاة لليوم ( لاحظ
          PrayerTimesDate = PrayerTimesObj.GetPrayerTimes_Date(Now, .latitude, .longitude, .TimeZonePlus)[/align]

[align=left]           'ملى بيانات المدينة
          Me.LatitudeTxt.Text = .latitude
          Me.LongitudeTxt.Text = .longitude
          Me.TimeZonePlusTxt.Text = .TimeZonePlus
          Me.MazhabCmb.SelectedIndex = CInt(.Mazhab)
          Me.MethodCmb.SelectedIndex = CInt(.CalcMethod)[/align]


[align=left]           'ملئ مواقيت الصلاة
          Me.lblFjr.Text = PrayerTimesDate(0).ToString("mm : hh tt")
          Me.lblsunrise.Text = PrayerTimesDate(1).ToString("mm : hh tt")
          Me.lblthuhr.Text = PrayerTimesDate(2).ToString("mm : hh tt")
          Me.lblasr.Text = PrayerTimesDate(3).ToString("mm : hh tt")
          Me.lblsunset.Text = PrayerTimesDate(4).ToString("mm : hh tt")
          Me.lblmgrb.Text = PrayerTimesDate(5).ToString("mm : hh tt")
          Me.lblisha.Text = PrayerTimesDate(6).ToString("mm : hh tt")[/align]


[align=left]           'تغيير العنوان الى اسم المدينة والدولة
          Me.Label40.Text = Me.CountryLst.SelectedItem & " -- " & Me.TownsLst.SelectedItem[/align]

[align=left]           'ازالة التعليم من كل الصلوات
          For a As Integer = 0 To MM.Length - 1
              MM(a) = 0
          Next[/align]

[align=left]       End With[/align]
  • الآن داخل حدث Tick لـ AzanTimer اكتب :-
كود :
[align=left]       CheckAthan(PrayerTimesDate)[/align]

نحن الآن قطعنا نصف المسافة ، والباقي عليك ! ،
  • يمكنك اقتناص الحدث AzanTime والتفنن في عرض التنبيه كما يحلو لك ، أنا سأقوم بعرض رسالة MsgBox :p !!
كود :
[align=left]   Private Sub Form1_AzanTime(ByVal PrayName As String) Handles Me.AzanTime[/align]

[align=left]       MsgBox("حان الآن موعد أذان " & PrayName)[/align]

[align=left]   End Sub[/align]

هذا كل شيء :

عموما المرفقات رفعتها في هذه المشاركة :-

قاعدة البيانات الدول .
ملف الـمكتبة DLL .
الفئة المضاف لها الطريقة .
كود المكتبة .
المثال

أتمنى أن تدعو لي بظهر الغيب

تقبلوا تحياتي ؛ أخوكم / أنس محمود



كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : - مبرمج بلا حدود - 15-07-13

باركـ الله فيكـ
وجزاكـ الله كل الخير
وجعله الله في موازين حسناتكـ
اللهم آمين


RE: كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : - محمد خالد - 25-11-17

جزاك الله كل خير
مجهود رائع


RE: كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : - ذيشان - 18-01-19

(25-11-17, 01:21 PM)محمد خالد كتب : جزاك الله كل خير
مجهود رائع

جزاك الله كل خير
مجهود رائع

أريد مساعدتك في إنشاء برنامج مواقيت الصلوات

فهل تساعدني في ذلك
وأنا أكون مشكور لك


RE: كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : - elgokr - 21-01-19

(18-01-19, 07:49 PM)ذيشان كتب : جزاك الله كل خير
مجهود رائع

أريد مساعدتك في إنشاء برنامج مواقيت الصلوات

فهل تساعدني في ذلك
وأنا أكون مشكور لك

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

http://vb4arb.com/vb/search.php?action=results&sid=0ef19912c1901174bde54384b37e79b2

تحياتى لك
وتمنياتى لك التوفيق