-- به بحث در مورد موضوع تاپیک ادامه بدید --
ولی برای حل مشکل تاریخ 2 راه وجود داره:
1) یک کامپوننت بنویسید که هر طور میخواید ثبت بشه. (که وقت گیر است)
2) مثل تمامی پروژه های فارسی نوشتن رو از سال به سمت روز ادامه بدهید. من پروژه ای از هیچ شرکتی ندیدم که روز به سمت سال بنویسد. (غیر از یکی دو مورد پروژه های تحت داس)
و من هم بلد نیستم چنین کاری بکنم.
فقط این راهنمایی رو خدمتتون میگم:
بهتر است از یک MaskedTextBox استفاده کنید که کاربر نیاز به تایپ علامت "/" نداشته باشد. کافیست در Property کنترل مربوطه در قسمت Mask عبارت ذیل را درج نمایید
####/##/##
یادتون نره که برای تاریخ فارسی RightToLeft کنترل True باشد.
حال اگر لازم است در خروجی MaskedTextBox یعنی Text کاراکتر "/" هم نمایش داده شود خصیصه TextMaskFormat را برابر InclucleLiterals قرار دهید.
خروجی
MaskedTextBox.Text >>> 1385/01/01
اگر لازم است در خروجی MaskedTextBox یعنی Text کاراکتر "/" نمایش داده نشود خصیصه TextMaskFormat را برابر ExcludePromptAndLiterals قرار دهید.
خروجی
MaskedTextBox.Text >>> 13850101
بهتر است در TextMaskFormat از IncludePrompt و IncludePromptAndLiterals چون کاربرد چندانی ندارند.
Prompt چیه:
کاراکتر یا پیامى که توسط کامپیوتر ارائه مى شود تا مشخص کند که اماده پذیرفتن ورودى صفحه کلید است یعنی همون علامت "_" که اعداد روش تایپ میشوند.
Literal چیه؟
همون کارکتر جدا کننده اعداد است که شما اونو در تاریخ "/" قرار میدهید و ":" رو برای زمان انتخاب میکنید.
ضمنا برای تایپ صحیح لازم است که نشانگر همیشه در ابتدای MaskedTextBox قرار بگیرد وگرنه تاریخ ناقص تایپ میشود. (مثلا کاربر روی MaskedTextBox کلیک میکنه و بدون اینکه ابتدای خط بره شروع به تایپ میکنه)
برای جلوگیری از این مشکل در روال GotFocus و Click کنترل مربوطه این کدها را درج نمایید:
MaskedTextBox1.Select(0, 0)
با استفاده از این دو تابع میتونید علامت "/" از تاریخ بردارید یا اضافه کنید.
Public Function fdtFormatDate(ByVal strDate As String) As String
fdtFormatDate = Format$(strDate, "0000/00/00")
End Function
Public Function fdtUnFormatDate(ByVal strDate As String) As String
fdtUnFormatDate = Mid$(strDate, 1, 4) & Mid$(strDate, 6, 2) & Mid$(strDate, 9, 2)
End Function
با استفاده از این تابع هم میتونید صحت تاریخ رو چک کنید:
این Enum در قسمت اعلان عمومی درج شود
Public Enum FDT_CheckDateTimeResultConstants
FDT_NoError = 0
FDT_ErrorInDate = 1
FDT_ErrorInDay = 2
FDT_ErrorInMonth = 3
FDT_ErrorInYear = 4
FDT_ErrorInDayMonth = 5
FDT_ErrorInTime = 6
FDT_ErrorInHour = 7
FDT_ErrorInMinute = 8
End Enum
Public Function fdtCheckDate(ByVal DateForTest As String, Optional ByVal ShowWarning As Boolean = True, Optional ByVal DateMatter As String= "") As FDT_CheckDateTimeResultConstants
If InStr(DateForTest, "_") <> 0 Or DateForTest = ""Or Len(DateForTest) < 8 Or Val(DateForTest) = 0 Then
If ShowWarning Then MsgBox(" لطفاً تاریخ ««" & DateMatter & "»» را کامل وارد کنید",, "خطا در وارد کردن تاریخ ")
fdtCheckDate = FDT_CheckDateTimeResultConstants.FDT_ErrorInDate
Exit Function
End If
If Val(Mid$(DateForTest, 1, 4)) < 1350 Or Val(Mid$(DateForTest, 1, 4)) > 1481 Then
If ShowWarning Then MsgBox(" لطفاً عدد سال تاریخ «" & DateMatter & "» را بین 1300 تا 1400 وارد کنید",, "خطا در وارد کردن تاریخ ")
fdtCheckDate = FDT_CheckDateTimeResultConstants.FDT_ErrorInYear
Exit Function
End If
If Val(Mid$(DateForTest, 5, 2)) > 12 Or Val(Mid$(DateForTest, 5, 2)) < 1 Then
If ShowWarning Then MsgBox(" لطفاً عدد ماه تاریخ «" & DateMatter & "» را بین 1 تا 12 وارد کنید",, "خطا در وارد کردن تاریخ ")
fdtCheckDate = FDT_CheckDateTimeResultConstants.FDT_ErrorInMonth
Exit Function
End If
If Val(Mid$(DateForTest, 7, 2)) > 31 Or Val(Mid$(DateForTest, 7, 2)) < 1 Then
If ShowWarning Then MsgBox(" لطفاً عدد روز تاریخ «" & DateMatter & "» را بین 1 تا 31 وارد کنید",, "خطا در وارد کردن تاریخ ")
fdtCheckDate = FDT_CheckDateTimeResultConstants.FDT_ErrorInDay
Exit Function
End If
If Val(Mid$(DateForTest, 5, 2)) > 6 And Val(Mid$(DateForTest, 7, 2)) > 30 Then
If ShowWarning Then MsgBox(" عدد ماه و عدد روز تاریخ «" & DateMatter & "» با هم انطباق ندارد ",, "خطا در وارد کردن تاریخ ")
fdtCheckDate = FDT_CheckDateTimeResultConstants.FDT_ErrorInDayMon th
Exit Function
End If
fdtCheckDate = FDT_CheckDateTimeResultConstants.FDT_NoError
End Function
جناب forozeshfard پیشنهاد میکنم خودتون رو برای یک چنین مورد ناچیز اذیت نکنید.(منظورم جهت تایپ تاریخ که حالا از سال باشه یا از روز) مطمئن باشید که عیب محسوب نمیشود. به فکر کامل کردن و ارتقا سایر قسمت های پروژه خود باشید.
موفق باشید!