در اين بخش مي‌توانيد به مباحث مربوط به انواع زبان هاي برنامه نويسي بپردازيد
Major

Major



نماد کاربر
پست ها

57

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

شنبه 20 اسفند 1384 12:23

آرشيو سپاس: 12 مرتبه در 7 پست

توابع محاسباتي تاريخ هجري شمسي

توسط ORZ » جمعه 25 فروردین 1385 00:57

به نام خدا

يكي از نقصهاي سيستم عامل ويندوز براي كاربران فارسي زبان و ايراني، عدم پشتيباني آن از تقويم هجري شمسي و عدم توانايي محاسبات بر مبناي تاريخ شمسي مي‌باشد. آخرين نسخه‌هايي اين سيستم عامل داراي ابزارهايي براي پشتيباني از كاراكترهاي فارسي و امكان تايپ فارسي مي‌باشند، اما گويا شركت ميكروسافت به اين نياز مهم (يعني يك تقويم شمسي براي ويندوز) توجهي نكرده است.

رفع اين مشكل به خصوص براي برنامه نويساني كه به نوعي در برنامه هاي خود بايد از تاريخ هجري شمسي و يا محاسباتي بر مبناي اين قالب تاريخ انجام دهند، بسيار حياتي است. به همين دليل گروه نرم افزاري اوكسين اقدام به طراحي و عرضه ي تعدادي از توابع كتابخانه اي (DLL) نموده است كه مشكل برنامه نويسان ايراني را تا حد زيادي در اين زمينه حل مي‌كند. به عنوان مثال نرم افزار حسابدار Xp نگارش سوم از اين توابع استفاده مي‌كند.

اين توابع به صورت كاملا دقيق، تاريخ ميلادي سيستم را به تاريخ هجري شمسي تبديل مي‌نمايند و همچنين توابع ديگري را براي انجام محاسبات روي اين تاريخ در دسترس قرار مي‌دهند. يكي از ويژگيهاي جالب توجه اين كلاس (كه بسياري از كلاسهاي مشابه نوشته شده در اين زمينه فاقد ان هستند) عملكرد دقيق آنها روي سالهاي كبيسه است. همانطور كه مي‌دانيد در سيستم تاريخ شمسي بعضي از سالها كبيسه هستند و در آنها ماه اسفند سي روز مي‌باشد. اين سالها به صورت متناوب هر چهار سال يكبار تكرار مي‌شوند و چون اين سالها از سالهاي عادي يكروز بيشتر هستند، لذا بايد در محاسبات تاريخ اين نكته را مدنظر قرار داد، كه اين توابع به خوبي از آن پشتيباني مي‌كنند.

كلاسهاي اين توابع به صورت استاندارد تهيه و كامپايل شده است تا تمام برنامه نويسان بتوانند از آنها در زبانهاي برنامه نويسي گوناگون مانند دلفي، ويژوال بيسيك، سي شارپ و همه ي زبانهاي ديگري كه از استاندارد COM پشتيباني مي‌كنند، استفاده كنند.

اين توابع در كلاسي به نام ClassShamsi در فايل Shamsi.dll قرار دارند. در ادامه ابتدا به معرفي اين توابع مي‌پردازيم و سپس با مثالهايي، چگونگي فراخواني و استفاده از اين توابع را در زبان برنامه نويسي ويژوال بيسيك بررسي مي‌كنيم. فراخواني و كاربرد توابع در زبانهاي ديگر نيز تقريبا مشابه با ويژوال بيسيك است.

در یافت فایل:

http://www.omid5531.persiangig.com/sour ... msidll.rar

توضیحات:


در نگارش دوم اين كتابخانه، چهار تابع جديد به نامهاي Shamsi2Miladi, Miladi2Shamsi, ShamsiIncrease و ShamsiDecrease اضافه شده كه در زير توضيحات كامل
در مورد اين توابع جديد را مي‌بينيد.

