PDA

نسخه کامل مشاهده نسخه کامل : دانلودکنید:TextBox با توانایی کار با تاریخ فارسی با کاربرد آسان



MTPROG
29-07-2009, 09:32
لینک دانلود
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


هم من هم شما مطمئنن با چند کامپونینت فارسی کار کردیم که همه شون تاریخ رو درست تبدیل میکنند ولی من تا حالا با یک کامپونینت فارسی کار نکردم که User friendly یا کاربر پسندی تو کار کردن داشته باشه و از اکثر اونا که استفاده کردم کاربرهای برنامه ام از نحوی وارد کردن تاریخ گله مند بودند بنابراین سعی کردم که یک TextBox که توانایی کار با تاریخ هجری شمسی داشته باشه و خیلی هم بشه باهاش راحت کار کرد روطراحی کنم.
اسم این کامپونینت رو FarsiDate.dll گذاشتم که با VB.NET 2008 نوشته شده است.
تواناییها:
1-با کلید Space تاریخ حال سیستم محاسبه و در داخل Textbox نوشته میشود
2-با کلید Delete تاریخ پاک میشود
3-با کلید Home چهار رقم سال انتخاب میشود
4-با کلید End دو رقم روز انتخاب میشود
5-با کلیدهای Left ,Right مکانمای صفحه کلید حالت انتخاب از سال به ماه و از ماه به روز و از روز به سال و برعکس عوض میشود
6- با کلیدUp اگر روز انتخاب شده باشد 1 روز جلوتر و اگر ماه انتخاب شده باشد 1 ماه جلوتر و اگر سال انتخاب شده باشد 1 سال جلوتر میرود
7- با کلیدDown اگر روز انتخاب شده باشد 1 روز عقب تر و اگر ماه انتخاب شده باشد 1 ماه عقب تر و اگر سال انتخاب شده باشد 1 سال عقب تر میرود
8-با کلید page Up اگر روز انتخاب شده باشد 10 روز جلوتر و اگر ماه انتخاب شده باشد 3 ماه جلوتر و اگر سال انتخاب شده باشد 2 سال جلوتر میرود
9-با کلید page Down اگر روز انتخاب شده باشد 10 روز عقب تر و ماه انتخاب شده باشد 3 ماه عقب تر و اگر سال انتخاب شده باشد 2 سال عقب تر میرود
10-اگر روی Textbox کلیک سمت چپ کنید در هر کجا باشد آن قسمت انتخاب میشود
11-با DoubleClick سال انتخاب میشود
12-میتوانید تاریخ را با صفحه کلید تایپ کنید به این صورت که در هر قسمت از تاریخ باشید مثلا روز ، ماه یا سال تایپ از آنجا شروع میشود به اینصورت که هر عددی فشار میدهید بعد از صحت آن در جای مناسب قرار گرفته و مکانما به طرف عدد بعدی حرکت می کند
13-مقدار تاریخ را میتوانید با تابع GetValue()و یا ThisText بخوایند مثلا MessageBox.Show(FarsiDate1.Getvalue()) یا MessageBox.Show(FarsiDate1.ThisText())
14-مقدار تاریخ را میتوانید با تابع SetValue(strDate) یا ThisText تغییر دهید مثلاFarsiDate1.Setvalue(“1388/05/07”) و یا FarsiDate1.ThisText="1388/05/07"
15-در رویداد KeyDowned میتونید کلید را گرفته و عملیات لازم مثل فوکوس شدن را انجام دهید
16-تابع About هم مشخصات منو داره :31: MessageBox.Show(FarsiDate1.About())
لطفا دانلود کنید و امتحان کنید و اگر عیبی ، پیشنهادی ، بگی داره بگید تا اصلاح بشه
نظر هم یادتون نره

bad_boy_2007
29-07-2009, 12:27
چيز جالبي بود (البته هنوز كامل نگاش نكردم)
ممنون
ولي اگه سورسش رو ميزاشتي بد نبود ، شايد بچه ها كمك ميكردن كامل تر شه

sari-1369
29-07-2009, 17:38
اگر کاربر یه تاریخی رو تایپ کرد و بعدش پشیمون شد و خواست کلا تاریخ رو از توی تکست باکس حذف کنه چی ؟؟ ( مثل اینکه از اول مقداری وارد نکرده )

