PDA

View Full Version : یه ماژول و یه کنترل که تمام مشکلات تاریخ توش حل شده



saman_itc
یک شنبه 21 بهمن 1386, 08:21 صبح
با سلام خدمت دوستان
از راست به چپ عدد روز ماه سال می خواد
این روش تاریخ به صورت String ذخیره میشه
خیلی آسونه

1.ماژول تو برنامه Add کنید(Add Existing Item)
2.کنترل هم تو برنامه Add کنید و یه بار اجراش کنید تا تو نوار ابزار بیاد (Add Existing Item)
3.کنترل تو فرمی که میخواهید از تاریخ استفاده کنید قرار بدید.


UCtrl_Date1.Controls.Item(3).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Year)
UCtrl_Date1.Controls.Item(2).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Month)
UCtrl_Date1.Controls.Item(1).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Day)
dtemp = (UCtrl_Date1.Controls.Item(3).Text + "/" + UCtrl_Date1.Controls.Item(2).Text + "/" + UCtrl_Date1.Controls.Item(1).Text)

این کد باعث نمایش تاریخ شمسی تو کنترل تون میشه که تو فرم لود به کار میره
ادامش هم میگم خدمتون
فعلا..:لبخندساده:

saman_itc
یک شنبه 21 بهمن 1386, 08:22 صبح
dtemp یه متغییر String و حاوی تاریخ شمسی به فرمت yyyy/mm/dd

saman_itc
یک شنبه 21 بهمن 1386, 08:33 صبح
خوب حالا میمونه اینکه چه طور رشته ذخیره شده رو از بانک به کنترل بدیم و فرمتش هم دست نخوره



ol_cm = New OleDbCommand("select date1 from .....
If dro.HasRows = True Then
dro.Read()
UCtrl_Date1.Controls.Item(3).Text = ShamsiSplit(dro("date1"), ShSplit.Year)
UCtrl_Date1.Controls.Item(2).Text = ShamsiSplit(dro("date1"), ShSplit.Month)
UCtrl_Date1.Controls.Item(1).Text = ShamsiSplit(dro("date1"), ShSplit.Day)

شما اگه اسم فیلد تاریختون date1 باشه با این کد این کارو میتونید انجام بدین
من در خدمتم

saman_itc
دوشنبه 22 بهمن 1386, 10:23 صبح
آینم عکس از کنترل.به خاطر مشکلات تو MaskedTextBox مجبور به استفاده از این شدم .فکر کنم چیزه بدی در نیومده

saman_itc
دوشنبه 22 بهمن 1386, 23:38 عصر
از این کد ها هم میتونید واسه اختلاف بین و تاریخ و غلط بودن دو تاریخ استفاده کنید
و فرمتشو که بالا توضیح دادم .String شمسی
موفق باشین


If (IsShamsi(ShamsiForamt(UCDate_Line_Start.Date_Sham si.ToString, DateFormat.ShortDate)) = False) Or (IsShamsi(ShamsiForamt(UCDate_Line_End.Date_Shamsi .ToString, DateFormat.ShortDate)) = False) Then
Msgbox_Custom("تاریخ وارد شده معتبر نیست", 1, 1, "تاریخ")
Exit Sub
End If
''*******************************
If ShamsiForamt(UCDate_Line_Start.Date_Shamsi.ToStrin g, DateFormat.ShortDate) >= ShamsiForamt(UCDate_Line_End.Date_Shamsi.ToString, DateFormat.ShortDate) Then
Msgbox_Custom("تاریخ پایان باید بزرگتر از تاریخ شروع باشد", 1, 1, "تاریخ")
Exit Sub
End If

saman_itc
سه شنبه 23 بهمن 1386, 15:13 عصر
با سلام خدمت دوستان
خانم samira222 مثال استفاده از کد خواستن
ا


Private Sub Am_naghdi_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ol_cn = New OleDbConnection(er)
ol_cn.Open()
i1 = 0
Combo1.Items.Clear()
UCtrl_Date1.Controls.Item(3).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Year)
UCtrl_Date1.Controls.Item(2).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Month)
UCtrl_Date1.Controls.Item(1).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Day)
dtemp = (UCtrl_Date1.Controls.Item(3).Text + "/" + UCtrl_Date1.Controls.Item(2).Text + "/" + UCtrl_Date1.Controls.Item(1).Text)
Combo1.Items.Clear()
ol_cm = New OleDbCommand("select * from C_keshavarz ", ol_cn)
ol_da = New OleDbDataAdapter(ol_cm)
ds = New DataSet
ol_da.Fill(ds, "C_keshavarz")
End Sub

