PDA

View Full Version : سوال: چگونه تقویم شمسی در ویندوز فورم داشته باشیم؟



arman_Delta2002
یک شنبه 20 اسفند 1391, 19:07 عصر
سلام من میخوام کل برنامم از تقویم شمسی پیروی کنه بخواطر بعضی مشکلات که با تاریخ میلادی دارم
من کلی گشتم و دیدم با این کد ها میشه در asp سیستم گلوبال سایت رو فارسی کرد ولی روی ویندوز فرم خطا میده
راهی هست که سیستم شمسی رو ویندوز پشتیبانی کنه؟

Protected Sub aa()
Dim calture As New System.Globalization.CultureInfo("fa-IR")
Dim info As System.Globalization.DateTimeFormatInfo = calture.DateTimeFormat
info.AbbreviatedDayNames = New String() {"یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
info.DayNames = New String() {"یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
info.AbbreviatedMonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.MonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.AMDesignator = "ق.ظ"
info.PMDesignator = "ب.ظ"
info.ShortDatePattern = "yyyy/MM/dd"
info.FirstDayOfWeek = DayOfWeek.Saturday
Dim cal As New System.Globalization.PersianCalendar()
GetType(System.Globalization.DateTimeFormatInfo).G etField("calendar", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).SetValue (info, cal)
'object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
'obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
GetType(System.Globalization.CultureInfo).GetField ("calendar", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal)
System.Threading.Thread.CurrentThread.CurrentCultu re = calture
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info

End Sub
Public Shared Sub SetCalendar()
Dim calture As New System.Globalization.CultureInfo("fa-IR")
Dim info As System.Globalization.DateTimeFormatInfo = calture.DateTimeFormat

info.AbbreviatedDayNames = New String() {"ی", "د", "س", "چ", "پ", "ج", "ش"}
info.ShortestDayNames = New String() {"ی", "د", "س", "چ", "پ", "ج", "ش"}
info.DayNames = New String() {"یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
info.AbbreviatedMonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.MonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.AMDesignator = "ق.ظ"
info.PMDesignator = "ب.ظ"
info.ShortDatePattern = "yyyy/MM/dd"
info.LongDatePattern = "yyyy/MM/dd"
info.FirstDayOfWeek = DayOfWeek.Saturday

Dim cal As New System.Globalization.PersianCalendar()

GetType(System.Globalization.DateTimeFormatInfo).G etField("calendar", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).SetValue (info, cal)
Dim obj As Object = GetType(System.Globalization.DateTimeFormatInfo).G etField("m_cultureTableRecord", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).GetValue (info)
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance).Invoke(ob j, New Object() {cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).GetValue (cal, Nothing)})
GetType(System.Globalization.CultureInfo).GetField ("calendar", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal)

System.Threading.Thread.CurrentThread.CurrentCultu re = calture
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info
End Sub

Public Shared Sub SetCalendar2()
Dim calture As New System.Globalization.CultureInfo("fa-IR")
Dim info As System.Globalization.DateTimeFormatInfo = calture.DateTimeFormat

Dim cal As System.Globalization.Calendar = New System.Globalization.HijriCalendar()

GetType(System.Globalization.DateTimeFormatInfo).G etField("calendar", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).SetValue (info, cal)
Dim obj As Object = GetType(System.Globalization.DateTimeFormatInfo).G etField("m_cultureTableRecord", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).GetValue (info)
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance).Invoke(ob j, New Object() {cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).GetValue (cal, Nothing)})
GetType(System.Globalization.CultureInfo).GetField ("calendar", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal)

End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
On Error Resume Next
Call aa()
SetCalendar()
SetCalendar2()
System.Threading.Thread.CurrentThread.CurrentCultu re = New System.Globalization.CultureInfo("fa-IR")
Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("fa-IR")
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture
System.Threading.Thread.CurrentThread.CurrentCultu re.DateTimeFormat.Calendar = New System.Globalization.JulianCalendar

Me.Text = DateTime.Now.ToLongDateString()
End Sub

arman_Delta2002
یک شنبه 20 اسفند 1391, 19:11 عصر
خیلی واسم مهمه حتماا یک راهی پیدا کنین که بشه باهاش سیستم پروژم کاملا از شمسی پشتیبانی کنه
اینطوری محصولات dev به طور کامل شمیسی میشه
این خط رو خطا میده

Dim obj As Object = GetType(System.Globalization.DateTimeFormatInfo).G etField("m_cultureTableRecord", System.Reflection.BindingFlags.Public Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).GetValue (info)

کد بالا 4 کد هستن که هر کدوم زور میزنن شمسی کنن سیستم رو ولی خطا میده چرا؟
Object reference not set to an instance of an object.