توضيح نام تابع
تاريخ جاري سيستم را به تاريخ شمسي تبديل ميكند و به صورت yyyy/mm/dd برمي گرداند. Shamsi () as string



يك تاريخ را دريافت كرده و در صورتي كه تاريخ شمسي معتبر باشد مقدار True و در غير اين صورت مقار False برمي گرداند. IsShamsi (date) as boolean



يك تاريخ شمسي را دريافت مي كند و در صورتي كه سال آن كبيسه باشد مقدار True و در غير اين صورت مقدار False برمي گرداند. IsKabiseh (date) as boolean

يك تاريخ شمسي دريافت مي‌كند و عدد مربوط به سال آن را برمي‌گرداند. ShamsiYear (date) as integer


يك تاريخ شمسي دريافت مي‌كند و عدد مربوط به ماه آن را برمي‌گرداند. ShamsiMonth (date) as integer

يك تاريخ شمسي دريافت مي‌كند و عدد مربوط به روز آن را برمي‌گرداند. ShamsiDay (date) as integer

عدد مربوط به سال تاريخ جاري را بر مي گرداند. ShamsiCurrentYear () as integer

عدد مربوط به ماه تاريخ جاري را بر مي گرداند. ShamsiCurrentMonth () as integer

عدد مربوط به روز تاريخ جاري را بر مي گرداند. ShamsiCurrentDay () as integer

يك تاريخ شمسي دريافت مي كند و نام ماه آن را برمي‌گرداند. ShamsiMonthName (date) as string

نام ماه تاريخ جاري را برمي گرداند. ShamsiCurrentMonthName () as string

شماره‌ي روز هفته‌ي تاريخ جاري را برمي‌گرداند. ShamsiWeekDay () as integer

نام روز هفته‌ي تاريخ جاري را برمي‌گرداند. ShamsiWeekDayName () as string

يك تاريخ شمسي دريافت مي كند و تعداد روزهاي آنرا از 29/12/1330 به بعد محاسبه مي كند. Shamsi2Day (date) as long

دو تاريخ شمسي دريافت مي‌كند و تفاضل تاريخ اول از تاريخ دوم را بر حسب روز برمي گرداند. ShamsiDiff (date1, date2) as long

يك تاريخ ميلادي دريافت مي كند و آن را به تاريخ شمسي معادل آن تبديل مي كند. Miladi2Shamsi  (date) as String

يك تاريخ شمسي دريافت مي كند و آن را به تاريخ ميلادي معادل آن تبديل مي كند. Shamsi2Miladi (date) as String

يك تاريخ شمسي و يك مقدار عددي دريافت مي كند و به تاريخ وارد شده آن مقدار عددي را مي‌افزايد. ShamsiIncrease (date, amount) as String

يك تاريخ شمسي و يك مقدار عددي دريافت مي كند و از تاريخ وارد شده آن مقدار عددي را كسر مي‌كند. ShamsiDecrease (date, amount) as String  

براي فراخواني اين توابع در ويژوال بيسيك ابتدا بايد فايل shamsi.dll را به پروژه اضافه كنيم. براي اين منظور در محيط ويژوال يسيك از منوي Project گزينه ي Refernces را انتخاب كنيد. در كادر باز شده روي كليد Browse كليك كنيد و مسير فايل را معرفي كنيد. (دقت كنيد كه اگر كلاسهاي فايل shamsi.dll با استفاده از regserver ثبت شده باشند، فقط كافيست در ليست موجود در اين پنجره به دنبال Oxinsoft hijri shamsi calender functions بگرديد و آن را علامت بزنيد) حالا توابع شمسي به پروژه شما اضافه شده است. براي فراخواني اين توابع مي توانيد يك Module به پروژه اضافه كنيد و كدهاي زير را براي فراخواني توابع به آن اضافه كنيد:

d
تابع Shamsi

اين تابع تاريخ ميلادي سيستم را به تاريخ شمسي تبديل مي كند و آن را به صورت يك رشته برمي گرداند. براي فراخواني آن كدهاي زير را وارد كنيد:

Public Function Shamsi() as string

dim shms as New ClassShamsi

Shamsi = shms.Shamsi
End Function

حالا شما تابع Shamsi را با خروجي رشته اي انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام shamsi استفاده كنيد.

  
تابع IsShamsi

اين تابع يك تاريخ شمسي دريافت كرده و چك مي كند كه آيا اين تاريخ يك تاريخ معتبر هست يا خير. خروجي اين تابع به صورت يك مقدار صحيح يا غلط است.

تاريخهاي معتبر شمسي بايد به صورت روز/ماه/ سال باشند. به اين معني كه در سمت چپ عبارت يك عدد چهار رقمي بزرگتر از 1330 به عنوان شماره ي سال، سپس يك علامت اسلش / به عنوان جداكننده، يك عدد دورقمي بين 1 و 12 به عنوان ماه سال، مجددا علامت اسلش و در نهايت يك عدد دورقمي بين 1 و 31 به عنوان روز ماه قرار دارند. دقت كنيد كه به دليل اينكه تاريخهاي قديمي عملا بلاستفاده هستند، براي محاسبات تاريخ در كلاسهاي شمسي تاريخهاي بعد از29/12/1330 معتبر هستند.

نكته مهم ديگري كه بايد در رابطه با تاريخهاي شمسي مدنظر داشت اين است كه براي نوشتن شماره ي ماه و يا روز در صورتي كه اين شماره ها يك عدد تك رقمي باشند، بايد حتما رقم صفر قبل از آنها قرار بگيرد. به عنوان مثال تاريخ 4/8/1383 نادرست و صحيح آن 04/08/1383 مي باشد.

براي فراخواني تابع IsShamsi از كدهاي زير استفاده كنيد:

Public Function IsShamsi(shdate as string) as boolean

dim shms as New ClassShamsi

IsShamsi = shms.isshamsi(shdate)i
End Function

حالا شما تابع IsShamsi را با خروجي بولين انتخاب كرده ايد و براي استفاده از آن در هر قسمت برنامه مي توانيد از همين نام IsShamsi استفاده كنيد. در صورتي كه تاريخ ورودي تابع معتبر باشد، اين تابع مقدار True و در غير اين صورت مقدار False را برمي گرداند.

  
تابع IsKabiseh

اين تابع يك تاريخ شمسي دريافت كرده و چك مي كند كه آيا اين سال اين تاريخ كبيسه است يا خير. خروجي اين تابع به صورت يك مقدار صحيح يا غلط است.

براي فراخواني تابع IsKabiseh از كدهاي زير استفاده كنيد:

Public Function IsKabiseh(shdate as string) as boolean

dim shms as New ClassShamsi

IsKabiseh = shms.iskabiseh(shdate)i
End Function

حالا شما تابع IsKabiseh را با خروجي بولين انتخاب كرده ايد و براي استفاده از آن در هر قسمت برنامه مي توانيد از همين نام IsKabiseh استفاده كنيد. در صورتي كه تاريخ ورودي كبيسه باشد، اين تابع مقدار True و در غير اين صورت مقدار False را برمي گرداند.

  
تابع ShamsiYear

اين تابع يك تاريخ شمسي را به صورت رشته دريافت كرده و عدد مربوط به سال آن را برمي گرداند. خروجي اين تابع به صورت يك عدد صحيح است. به عنوان مثال اين تابع با دريافت تاريخ 12/08/1383 مقدار 1383 را برمي گرداند.

براي فراخواني تابع ShamsiYear از كدهاي زير استفاده كنيد:

Public Function ShamsiYear(shdate as string) as integer

dim shms as New ClassShamsi

ShamsiYear = shms.ShamsiYear(shdate)i
End Function

حالا شما تابع ShamsiYear را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام shamsiYear استفاده كنيد.

  
تابع ShamsiMonth