amir_pro
شنبه 11 اسفند 1386, 00:15 صبح
جناب saman_itc
شرمنده که این سوال را اینجا مطرح می کنم ولی میشه بفرمایید که داخل C# هم میشه استفاده کرد یا نه؟ و اگه میشه به چه صورت.
ممنون

saman_itc
شنبه 11 اسفند 1386, 07:31 صبح
میتونی تبدیل به Dll کنی
در هر صورت اصولش یکی
میخواهی کمک کن به هم اینو واسه #c در بیاریم؟

ahmad1880
پنج شنبه 23 اسفند 1386, 16:33 عصر
سلام دوستان عزیز.
من میخواهم وب سرویسی درست کنم که از طریق اون بشه سال شمسی به میلادی و بلعکس تبدیل کرد ؛
میخواستم ببینم که این توابع در وب سرویس هم قابل استفاده است؟
و اگه هست لطفا طریقه ساخت اون رو توضیح بدین،
با تشکر فراوان...

saman_itc
پنج شنبه 23 اسفند 1386, 20:37 عصر
سلام
مهم اون فرمول هایی هست که تو ماژول نوشتم(بعضی از دوستان هم ازش کپی گرفتن به اسم خودشون)
اون مثل یه تابع معمولی می تونی استفاده کنی

saman_itc
دوشنبه 16 اردیبهشت 1387, 10:00 صبح
near_86 (http://barnamenevis.org/forum/member.php?u=36681)


سلام
قبل از هر چیز بخاطر قرار دادن کنترلتون ازتون تشکر میکنم

من در برنامه ام از همین ماژول وکنترل شما استفاده میکنم اما با 3 هشدار زیر روبرو میشم (البته بگم که کنترل اجرا میشه و تاریخ رو درست نشون میده)


و ی چیز دیگه اینکه اینطور که از کنترل برمیاد
text سال برمیاد فقط 2 کارکتر نشون داده میشه
و خاصیت multi line فعال شده
مشکل من اینه که میخوام سال به صورت کامل نشون داده بشه مثلا 1387 نه 13

ممنمون میشم کمکم کنید

با تشکر فراوان

با سلام خدمت شما
اون سه تا هشدار موردی نداره .به خاطر دستوراته
نکته دوم اینکه میتونید تو خوده کلاس هر چی که دوست دارین بنویسین
ولی اگه بخواید تاریخ روز توش باشه این کد تو فرم لودتون بنویسین


UCtrl_Date3.Controls.Item(3).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Year)
UCtrl_Date3.Controls.Item(2).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Month)
UCtrl_Date3.Controls.Item(1).Text = ShamsiSplit(shamsi(DateFormat.ShortDate), ShSplit.Day)

salehbagheri
یک شنبه 26 خرداد 1387, 13:25 عصر
بهتره اين يكي رو هم ببيني! ماژول تاريخ هجري شمسيه!




Module Shamsi



Public Function Tarikh() As String



'Define Days'

Dim DArray As New ArrayList(7)

DArray.AddRange(New String() {"يكشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"})



'Define Months'

Dim MArray As New ArrayList(12)

MArray.AddRange(New String() {"دی", "بهمن", "اسفند", "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر"})



'Other Variables'

Dim NowYear As Integer = Date.Now.Year

Dim ShamsiYear, Y, K, Z, Day As Integer

Dim Days As Integer = Date.Now.DayOfYear

Dim Rooz As String = DArray(Date.Now.DayOfWeek)

Dim Month As String = ""



K = 79

Z = 365



'---Checking Year---'

Dim Kabiseh As Boolean = False

If (Now.Year - 2001) Mod 4 = 0 Then

Kabiseh = True



End If

If (Now.Year - 2000) Mod 4 = 0 Then

Z = 366



End If

'---End Checking---'



'---Calculating Year---'

If Kabiseh = True Then



If Days > K Then