arman_Delta2002
دوشنبه 21 اسفند 1391, 08:08 صبح
ساتید رفع این خطا خیلی مهمه اینم یه عکس از خطا
101238

pooya1072
دوشنبه 21 اسفند 1391, 13:32 عصر
سلام دوست عزیز
من کدهای شما رو کپی و اجرا کردم.بدون ارور اجرا شد.فقط یه مشکل اینکه توی فرم همون تاریخ میلادی نمایش داده میشه.نمیدونم مشکل کجاست .
در ضمن یک سوال اساسی برای من پیش اومده . من تا حالا روی این موضوع کار نکرده بودم ( منظورم همین تبدیل تاریخه ) .الان که با این برنامه کار کردم متوجه شدم با PersianCalender می تونیم به تاریخ شمسی مورد نظرمون با توجه به تاریخ میلادی سیستم , دسترسی داشته باشیم . حالا سوال من از شما ... منظور شما از نوشتن این کدها فقط این بوده که معادل روز و ماه یه تاریخ میلادی رو به فارسی توی برنامه بدست بیارید یا هدفی بالاتر دارید؟ اگه ممکنه یه مقدار توضیح بدید.
آخه میدونید اگه منظور شما قسمت قرمز رنگه (که احتمال خیلی زیاد نیست) خیلی راحت تر از این انجام میشه و در غیر این صورت شما برای من بگید جریان از چه قراره؟

arman_Delta2002
دوشنبه 21 اسفند 1391, 17:19 عصر
من میخوام که با استفاده از این روش ساچدولر دی ای وی رو شمسی کنم تو asp جواب میده ولی تو ویندوز فرم نمیدونم چشه !!!
بخواطر این خطا نداد که من دستور on error Resum Next رو استفاده کردم کخ خطا ها رو نادیده میگیره و تاریخ میلادی رو بجای شمسی بر میگردونه