اين تابع يك تاريخ شمسي را به صورت رشته دريافت كرده و عدد مربوط به ماه آن را برمي گرداند. خروجي اين تابع به صورت يك عدد صحيح است. به عنوان مثال اين تابع با دريافت تاريخ 12/08/1383 مقدار 8 را برمي گرداند.

براي فراخواني تابع ShamsiMonth از كدهاي زير استفاده كنيد:

Public Function ShamsiMonth(shdate as string) as integer

dim shms as New ClassShamsi

ShamsiMonth = shms.ShamsiMonth(shdate)i
End Function

حالا شما تابع ShamsiMonth را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام shamsiMonth استفاده كنيد.

  
تابع ShamsiDay

اين تابع يك تاريخ شمسي را به صورت رشته دريافت كرده و عدد مربوط به روز آن را برمي گرداند. خروجي اين تابع به صورت يك عدد صحيح است. به عنوان مثال اين تابع با دريافت تاريخ 12/08/1383 مقدار 12 را برمي گرداند.

براي فراخواني تابع ShamsiDay از كدهاي زير استفاده كنيد:

Public Function ShamsiDay(shdate as string) as integer

dim shms as New ClassShamsi

ShamsiDay = shms.ShamsiDay(shdate)i
End Function

حالا شما تابع ShamsiDay را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام shamsiDay استفاده كنيد.

  
تابع ShamsiCurrentYear

ااين تابع عدد مربوط به سال تاريخ جاري را برمي گرداند. خروجي اين تابع به صورت يك عدد صحيح است.
براي فراخواني تابع ShamsiCurrentYear از كدهاي زير استفاده كنيد:

Public Function ShamsiCurrentYear() as integer

dim shms as New ClassShamsi

ShamsiCurrentYear = shms.ShamsiCurrentYear()i
End Function

حالا شما تابع ShamsiCurrentYear را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiCurrentYear استفاده كنيد.

  
تابع ShamsiCurrentMonth

اين تابع عدد مربوط به ماه تاريخ جاري را برمي گرداند. خروجي اين تابع به صورت يك عدد صحيح است.
براي فراخواني تابع ShamsiCurrentMonth از كدهاي زير استفاده كنيد:

Public Function ShamsiCurrentMonth() as integer

dim shms as New ClassShamsi

ShamsiCurrentMonth = shms.ShamsiCurrentMonth()i
End Function

حالا شما تابع ShamsiCurrentMonth را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiCurrentMonth استفاده كنيد.

  
تابع ShamsiCurrentDay

اين تابع عدد مربوط به روز تاريخ جاري را برمي گرداند. خروجي اين تابع به صورت يك عدد صحيح است.
براي فراخواني تابع ShamsiCurrentDay از كدهاي زير استفاده كنيد:

Public Function ShamsiCurrentDay() as integer

dim shms as New ClassShamsi

ShamsiCurrentDay = shms.ShamsiCurrentDay()i
End Function

حالا شما تابع ShamsiCurrentDay را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiCurrentDay استفاده كنيد.

  
تابع ShamsiMonthName

اين تابع يك تاريخ شمسي را دريافت مي‌كند و نام ماه آن را برمي گرداند. خروجي اين تابع به صورت رشته است. به عنوان مثال اگر ورودي تابع 12/06/1383 باشد تابع مقدار «شهريور» را برمي گرداند.
براي فراخواني تابع ShamsiMonthName از كدهاي زير استفاده كنيد:

Public Function ShamsiMonthName(shdate as string) as string

dim shms as New ClassShamsi

ShamsiMonthName = shms.ShamsiMonthName(shdate)i
End Function

حالا شما تابع ShamsiMonthName را با خروجي رشته اي انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiMonthName استفاده كنيد.

  
تابع ShamsiCurrentMonthName

اين تابع نام ماه تاريخ جاري را برمي گرداند. خروجي اين تابع به صورت رشته است.
براي فراخواني تابع ShamsiCurrentMonthName از كدهاي زير استفاده كنيد:

Public Function ShamsiCurrentMonthName() as string

dim shms as New ClassShamsi