MTPROG
30-07-2009, 08:20
اگر کاربر یه تاریخی رو تایپ کرد و بعدش پشیمون شد و خواست کلا تاریخ رو از توی تکست باکس حذف کنه چی ؟؟ ( مثل اینکه از اول مقداری وارد نکرده )

2-با کلید Escape تاریخ پاک میشود

sari-1369
30-07-2009, 16:49
سورسش رو نمیزاری ؟؟ :D

MTPROG
01-08-2009, 08:51
لینک بالا آپدیت شد.

اینم از سورسش
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

دو تا تغییر اضافه شده
1-حذف تاریخ از Escape به Delete تغییر داده شد
2-در رویداد KeyDowned میتونید کلید را گرفته و عملیات لازم مثل فوکوس شدن را انجام دهید



اما من یک مشکلی داشتم این که رویدادهای DeyDown ,Keypress ,textChange بعد از تبدیل کنترل به یک فایل DLL دیگه جوابگو نیست

علتش اینه که حالتهای فوق در دو حالت یکی برای TextBox و یکی برای UserControl وجود داره که تو طراحی از رویدادهای TextBox استفاده شده و وقتی تبدیل به یک فایل میشه رویدادهای فوق برای UserControl محاسبه میشه برای همینه که هیچ عکس العملی در رویدادهای فوق بعد طراحی دیده نمیشه
(اگه متوجه نشدید میتونید یه برنامه کوچک بنویسید که وقتی تاریخ عوض شد یک پیغام بده میبینی که عمل نمیکنه)


چطور میشه این مشکل حل کرد

عــــلی
01-08-2009, 11:56
سلام دوست عزیز...ممنون از سورس برنامه...
Event رو امتحان کردم کار کرد....موقع تغییر متن..
شما باید یک Event برای کنترل خود بسازید....
من نمیدونم شما چطور اسم اینو گذاشتین کنترل نمیخوام بد بگم ولی شما اصلاً حتی یه متغیر برای متنش هم تعریف نکردین...
اینم نمونه:
کدهای زیر رو به کنترل اضافه کن:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا کد زیر رو هم تو قسمت TxtDate_TextChanged اضافه کن:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا یک Event به نام TextChanging و یک خاصیت متن ThisText به کنترل اضافه شد...
با TextChanging میتونی بفهمی که آیا متن تغییر کرده یا نه....
و با ThisText میتونی متن رو فراخوانی و تغییر بدی.
توضیح کد خواستی در خدمتیم...
موفق باشید و سربلند....

sari-1369
01-08-2009, 22:47
با این تغیرات جدید ، نسخه بعدیشو آپ نمی کنید ؟؟

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

MTPROG
02-08-2009, 08:50
لینک بالا آپدیت شد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



با این تغیرات جدید ، نسخه بعدیشو آپ نمی کنید ؟؟

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


چرا که نه البته خود شما هم میتونید این کار رو با گذاشتن toolTip انجام بدید


Public Delegate Sub TextChang(ByVal sender As Object, ByVal e As String)

Public Event TextChanging As TextChang

Protected Overridable Sub RaiseSampleEvent()
TXT = TxtDate.Text
RaiseEvent TextChanging(Me, TXT)
End Sub

با تشکار از hamishebahar برای راهنمایی خیلی عالی بود
اگه میشه این کد رو یکم توضیح بدی ممنون

عــــلی
04-08-2009, 01:43
سلام دوستان ببخشید دیر شد سرم شلوغه عجیب و غریب....


Public Delegate Sub TextChang(ByVal sender As Object, ByVal e As String)
در این خط ما یک رویداد یا یک Event برای کنترلمون تعریف کردیم.مثل رویداد Click که در بیشتر کنترل ها هست...
ما میخوایم این رویداد موقعی اجرا بشه که متن داخل تکست تغییر کنه...
برای همین کد RaiseSampleEvent() رو داخل Changeمتن گذاشتیم.
به خط زیر دقت کنید:

Set(ByVal value As String)
TxtDate.Text = value
End Set
وقتی ما متغیر ThisText رو تغییر میدیم متن تکست عوض میشه و دوباره رویداد به وسیله کد RaiseSampleEvent() اجرا میشه.

Public Event TextChanging As TextChang
این خط هم که ما یک رویداد تعریف کردین که موقع تغییر متن رویداد TextChanging صدا زده میشه...

TXT = TxtDate.Text
متغیر TXT همون متن داخل تکست هست که در این متغیر ذخیره میشه که موقع فراخوانی ازش استفاده میشه....