ShamsiYear = NowYear - 621

Else

ShamsiYear = NowYear - 622

End If

Y = 19



Else



If Days > K Then

ShamsiYear = NowYear - 621

Else

ShamsiYear = NowYear - 622

End If

Y = 20



End If

'---End Calculating---'



'---Calculating Month---'

Select Case Days

Case 1 To Y

'Day'

Month = MArray(0)

Day = Days + 10

If Kabiseh = True Then

Day = Days + 11

End If



Case Y + 1 To Y + 30

'Bahman'

Month = MArray(1)

Day = Days - Y



Case Y + 31 To K

'Esfand'

Month = MArray(2)

Day = Days - (Y + 30)



Case 80 To 110

'Farvardin'

Month = MArray(3)

Day = Days - K



Case 111 To 141

'Ordibehesht'

Month = MArray(4)

Day = Days - 110



Case 142 To 172

'Khordad'

Month = MArray(5)

Day = Days - 141



Case 173 To 203

'Tir

Month = MArray(6)

Day = Days - 172



Case 204 To 234

'Mordad'

Month = MArray(7)

Day = Days - 203



Case 235 To 265

'Shahrivar'

Month = MArray(8)

Day = Days - 234



Case 266 To 295

'Mehr

Month = MArray(9)

Day = Days - 265



Case 296 To 325

'Aban'

Month = MArray(10)

Day = Days - 295



Case 326 To 355

'Azar

Month = MArray(11)

Day = Days - 325



Case 356 To Z

'Day'

Month = MArray(0)

Day = Days - 355



End Select

Dim D As String = "امروز " & Rooz & " " & Day.ToString & " " & Month & " " & ShamsiYear.ToString



Return D

End Function
End Module

saman_itc
یک شنبه 26 خرداد 1387, 13:52 عصر
بهتره اين يكي رو هم ببيني! ماژول تاريخ هجري شمسيه!






ction



End Module

منبعش کدوم سایته؟

salehbagheri
دوشنبه 27 خرداد 1387, 12:38 عصر
منبعش کدوم سایته؟

منبعش مغز متفكر خودمه!

تو قسمت Checking Year اگر تغييراتي اعمال بشه، كاراييش خيلي بهتر ميشه و ميشه گفت كه كامل ميشه!
اگه تونستيد تغييرش بديد!

saman_itc
سه شنبه 28 خرداد 1387, 15:54 عصر
شما یه نگاه به اون ماژول که من گذاشتم بندازین
مطمئن باش کامله

masoodp666
سه شنبه 28 خرداد 1387, 23:52 عصر
شما میتونید از class PersianCalander خود ویژوال استدیو استفاده کنید. من استفاده میکنم و خیلی هم راحته و نیاز به این همه کد هم نداره.

saman_itc
چهارشنبه 29 خرداد 1387, 08:07 صبح
من به چیزی که خودم مینویسم مطمئنم
اون ساب مسک داره؟
تو این جا با این کنترل دیگه کاربر لازم نیست تیره بزراه یا / برازه پس درصد خطا در ورود اطلاعات میاره پایین.
شما مقاله ای در مورد PersianCalander دارین؟

masoodp666
پنج شنبه 30 خرداد 1387, 19:10 عصر
برای رفع مشکل - یا / میتونید از MaskTextBox ها استفاده کنید و فرمت بدید. من این کارو میکنم و تا حالا اشتباهی ندیدم. به خاطر اینکه این کلاس رو فکر کنم یه برنامه نویس ایرانی توی Microsoft نوشته و تو 2005 عرضه کردن.

اگه کد خاصی با این روش خواستید بگید تا بذارم.

موفق باشی.

رضا عربلو
پنج شنبه 30 خرداد 1387, 21:07 عصر
تو این MaskedTextBox شما آیا اجازه می دهد تاریخی همانند99/99/1387 تایپ کرد؟
همچنین آیا می توان جهت ورود تاریخ را به گونه ای تنظیم کرد که از راست به چپ اول روز بعد ماه و بعد سال را وارد کنیم؟

reza1357
پنج شنبه 30 خرداد 1387, 22:27 عصر
سلام،
دوستان پیشنهاد میکنم این کلاس رو هم امتحان کنیدبنده قبلا این رو ارسال کرده بودم :
http://barnamenevis.org/forum/showthread.php?t=69055