pooya1072
دوشنبه 21 اسفند 1391, 21:23 عصر
سلام
یه قطعه کد از شخصی به نام "رضا تاروشه " یا "رضا تروشه" (Reza Taroosheh) پیدا کردم . کاری که می خوای رو انجام داده ولی به زبان C#‎
اجراش کردم و جواب داد . شما هم امتحان کن . اگه نتیجه داد که خبر بده . من همچنان سرچ می کنم . برای من هم جالبه .متاسفانه نتونستم برات آپلودش کنم .ولی لینکش رو میزارم.
اینم لینک (http://www.codeproject.com/Articles/32096/How-to-Set-PersianCalendar-to-CultureInfo)

arman_Delta2002
دوشنبه 21 اسفند 1391, 22:31 عصر
دستتون درد نکنه ولی
در حالت کنسول درسته ولی بازم همون خطا رو داد در ویندوز فرم چرا!!:عصبانی++:

pooya1072
دوشنبه 21 اسفند 1391, 23:35 عصر
اگه تو کنسول جواب بده توی فرم هم جواب میده . دارم روش کار می کنم.

pooya1072
سه شنبه 22 اسفند 1391, 11:03 صبح
سلام مجدد
خیلی گشتم . چیزی که فهمیدم اینه که تمام ایراد کار از Framwork یه که برنامه تحت اون اجرا میشه . نکته جالب و غم انگیز اینه که اگه تحت فریم ورکی پایین تر از 4 کار کنیم این مشکلات پیش نمیاد . همه مشکل با فیلدی تحت عنوان CultureTableRecord در system.Globalization که توی فریم ورک پایین تر از 4 وجود داره ولی توی فریم ورک 4 به این اسم موجود نیست . اگه برنامه ای که لینکش رو دادم چک کنی میبینی که تحت فریم ورک 2 کار میکنه .تا اینجای کار که ظاهرا راهی پیدا نکردیم . اگه شما کاری کرده من هم خبر کن . مرسی

arman_Delta2002
سه شنبه 22 اسفند 1391, 15:22 عصر
این کد به زبان سی شارپ درست کار کرد فقط مونده ببینم با Dev سازگار میشه!

CultureInfo ci = new CultureInfo("fa-IR");

DateTimeFormatInfo dtfi = ci.DateTimeFormat;
dtfi.AbbreviatedDayNames = new string[] { "ي", "د", "س", "چ", "پ", "ج", "ش" };
dtfi.DayNames = new string[] { "يكشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه" };
string[] monthNames = new string[] { "فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهريور", "مهر", "آبان", "آذر", "دي", "بهمن", "اسفند", "" };
dtfi.AbbreviatedMonthNames = dtfi.MonthNames = dtfi.MonthGenitiveNames = dtfi.AbbreviatedMonthGenitiveNames = monthNames;
dtfi.AMDesignator = "ق.ظ";
dtfi.PMDesignator = "ب.ظ";
dtfi.ShortDatePattern = "yy/MM/dd";
dtfi.FirstDayOfWeek = DayOfWeek.Saturday;

Calendar cal = new PersianCalendar();

dtfi.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(dtfi, cal);

ci.NumberFormat.NumberDecimalSeparator = "/";
ci.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
ci.NumberFormat.NumberNegativePattern = 0;

System.Threading.Thread.CurrentThread.CurrentCultu re = ci;
System.Threading.Thread.CurrentThread.CurrentUICul ture = ci; string str = DateTime.Now.ToString("yyyy/MM/dd");
this.Text = str;

pooya1072
سه شنبه 22 اسفند 1391, 15:47 عصر
معادلش توی ویبی هم درست بود ... جواب داد ...شما هم تست کن.

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Globalization
Imports System.Reflection
Imports System.Threading
Public Class PersianCulture
Private Sub PersianCulture_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim ci As CultureInfo = New CultureInfo("fa-IR")
Dim dtfi As DateTimeFormatInfo = ci.DateTimeFormat
dtfi.AbbreviatedDayNames = New String() {"ي", "د", "س", "چ", "پ", "ج", "ش"}
dtfi.DayNames = New String() {"يكشنبه", "دوشنبه", "سه شنبه", "چهار شنبه", "پنجشنبه", "جمعه", "شنبه"}
Dim monthNames As String() = New String() {"فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهريور", "مهر", "آبان", "آذر", "دي", "بهمن", "اسفند", ""}
dtfi.AbbreviatedMonthNames = dtfi.MonthNames
dtfi.AMDesignator = "ق.ظ"
dtfi.PMDesignator = "ب.ظ"
dtfi.ShortDatePattern = "yy/MM/dd"
dtfi.FirstDayOfWeek = DayOfWeek.Saturday
Dim cal As Calendar = New PersianCalendar()
dtfi.GetType().GetField("calendar", BindingFlags.NonPublic Or BindingFlags.Instance).SetValue(dtfi, cal)
ci.NumberFormat.NumberDecimalSeparator = "/"
ci.NumberFormat.DigitSubstitution = DigitShapes.NativeNational
ci.NumberFormat.NumberNegativePattern = 0
System.Threading.Thread.CurrentThread.CurrentCultu re = ci
System.Threading.Thread.CurrentThread.CurrentUICul ture = ci
Dim str As String = DateTime.Now.ToString("yyyy/MM/dd")
Me.Text = str
End Sub
End Class

arman_Delta2002
سه شنبه 22 اسفند 1391, 15:49 عصر
یه مقداریش شمسی شده دارم بازم روش کار میکنم
زمانی که میخوای یه رویداد جدید تعریف کنی با کلیک راست روی نوار پیمایشش
و با باز شدن کلندر میبیمیم که نوشته اسفند 91 ولی روزاش میلادیه و زمانی که انتخواب میشه هم میلادیه
101332

arman_Delta2002
چهارشنبه 23 اسفند 1391, 05:08 صبح
آییی دیددد ایت اییی دییید اییت
101372
به زودی آموزشش قرار میگیره
ساعت 5:45 صبح:قهقهه:

arman_Delta2002
چهارشنبه 23 اسفند 1391, 06:15 صبح
http://www.eqbalpc.com/forum/showthread.php?8-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B4%D9%85%D8%B3%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-XtraScheduler (http://www.eqbalpc.com/forum/forumdisplay.php?13-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%A8%DB%8C%D8%B3%DA%A9-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA)

101373

ali reza mansoori 2
پنج شنبه 24 اسفند 1391, 12:37 عصر
خسته نباشید دوستان
خیلی عالی بود
ولی چرا اسفند 31 روز داره

arman_Delta2002
پنج شنبه 24 اسفند 1391, 12:57 عصر
اینو نمیدونم از ماکرو سافت باید پرسید :قهقهه:

pooya1072
جمعه 25 اسفند 1391, 15:12 عصر
سلام مجدد...
این برنامه رو جهت استفاده از تقویم MonthCalendar نمیشه بکار برد ؟

y.saied
جمعه 25 اسفند 1391, 19:53 عصر
سلام
برای استفاده در MonthCalendar باید چیکار کرد؟
ممنون که جواب میدین

arman_Delta2002
جمعه 25 اسفند 1391, 21:18 عصر
نه هنوز اون شمسی نشده
نمیدونم چرا با این که تاریخ رو به صورت سیستمی شمسی میکنه ولی مون کلندر شمسی نمیشه!!!