RaiseEvent TextChanging(Me, TXT)
این خط هم موقعی که رویداد صدا زده شد عمل میکنه که Me کنترل هست و TXT هم متن.
موفق باشید و سربلند.

bad_boy_2007
07-08-2009, 22:51
يكم تغييرش دادم ولي الان زياد وقت ندارم
خودم هم بهش نياز دارم ميزارم اگر شما هم وقت كرديد روش كار كنيم ببينيم چي ميشه ! :31:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تغييراتي كه دادم به شرح ذيل :
- تغيير از نوع UserControl به كلاسي كه ويژگي هاي TextBox را بسط ميدهد ، به اين شكل ديگر نيازي به RaiseEvent نداريد و ضمنا تمام وي‍‍ژگي ها و رويداد هاي TextBox را هم داريد
- نوشتن حروفي تاريخ و تنظيم زمان نمايش (ToolTipText) ، اين گزينه اختياري است و ميتوان آن را با استفاده از ويژگي FarsyDateStyle تغيير داد . (ديگر ويژگي هاي مرتبط : BackcolorTooltip - TootTipDelay)

در ضمن كنترل شما را با يك كنترل ديگر (كه هنوز كمي ناقص است) در يك پرو‍ژه گزاشتم چون با هم مرتبط بودند

bad_boy_2007
07-08-2009, 23:19
چند تا پيشنهاد واسش دارم كه اگه روش كار كنيم چيز خوبي در مياد
اول از همه يه تعداد از ويژگي هاش بايد انتخابي بشه ، مثلا :
- اينكه ميتونه تاريخ خالي باشه يا خير (در اكثر كاربردهاي من نميتونه تاريخ خالي وارد بشه)
-اينكه اگر PageUP زده شد جند تا به ماه ، روز يا سال اضافه بشه و اگر كسي اين ويژگي رو نخواد به اون مقدار صفر بده
- اگر Enter يا فلش پايين زده شد فوكوس به كنترل بعدي برود
- كليد Shift+Enter يا فلش بالا فوكوس را به كنترل قبلي منتقل كند (اين ويژگي و ويژگي بالا بايد انتخاب بشه)
- رنگ زمينه زماني كه فوكود در آن است با خارج ميشود
- ايجاد منوي راست كليك ، بدك نيست بخشي از تنظيمات را در اين قسمت در اختيار كاربر قرار دهيم
- كليدهاي F1 تا ّF12 به ترتيب تاريخ را به 1/1/سال جاري الي 1/12/سال جاري منتقل كند
- مهمترين مطلب اينكه با استفاده از يك ديتابيس كه در آن روزهاي تعطيلي و مناسبتها ثبت شده ، به صورت انتخابي اين مطلب را به شخص اطلاع دهيم

نمونه اي از ويژگي هاي فوق در كلاس CurrencyTextBox لحاظ شده ، احتمالا اگر وقت كنم تا فردا شب اين كارها را ميكنم

MTPROG
08-08-2009, 08:31
خودم هم بهش نياز دارم ميزارم اگر شما هم وقت كرديد روش كار كنيم ببينيم چي ميشه

ممنون که روش کار کردی

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


- اينكه ميتونه تاريخ خالي باشه يا خير (در اكثر كاربردهاي من نميتونه تاريخ خالي وارد بشه)

بعضی وقتها لازم میشه مثلا برای صدور چک سفید یا بدون تاریخ تا تضمینی البته همونطور که گفتی میشه اختیاری کرد


اگر Enter يا فلش پايين زده شد فوكوس به كنترل بعدي برود
- كليد Shift+Enter يا فلش بالا فوكوس را به كنترل قبلي منتقل كند (اين ويژگي و ويژگي بالا بايد انتخاب بشه)


با Enter , Shift+Enter موافقم ولی با فلشها نه چون اگر فلشها رو از کار بندازی یکی از روشهای تغییر تاریخ که با فلش تغییر میکنه از بین میره که روش راحتی برای انتخاب تاریخه


كليدهاي F1 تا ّF12 به ترتيب تاريخ را به 1/1/سال جاري الي 1/12/سال جاري منتقل كند
این خیلی خوبه