saman_itc
جمعه 31 خرداد 1387, 02:05 صبح
سلام،
دوستان پیشنهاد میکنم این کلاس رو هم امتحان کنیدبنده قبلا این رو ارسال کرده بودم :
http://barnamenevis.org/forum/showthread.php?t=69055
آقا رضا من سورسش گذاشتم هر کی دوست داره از هر جاش استفاده کنه
1- بعد از کلیک روی دکمه تقویم تا یه تاریخ انتخاب نکنیم صفحه تقویم نمیره
2- به دلیل چپ به راست بودن اعداد لاتین نمایش داده میشه
مشکلاتش رفع کنی بهتر هم میشه

saman_itc
جمعه 31 خرداد 1387, 02:08 صبح
برای رفع مشکل - یا / میتونید از MaskTextBox ها استفاده کنید و فرمت بدید. من این کارو میکنم و تا حالا اشتباهی ندیدم. به خاطر اینکه این کلاس رو فکر کنم یه برنامه نویس ایرانی توی Microsoft نوشته و تو 2005 عرضه کردن.

اگه کد خاصی با این روش خواستید بگید تا بذارم.

موفق باشی.
شما MaskTextBox بزارین تا ما و دوستان ازش استفاده کنیم.امید وارم اشتباهی نداشته باشه

saman_itc
جمعه 31 خرداد 1387, 02:20 صبح
منبعش مغز متفكر خودمه!




[FONT='Tahoma','sans-serif']






فکر کنم یه سایت کپی پیست مستقیم کردی؟یه سری اضافه همراش مونده

reza1357
جمعه 31 خرداد 1387, 11:49 صبح
آقا رضا من سورسش گذاشتم هر کی دوست داره از هر جاش استفاده کنه
1- بعد از کلیک روی دکمه تقویم تا یه تاریخ انتخاب نکنیم صفحه تقویم نمیره
2- به دلیل چپ به راست بودن اعداد لاتین نمایش داده میشه
مشکلاتش رفع کنی بهتر هم میشه
انشالله اصلاحات لازم رو انجام میدم.

saman_itc
جمعه 31 خرداد 1387, 11:54 صبح
MaskTextBox یه چیزه ثابته .اما تو کنترل دستت بازه
اگه دوست داشتی سورسش بزار اینجا تا اساتید هم روش کار کنند

masoodp666
جمعه 31 خرداد 1387, 15:50 عصر
تو این MaskedTextBox شما آیا اجازه می دهد تاریخی همانند99/99/1387 تایپ کرد؟
منظور شما از تاریخ بالا یعنی چی ؟ یعنی تعداد ماهها و روزها اگه از 12 بیشتره بشه.....



همچنین آیا می توان جهت ورود تاریخ را به گونه ای تنظیم کرد که از راست به چپ اول روز بعد ماه و بعد سال را وارد کنیم؟
ببینید شما به MaskTextBox تون فرمت میدید مثل: --/--/---- و بعد میتونید بالای هر بخشش بنویسید روز/ماه/سال. خواستید میتونید اینجوری بنویسید: ----/--/-- و ......
مهم اینه که توی بانک چطوری ذخیره کنید و در موقع لزوم چگونه میخواهید ازش استفاده کنید که اینها رو دیگه نیازی نیست کاربر بدونه.
برای مثال اگه هدف ذخیره و بازیابی تاریخ به صورت شمسیه میتونید این کارو بکنید:

ابتدا از MaskTextBox تاریخ رو بگیرید:

خاصیت Mask در Property اش رو ست کنید به : 0000/00/00
خاصیت PromptChar اش رو ست کنید به : -
در خاصیت TextMaskFormat میتونید اینکه Literal ها یا .... هم در بانک ذخیره بشه یا نه تصمیم گیری کنید.

بعد کافیه یه آبجکت بسازید:


Dim Cal As New System.Globalization.PersianCalendar
و بعد از متد های فراوان اون استفاده کنید....

اگر هم خواستید که مثلا حتما تاریخ به صورت 8 رقمی ذخیره بشه یه تابع بنویسید:


