السلام عليكم
سبق وأن أنجز أخانا MHDM برنامج للتذكير بالآذان باستخدام الفيبي دوت نت، ولقد ناقشنا ذلك في هذا الموضوع https://www.djelfa.info/vb/showthread.php?t=1327951
ولقد كانت لي مشاركة هنا وأشرت أن الكلاس الموجود في النت يا إما خاطئ أو أنني لم أفهمه https://www.djelfa.info/vb/showthread...post1053621218
ولكن المشكلة صعبة الاكتشاف، لقد كانت في قيم خطوط الطول والعرض والموجودة في ملف xml
فالقيم موجودة دون فاصلة في حين الحقيقية موجودة بالفاصلة
مثلا قيم الطول والعرض لمستغانم في ملف xml ها هي
واكتشفت ذلك بالصدفة لعدم تعاملي مع مفهوم خطوط الطول والعرض رغم أننا درسناها في الابتدائي
بعد اكتشاف الخلل تم تصحيح البرنامج وها هو يعمل بشكل سليم
كلاس الحساب
كود PHP:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace athan { class CalcPrayerTimes { double Local_Noon; double Asr_Time; double Esha_Time; double Fajr_Time; double Sun_Set; double Sun_Rise; public CalcPrayerTimes(int Year, int Month, int Day, double Long, double Lat, double Zone) { double D = (367 * Year) - ((Year + (int)((Month + 9) / 12)) * 7 / 4) + (((int)(275 * Month / 9)) + Day - 730531.5); double L = (280.461 + 0.9856474 * D) % 360; L = LessMore360(L); double M = (357.528 + 0.9856003 * D) % 360; M = LessMore360(M); double Lambda = L + 1.915 * Math.Sin(ToRadian(M)) + 0.02 * Math.Sin(ToRadian(2 * M)); Lambda = LessMore360(Lambda); double Obliquity = 23.439 - 0.0000004 * D; double Alpha = ToDegree(Math.Atan((Math.Cos(ToRadian(Obliquity)) * Math.Tan(ToRadian(Lambda)))));////// Alpha = LessMore360(Alpha); Alpha = Alpha - (360 * (int)(Alpha / 360)); Alpha = (Alpha + 90 * (Math.Floor(Lambda / 90) - Math.Floor(Alpha / 90))); double ST = (100.46 + 0.985647352 * D) % 360; double Dec = ToDegree(Math.Asin(Math.Sin(ToRadian(Obliquity)) * Math.Sin(ToRadian(Lambda)))); double Durinal_Arc = ToDegree(Math.Acos((Math.Sin(ToRadian(-0.8333)) - Math.Sin(ToRadian(Dec)) * Math.Sin(ToRadian(Lat))) / (Math.Cos(ToRadian(Dec)) * Math.Cos(ToRadian(Lat))))); double Noon = Alpha - ST; Noon = LessMore360(Noon); double UT_Noon = Noon - Long; Local_Noon = UT_Noon / 15 + Zone; double Asr_Alt = ToDegree(Math.Atan(1 + Math.Tan(ToRadian(Lat - Dec)))); double Asr_Arc = ToDegree(Math.Acos((Math.Sin(ToRadian(90 - Asr_Alt)) - Math.Sin(ToRadian(Dec)) * Math.Sin(ToRadian(Lat))) / (Math.Cos(ToRadian(Dec)) * Math.Cos(ToRadian(Lat))))); Asr_Arc = Asr_Arc / 15; Asr_Time = Local_Noon + Asr_Arc; Sun_Rise = Local_Noon - (Durinal_Arc / 15); Sun_Set = Local_Noon + (Durinal_Arc / 15); double Esha_Arc = ToDegree(Math.Acos((Math.Sin(ToRadian(-18)) - Math.Sin(ToRadian(Dec)) * Math.Sin(ToRadian(Lat))) / (Math.Cos(ToRadian(Dec)) * Math.Cos(ToRadian(Lat))))); Esha_Time = Local_Noon + (Esha_Arc / 15); double Fajr_Arc = ToDegree(Math.Acos((Math.Sin(ToRadian(-18)) - Math.Sin(ToRadian(Dec)) * Math.Sin(ToRadian(Lat))) / (Math.Cos(ToRadian(Dec)) * Math.Cos(ToRadian(Lat))))); Fajr_Time = Local_Noon - (Fajr_Arc / 15); } public double ToRadian(double Value) { return (Value * Math.PI / 180); } public double ToDegree(double Value) { return (Value * 180 / Math.PI); } public double LessMore360(double Value) { if (Value <= 0 || Value > 360) { return (Value + 360); } else return Value; } public int LocalNoonHour { get { return ((int)(Local_Noon)); } } public int LocalNoonMin { get { return (int)(((Local_Noon) - (int)Local_Noon) * 60); } } public int AsrHour { get { return ((int)(Asr_Time)); } } public int AsrMin { get { return (int)(((Asr_Time) - (int)(Asr_Time)) * 60); } } public int SunRiseHour { get { return ((int)(Sun_Rise)); } } public int SunRiseMinr { get { return (int)(((Sun_Rise) - (int)(Sun_Rise)) * 60); } } public int SunSetHour { get { return ((int)(Sun_Set)); } } public int SunSetMin { get { return (int)(((Sun_Set) - (int)(Sun_Set)) * 60); } } public int FajrHour { get { return ((int)(Fajr_Time)); } } public int FajrMin { get { return (int)(((Fajr_Time) - (int)(Fajr_Time)) * 60); } } public int EshaHour { get { return ((int)(Esha_Time)); } } public int EshaMin { get { return (int)(((Esha_Time) - (int)(Esha_Time)) * 60); } } }
}
البرنامج من إنجاز العبد الضعيف
كود PHP:
using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using athan; using System.Media; namespace athan { public partial class AthanForm : Form { DataSet ds; CalcPrayerTimes calculator; NotifyIcon myNotifyIcon; ContextMenu myMenu;
myMenu = new ContextMenu();//إضافة قائمة قرب الساعة لأيقونة البرنامج myMenu.MenuItems.Add(0, new MenuItem("إظهار", new System.EventHandler(Show_Click))); myMenu.MenuItems.Add(1, new MenuItem("إخفاء", new System.EventHandler(Hide_Click))); myMenu.MenuItems.Add(2, new MenuItem("خروج", new System.EventHandler(Exit_Click)));
myNotifyIcon = new NotifyIcon(); //إضافة أيقونة قرب الساعة myNotifyIcon.Text = "برنامج الأذان: النسخة 1.00"; myNotifyIcon.Visible = true; myNotifyIcon.Icon = new Icon(GetType(), "TrayIcon.ico"); myNotifyIcon.ContextMenu = myMenu; //ربط الايقونة بالقائمة السابقة
lblDay.Text = DateTime.Now.ToLongDateString(); //الحصول على تاريخ اليوم على هيئة حروف
string myXMLfile = "algeria.xml"; // متغير يحمل اسم ملف الإكس أم أل ds = new DataSet(); // تهيئة داتاست وهي عبارة عند قاعدة بيانات في الذاكرة ds.ReadXml(myXMLfile); //بناء الداتاسات اعتمادا على هيكل الإكس أم أل
cbWilaya.DataSource = ds.Tables[0]; // ربط الكومبوبوكس بالجدول الاول للداتاست cbWilaya.DisplayMember = "name"; // عرض اسم الولاية في الكومبوبوكس
private void timer1_Tick(object sender, EventArgs e) { lblTime.Text = DateTime.Now.ToLongTimeString();//إستخلاص الوقت الحالي if (DateTime.Now.Second == 0) CheckEachMinute();//بعد كل دقيقة يتم التدقيق في وقت الصلاة }
private void CheckEachMinute() { //تحويل الازمنة إلى دقائق لتسهيل المقارنة int iFajr = calculator.FajrHour * 60 + calculator.FajrMin; int iLocalNoon = calculator.LocalNoonHour * 60 + calculator.LocalNoonMin; int iAsr = calculator.AsrHour * 60 + calculator.AsrMin; int iSunSet = calculator.SunSetHour * 60 + calculator.SunSetMin; int iEsha = calculator.EshaHour * 60 + calculator.EshaMin;
int iNow = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
// استدعاء دالة لتنفيذ أمر الاذان if (iNow == iFajr) playAthan("الفجر"); if (iNow == iLocalNoon) playAthan("الظهر"); if (iNow == iAsr) playAthan("العصر"); if (iNow == iSunSet) playAthan("المغرب"); if (iNow == iEsha) playAthan("العشاء"); }
private void playAthan(string sSatalTime) { //windows/system32/wmp.dll استخدام مكتبة الصوت الموجودة هنا WMPLib.WindowsMediaPlayer wPlayer = new WMPLib.WindowsMediaPlayer();//استدعاء كنترول تشغيل الصوت wPlayer.URL = "athan.wma"; wPlayer.controls.play();
DialogResult dialogResult = MessageBox.Show("أذان صلاة " + sSatalTime + "\n" + "لإيقاف الأذان إضغط على زر نعم", "الأذان", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { wPlayer.controls.stop(); }
}
private void cbWilaya_SelectedIndexChanged(object sender, EventArgs e) { int index = cbWilaya.SelectedIndex; //الحصول على إندكس الولاية
int Year = DateTime.Now.Year; //الحصول على السنة الحالية int Month = DateTime.Now.Month; //الحصول علي الشهر الحالي int Day = DateTime.Now.Day; //الحصول على اليوم الحالي double Long = Convert.ToDouble(ds.Tables[0].Rows[index]["longitude"]) / 10000; //استخلاص قيمة خط الطول للولاية double Lat = Convert.ToDouble(ds.Tables[0].Rows[index]["latitude"]) / 10000; //استخلاص قيمة دائرة العرض للولاية calculator = new CalcPrayerTimes(Year, Month, Day, Long, Lat, 1.0); // هنا نستدعي الكلاس الجاهز الذي يحسب أوقات الصلاة
فقط للتنبيه، قد تجد فارقا بسيطا في الفجر والعشاء، وهذا لاعتماد بعض البرامج طريقة هيئة العالم الاسلامي في الحساب، في حين الكلاس المستخدم هنا يعتمد جامعة كاراتشي في الحساب، فالفرق طفيف، علما أنه يوجد العديد من طرق الحساب العالمية.
من يحتاج لمواقيت الصلاة في بلدان أخرى فما عليه إلا استبدال ملف algeria.xml مع الحفاظ على التسمية.
كما أنني استخدمت أسامي إنجليزية في تسمية المتغيرات والدوال وهذا لأنني معقد من الفرنسية على اعتبارها لغة دخيلة على البرمجة.
وأثناء التسمية قاربت الأسلوب العالمي في التسمية
يعني Now من نوع interger يسمى هكذا : iNow
المتغير SalatTime من نوع string يسمى هكذا: sSalatTime
الكنترول Wilaya من نوع ComboBox يسمى هكذا: cbWilaya
Label = lbl
TextBox = txt
Button = btn
ListBox = lb
.... إلخ
وهذا هو الاسلوب المعتمد عالميا فلنعتمده.
من يجد مشكلة في تشغيل التطبيق فأرجو أن يعلمني، فلقد سبق واستخدمت dot.net 4.0 في البرمجة.
من أشكل عليه شيء فلا بأس بأن يطرح تساؤله هنا
أهلا ثانية إخواني
تكملة للبرنامج، ها هي نسخة جديدة من البرنامج المخصص لولايات الجزائر فقط
التعديلات:
- إضافة أنواع مختلفة من أصوات الأذان
- حفظ البيانات للاستخدام مستقبلا
- التنبيه من خلال أيقونة شريط المهام
فقط كملاحظة: تم تحميل التطبيق السابق أكثر من 30 مرة، لكنني لا أعرف إن اشتغل عند البعض أم لا
أعلم أنه عند البعض يطلب تحميل dotnet framework 4.0
سأقوم بإعادة البرنامج على الفريموورك 2.0
لمن لم يشتغل معه أرجو أن يعلمني لأن هذا ينفعني وينفع المبرمجين في بيئة الدوت نت.
المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى
المنتدى غير مسؤول عن أي إتفاق تجاري بين الأعضاء... فعلى الجميع تحمّل المسؤولية