- مهمترين مطلب اينكه با استفاده از يك ديتابيس كه در آن روزهاي تعطيلي و مناسبتها ثبت شده ، به صورت انتخابي اين مطلب را به شخص اطلاع دهيم
اینم بد نیست مثلا به درد وقتی میخوره که فرضا شخص بخواد چکی برای 30 روز دیگه صادر کنه با 3 تا PageUp به 30 روز دیگه میرسه ولی اگر اون روز تعطیل باشه بهش هشدار میده و چک رو برای روزی دیگه صادر میکنه تنها اشکالش اینه باید یه بانک همراه فایل باشه بعدش هم درست کردن یه بانکی که اطلاعات این همه مناسبتها و تعطیلیها توش باشه یکم مشکله


در کل پیشنهادتاتون جالبه
ممنون

MTPROG
08-08-2009, 08:54
سورسی که گذاشته بودم دانلود کردم جالب بود
فقط چند تا ایراد داره

1-وقتی تاریخ رو تغییر میدی مثلا 17/05/1388که شنبه هستش با 16/05/1388 بازم شنبه مینویسه و لی بعد از یه حرکت دیگه مثالا فلش یا هر چیز دیگه متوجه تغییر تاریخ میشه و اصلا میشه (دیر Refresh میشه)

2-تو خاصیت Text برنامه نویس میتونه تاریخ اشتباه وارد کنه و به فرض مثال میشه نوشت 123654/05/1388 در اینصورت تاریخ دچار مشکل میشه (هر چند شاید زیاد مهم نباشه چون برنامه نویس فقط به اون دسترسی داره نه Enduser ولی کاربر پسند نیست)

3-وقتی پروژه رو باز میکنم تو Warning میده
Warning 2The referenced component 'Settings' could not be found.

Warning 1 Could not resolve this reference. Could not locate the assembly "Settings". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. CurrencyTextBox

MTPROG
08-08-2009, 09:35
فقط چند تا ايراد داره

1-وقتي تاريخ رو تغيير ميدي مثلا 17/05/1388که شنبه هستش با 16/05/1388 بازم شنبه مينويسه و لي بعد از يه حرکت ديگه مثالا فلش يا هر چيز ديگه متوجه تغيير تاريخ ميشه و اصلا ميشه (دير Refresh ميشه)

2-تو خاصيت Text برنامه نويس ميتونه تاريخ اشتباه وارد کنه و به فرض مثال ميشه نوشت 123654/05/1388 در اينصورت تاريخ دچار مشکل ميشه (هر چند شايد زياد مهم نباشه چون برنامه نويس فقط به اون دسترسي داره نه Enduser ولي کاربر پسند نيست)

3-وقتي پروژه رو باز ميکنم تو Warning ميده
Warning 2The referenced component 'Settings' could not be found.

Warning 1 Could not resolve this reference. Could not locate the assembly "Settings". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. CurrencyTextBox

در کل روشی که رویدادهای کنترل اصلی حفظ بشه خیلی خوبه

bad_boy_2007
08-08-2009, 13:31
ديشب يكم وقت كردم روش كار كردم ، شب كه كه از شركت برميگردم يكم ديگه روش كار ميكنم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در مورد ديتابيس هم ، نه خيلي سخت نيست .
ولي حداقل واسه من خيلي كاربرديه ، و فكر ميكنم اگر ديتابيس نباشه بهتره ، يك فايل باينري ، تكست يا XML بد چيزي نيست

Refrence به Setting.DLL رو هم حذف كردم ، نبايد مشكل داشته باشه

MTPROG
11-08-2009, 17:29
متاسفانه دستکاریتون باعث خراپ شدنش شده

1-وقتی از کلید Right استفاده میکنی سال رو اشتباه انتخاب میکنه مثلا به جای 1388 عدد13 رو انتخاب میکنی و وقتی تایپ میکنی تاریخ کلا به هم میریزه

2-وقتی اعداد ماه رو تایپ میکنی فقط یک رقمینویسه مثلا 1 تا 9 دیگه نمیشه 10، 11 ،12 رو تایپ کرد

3-عدد روز رو میشه 3 تا وارد کرد و تاریخ غلط به دست آورد

4-وقتی کلید Space رو میزنیم اون قسمتی که انتخاب شده پاک میشه و تنظیمات به هم میخوره

در کل تایپ رو کلا از کار انداختید اونی هم که وارد میشه غلط نوشته میشه

توصیه میکنم تو بخشهای اصلیش دستکاری نکنید فقط امکانات خودتونو بهش اضافه کنید