ShamsiCurrentMonthName = shms.ShamsiCurrentMonthName()i
End Function

حالا شما تابع ShamsiCurrentMonthName را با خروجي رشته اي انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiCurrentMonthName استفاده كنيد.

  
تابع ShamsiWeekDay

اين تابع كد روز هفته ي تارخ جاري را برمي گرداند. خروجي اين تابع يك عدد صحيح است. خروجي اين تابع براي روز شبه عدد 1، براي يكشنبه عدد2 و به همين ترتيب تا جمعه عدد 7 است.
براي فراخواني تابع ShamsiWeekDay از كدهاي زير استفاده كنيد:

Public Function ShamsiWeekDay() as integer

dim shms as New ClassShamsi

ShamsiWeekDay = shms.ShamsiWeekDay()i
End Function

حالا شما تابع ShamsiWeekDay را با خروجي عدد صحيح انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiWeekDay استفاده كنيد.

  
تابع ShamsiWeekDayName

ين تابع نام روز هفته ي (شنبه، يكشنبه،...) تارخ جاري را برمي گرداند. خروجي اين تابع يك رشته است.
براي فراخواني تابع ShamsiWeekDayName از كدهاي زير استفاده كنيد:

Public Function ShamsiWeekDayName() as string

dim shms as New ClassShamsi

ShamsiWeekDayName = shms.ShamsiWeekDayName()i
End Function

حالا شما تابع ShamsiWeekDayName را با خروجي رشته اي انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiWeekDayName استفاده كنيد.

  
تابع Shamsi2Day

اين تابع يك تاريخ شمسي را دريافت ميكند و تعداد روزهاي سپري شده از تاريخ 29/12/1330 را تا تاريخ دريافت شده به صورت يك عدد برمي گرداند. به عنوان مثال اگر تاريخ ورودي 01/01/1331 باشد، خروجي تابع عدد 1 مي باشد و يا به ازاي ورودي 27/08/1383 خروجي تابع 19236 است. اين تابع با درنظر گرفتن يك روز اضافه در سالهاي كبيسه، بسيار دقيق عمل مي كند.
براي فراخواني تابع Shamsi2Day از كدهاي زير استفاده كنيد:

Public Function Shamsi2Day(shdate as string) as Long

dim shms as New ClassShamsi

Shamsi2Day = shms.Shamsi2Day(shdate)i
End Function

حالا شما تابع Shamsi2Day را با خروجي Long ايانتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام Shamsi2Day استفاده كنيد.

  
تابع ShamsiDiff

اين تابع دو تاريخ شمسي را دريافت نموده و اختلاف تاريخ اول از تاريخ دوم را بر حسب روز برمي گرداند. به عنوان مثال اگر وردي هاي تابع به ترتيب 12/08/1383 و 05/06/1383 باشد، تابع مقدار 68 را برمي گرداند. يعني بين اين دو تاريخ 68 روز اختلاف هست. خروجيا اين تابع يك عدد است.
براي فراخواني تابع ShamsiDiff از كدهاي زير استفاده كنيد:

Public Function ShamsiDiff(shdate1 as string, shdate2 as string) as Long

dim shms as New ClassShamsi

ShamsiDiff = shms.ShamsiDiff(shdate1, shdate2)i
End Function

حالا شما تابع ShamsiDiff را با خروجي Long ايانتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiDiff استفاده كنيد.

  
تابع Miladi2Shamsi
  
اين تابع يك تاريخ ميلادي را دريافت نموده و تاريخ دقيق شمسي معادل آن را برمي گرداند. به عنوان مثال اگر ورودي تابع 14/03/2005 باشد، تابع مقدار 24/12/1383 را برمي گرداند. خروجي اين تابع يك رشته است.
براي فراخواني تابع Miladi2Shamsi از كد زير استفاده كنيد:

Public Function Miladi2Shamsi(mdate as string) as String

dim shms as New ClassShamsi

Miladi2Shamsi= shms.Miladi2Shamsi(mdate)i
End Function

