2013-08-01, 18:27
|
رقم المشاركة : 1
|
معلومات
العضو |
|
إحصائية
العضو |
|
|
برنامج الأذان المعدل بالسي شارب
السلام عليكم
سبق وأن أنجز أخانا MHDM برنامج للتذكير بالآذان باستخدام الفيبي دوت نت، ولقد ناقشنا ذلك في هذا الموضوع
https://www.djelfa.info/vb/showthread.php?t=1327951
ولقد كانت لي مشاركة هنا وأشرت أن الكلاس الموجود في النت يا إما خاطئ أو أنني لم أفهمه
https://www.djelfa.info/vb/showthread...post1053621218
ولكن المشكلة صعبة الاكتشاف، لقد كانت في قيم خطوط الطول والعرض والموجودة في ملف xml
فالقيم موجودة دون فاصلة في حين الحقيقية موجودة بالفاصلة
مثلا قيم الطول والعرض لمستغانم في ملف xml ها هي
كود بلغة HTML:
<city name="مستغانم">
<latitude>359170</latitude>
<longitude>1567</longitude>
</city>
لكن في الحقيقة هي صغيرة وليست كبيرة
كود بلغة HTML:
<city name="مستغانم">
<latitude>35.9170</latitude>
<longitude>0.1567</longitude>
</city>
واكتشفت ذلك بالصدفة لعدم تعاملي مع مفهوم خطوط الطول والعرض رغم أننا درسناها في الابتدائي
بعد اكتشاف الخلل تم تصحيح البرنامج وها هو يعمل بشكل سليم
كلاس الحساب
كود 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;
public AthanForm() { InitializeComponent(); }
private void AthanForm_Load(object sender, EventArgs e) {
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"; // عرض اسم الولاية في الكومبوبوكس
}
protected void Exit_Click(Object sender, System.EventArgs e) { Application.Exit(); } protected void Hide_Click(Object sender, System.EventArgs e) { this.Hide(); } protected void Show_Click(Object sender, System.EventArgs e) { this.Show(); }
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); // هنا نستدعي الكلاس الجاهز الذي يحسب أوقات الصلاة
//استخلاص وقت كل صلاة lblFajr.Text = calculator.FajrHour.ToString("00") + ":" + calculator.FajrMin.ToString("00"); lblLocalNoon.Text = calculator.LocalNoonHour.ToString("00") + ":" + calculator.LocalNoonMin.ToString("00"); lblAsr.Text = calculator.AsrHour.ToString("00") + ":" + calculator.AsrMin.ToString("00"); lblSunSet.Text = calculator.SunSetHour.ToString("00") + ":" + calculator.SunSetMin.ToString("00"); lblEsha.Text = calculator.EshaHour.ToString("00") + ":" + calculator.EshaMin.ToString("00");
}
} }
فقط للتنبيه، قد تجد فارقا بسيطا في الفجر والعشاء، وهذا لاعتماد بعض البرامج طريقة هيئة العالم الاسلامي في الحساب، في حين الكلاس المستخدم هنا يعتمد جامعة كاراتشي في الحساب، فالفرق طفيف، علما أنه يوجد العديد من طرق الحساب العالمية.
من يحتاج لمواقيت الصلاة في بلدان أخرى فما عليه إلا استبدال ملف algeria.xml مع الحفاظ على التسمية.
كما أنني استخدمت أسامي إنجليزية في تسمية المتغيرات والدوال وهذا لأنني معقد من الفرنسية على اعتبارها لغة دخيلة على البرمجة.
وأثناء التسمية قاربت الأسلوب العالمي في التسمية
يعني Now من نوع interger يسمى هكذا : iNow
المتغير SalatTime من نوع string يسمى هكذا: sSalatTime
الكنترول Wilaya من نوع ComboBox يسمى هكذا: cbWilaya
Label = lbl
TextBox = txt
Button = btn
ListBox = lb
.... إلخ
وهذا هو الاسلوب المعتمد عالميا فلنعتمده.
من يجد مشكلة في تشغيل التطبيق فأرجو أن يعلمني، فلقد سبق واستخدمت dot.net 4.0 في البرمجة.
من أشكل عليه شيء فلا بأس بأن يطرح تساؤله هنا
هذه النسخة الأولى، ستحسن لاحقا إن شاء الله.
لتحميل التطبيق
https://www.gulfup.com/?MmxboL
لتحميل السورس والتعديل عليه
https://www.gulfup.com/?ruAeCv
أهلا ثانية إخواني
تكملة للبرنامج، ها هي نسخة جديدة من البرنامج المخصص لولايات الجزائر فقط
التعديلات:
- إضافة أنواع مختلفة من أصوات الأذان
- حفظ البيانات للاستخدام مستقبلا
- التنبيه من خلال أيقونة شريط المهام
فقط كملاحظة: تم تحميل التطبيق السابق أكثر من 30 مرة، لكنني لا أعرف إن اشتغل عند البعض أم لا
أعلم أنه عند البعض يطلب تحميل dotnet framework 4.0
سأقوم بإعادة البرنامج على الفريموورك 2.0
لمن لم يشتغل معه أرجو أن يعلمني لأن هذا ينفعني وينفع المبرمجين في بيئة الدوت نت.
تحميل التطبيق
https://www.gulfup.com/?TKRnLn
|
|
|