Public Function FullDate(ByVal dDate As Date) As String
Dim myDate As String = Cal.GetYear(dDate).ToString & Cal.GetMonth(dDate).ToString & Cal.GetDayOfMonth(dDate).ToString
If Cal.GetMonth(dDate) < 10 And Cal.GetDayOfMonth(dDate) < 10 Then
myDate = Cal.GetYear(dDate) & "0" & Cal.GetMonth(dDate) & "0" & Cal.GetDayOfMonth(dDate)
ElseIf Cal.GetMonth(dDate) < 10 Then
myDate = Cal.GetYear(dDate) & "0" & Cal.GetMonth(dDate) & Cal.GetDayOfMonth(dDate)
ElseIf Cal.GetDayOfMonth(dDate) < 10 Then
myDate = Cal.GetYear(dDate) & Cal.GetMonth(dDate) & "0" & Cal.GetDayOfMonth(dDate)
End If
Return myDate
End Function
یا برای گرفتن روزهای هفته:


Public Function DayOfWeek(ByVal dDate As Date) As String
Dim DoW As Byte
Dim DayOfW As String = ""
DoW = Cal.GetDayOfWeek(dDate)
Select Case DoW
Case 1
DayOfW = "دوشنبه"
Case 2
DayOfW = "سه شنبه"
Case 3
DayOfW = "چهارشنبه"
Case 4
DayOfW = "پنجشنبه"
Case 5
DayOfW = "جمعه"
Case 6
DayOfW = "شنبه"
Case 0
DayOfW = "يکشنبه"
End Select
Return DayOfW
End Function
من کنترلی برای این کار ندارم و شخصا هم به کنترل ها و dll های در این زمینه نمیتونم اعتماد کنم. البته من همه ی کامنتها رو نخوندم و نمیدونم که شما دقیقا دنبال چی هستید.

ولی از لحاظ تمامی حساب و کتابها در زمینه تاریخ شمسی به صورت کاملا دقیق، میتونید بهش اعتماد 100% داشته باشید.

باز هم اگه سوالی بود و یا من دقیقا هدف دوستان رو متوجه نشده بودم بگید در خدمتم.

رضا عربلو
جمعه 31 خرداد 1387, 16:28 عصر
در دلفی مجموعه ای از کامپاننتها است به نام FarsiComponent که هوشمندانه عمل می کند. برای مثال هنگامی که کاربر تاریخ 9/4/1387 را می خواهد وارد کند. ابتدا 9 را تایپ می کند بعد هنگامی که کلید 4 را فشار می دهد با توجه به اینکه تهعداد روزها نمی تواند از 31 بیشتر باشد بنابر این 4 را بطور اتوماتیک به بخش ماه می آورد و ....دقیقاً همانند خود DateTimePicker مایکروسافت.
منظور من هم دقیقاً همچین قابلیتی است. یعنی نمی خواهم کاربر تاریخ اشتباهی همانند 45/23/1387 تایپ کند بعد هنگامی که خواست از کنترل خارج شود validation control پیغام دهد که تاریخ نا معتبر است. بلکه می خواهم به هیچ عنوان کاربر نتواند تاریخ نامعتبر وارد کند. ماسک 00/00/0000 همچین اجازه ای را می دهد و چندان پیشرفته نیست.

masoodp666
جمعه 31 خرداد 1387, 16:46 عصر
مطالبی رو که بنده عرض کردم برای مواقعیه که، استفاده از این روش نسبت به dll هایی که کمتر میشه بهشون اعتماد کرد یا کد نویسی های طولانی، به صرفه تره.

در مورد اینکه توی کنترل دست بازتره دقیقا همین طوره.

در صورتیکه بخواهیم کاملا هوشمند باشه باید کدهای بیشتری نوشت. مثل همین نمونه ای که دوستمون saman_itc گذاشته.

mrrz784
دوشنبه 18 شهریور 1387, 13:03 عصر
اگه تو يه كامپوننت يه Calendar داشته باشيم كه تاريخ رو به ميلادي نشون بده و بخوايم اون رو تبديل به شمسي كنيم چه بايد كرد ؟

mrrz784
سه شنبه 19 شهریور 1387, 10:16 صبح
??????????????????????????????

saman_itc
سه شنبه 19 شهریور 1387, 10:40 صبح
شما از این ماژول استفاده کردی؟