حالا شما تابع Miladi2Shamsi را با خروجي String انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام Miladi2Shamsi استفاده كنيد.
  
  
تابع Shamsi2Miladi
  
اين تابع يك تاريخ شمسي را دريافت نموده و تاريخ دقيق ميلادي معادل آن را برمي گرداند. به عنوان مثال اگر ورودي تابع  24/12/1383 باشد، تابع مقدار 14/03/2005 را برمي گرداند. خروجي اين تابع يك رشته است.
براي فراخواني تابع Shamsi2Miladi از كد زير استفاده كنيد:

Public Function Shamsi2Miladi(shdate as string) as String

dim shms as New ClassShamsi

Shamsi2Miladi= shms.Shamsi2Miladi(shdate)i
End Function

حالا شما تابع Shamsi2Miladi را با خروجي String انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام Shamsi2Miladi استفاده كنيد.
  

تابع ShamsiIncrease

اين تابع يك تاريخ شمسي و يك عدد صحيح را دريافت نموده و و به تاريخ دريافت شده، عدد ورودي را (به عنوان تعداد روز) اضافه نموده و تاريخ جديد را برمي گرداند. به عنوان مثال اگر ورودي تابع  02/12/1383 و عدد 8 باشد، تابع مقدار 10/12/1383 را برمي گرداند. خروجي اين تابع يك رشته است.
براي فراخواني تابع ShamsiIncrease از كد زير استفاده كنيد:

Public Function ShamsiIncrease(shdate as string, amount as long) as String

dim shms as New ClassShamsi

ShamsiIncrease= shms.ShamsiIncrease(shdate, amount)i
End Function

حالا شما تابع ShamsiIncrease را با خروجي String انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiIncrease استفاده كنيد.


تابع ShamsiDecrease

اين تابع يك تاريخ شمسي و يك عدد صحيح را دريافت نموده و و از تاريخ دريافت شده، عدد ورودي را (به عنوان تعداد روز) كم نموده و تاريخ جديد را برمي گرداند. به عنوان مثال اگر ورودي تابع  02/12/1383 و عدد 8 باشد، تابع مقدار 24/11/1383 را برمي گرداند. خروجي اين تابع يك رشته است.
براي فراخواني تابع ShamsiDecrease از كد زير استفاده كنيد:

Public Function ShamsiDecrease(shdate as string, amount as long) as String

dim shms as New ClassShamsi

ShamsiDecrease= shms.ShamsiDecrease(shdate, amount)i
End Function

حالا شما تابع ShamsiDecrease را با خروجي String انتخاب كرده ايد و براي استفاده از آن در هركجاي برنامه مي توانيد از همين نام ShamsiDecrease استفاده كنيد.






توجه:

استفاده از فايل shamsi.dll توسط برنامه نويسان ايراني در برنامه ها و پروژهاي مختلف مجاز مي باشد. اين برنامه به صورت رايگان است و كاربر براي استفاده از ان مجبور به پرداخت هيچ حق استفاده اي نمي باشد. اما براي پشتيباني از سازنده ي اين برنامه، لطفا افرادي كه از آن در برنامه ها يا پروژه هاي خود استفاده مي كنند، با ارسال يك ايميل به طراح برنامه پشتيباني خود را اعلام كنند.

به علاوه طراح برنامه از نظرات و پيشنهادات شما در ارائه ي نگارشهاي بعدي استقبال خواهد كرد. لطفا هرگونه نظر يا پيشنهادي در مورد برنامه داريد و يا گزارش خود را در مورد باگهاي برنامه براي بنده ارسال كنيد. danesh@oxinsoft.com با تشكر

محمد رضا دانش

اسفند 1383
کسي را دوست داشته باش که قلب بزرگي داشته باشد
تا مجبور نباشي براي اينکه در قلب او جاي بگيري خودت را کوچک کني.

چه کسي حاضر است ؟

کاربران حاضر در اين انجمن: بدون كاربران آنلاين و 1 مهمان