Date Convert JS ver 2.0
Version: |
2.0 (2.0 Trial) |
Copyright: |
2005-2006 JS Corporation © |
Control
Programmer: |
Javad Soltani |
|
● از این کنترل به عنوان یک کتابخانه استفاده نمایید !
● ساختار تبدیلات تاریخ به کار رفته در کنترل
سوال : چگونه تاریخها را به یکدیگر تبدیل نماییم ؟
● خصوصیات نام روز از هفته DayName
● تنظیمات روزهای تعطیل Holidays
● نمایش چند تقویم در یک صفحه !
● تنظیمات گزارش تاریخ Report
Box
● کنترل تنظیمات تصویر Picture
Properties
کنترل فوق انعطافDateConvertJS دارای یک صفحه تقویم به منظور
نمایش انواع تاریخهای زیر میباشد:
● تقویم |
Gregorian |
میلادی-Civil |
کد: |
1 |
● تقویم |
Hebrew |
یهودی |
کد: |
2 |
● تقویم |
Islamic |
اسلامی-هجری قمری |
کد: |
3 |
● تقویم |
Julian |
|
کد: |
4 |
● تقویم |
Persian |
ایرانی-هجری شمسی |
کد: |
98 |
این کنترل با نام DateConvertJS2.ocx
در اختیارتان میباشد که میتوانید نسخه آزمایشی آن را از آدرس زیر دانلود کنید.
لازم به ذکر است که این نسخه تنها تا تاریخ 30 April
2006 میلادی (برابر 10/02/1385 ﻫ .ش) فعال و
قابل استفاده خواهد بود !
DateConvertJS2
v2.0 trial
(DateConvertJS2.ocx)
Size: 148 kb
Format: zip
در زمینه کنترل دادههای تاریخی در برنامهنویسی تاکنون
الگوریتمها و برنامههای زیادی وارد این عرصه شده اما سلامت و صحت عملکرد بسیاری
از آنها به دلیل ناقص بودن الگورتم مورد استفاده در آنها دچار خدشه شده و با کمال
تأسف باید گفت که تعداد انگشت شماری از آنها فقط تا 95 درصد دادههای خروجیشان
صحیح میباشد.
به عنوان مثال تبدیلات تاریخ میلادی به هجری شمسی را کمی
مورد بررسی قرار میدهیم. تاریخ هجری شمسی با عنوان تقویم جلالی شناخته شده است
که:
سالها 12 ماه دارند که از هجرت پیامبر(ص) از مکه به مدینه در سال 622 بعد از میلاد شروع شدهاند. یک سال جلالی در اولین روز بهار نجومی و یا در روز
بعد از آن که به ترتیب
منطبق با این است که لحظه اعتدالی قبل یا بعد از ساعت 12:00 به وقت تهران
اتفاق بیفتد, شروع میشود.
در 6 ماه اول سال همه ماهها 31 روز و در 6
ماه دوم در یک سال کبیسه
همه 30 روز دارند. در سالهای معمولی (غیر کبیسه) آخرین ماه سال 29
روزه است. بنابراین
هر فصل با 3 ماه متوالی منطبق است.
انتظار میرود که تقریبا هر چهارمین سال در
تقویم ایرانی یک سال
کبیسه باشد و این نظم مشهور در تقویم خورشیدی است. بعلاوه معمولا بعد از هر 32 سال (بعضی اوقات
بعد از 28 یا 36 سال) یک سال معمولی اضافه میشود یعنی 4 سال متوالی به جای 3 سال متوالی
365 روزه است. بطور متداول سالهای کبیسه بطور یکنواخت در دورههای 33 ساله محاسبه میشوند و سالهایی هستند که در
تقسیم بر 33 باقی مانده 1,5,9,13,17,22,26و 30 داشته باشند, برای نمونه سال جلالی
1375 که در 20 مارس 1996
شروع شده است باقی مانده 22 دارد بنابراین کبیسه است. «برای اطلاعات بیشتر به
این آدرس مراجعه نمایید»
اطلاعات کامل مربوط به هر تقویم را میتوانید با انتخاب
گزینه Description در پنجره خصوصیات کنترل,
مطالعه نمایید. به عنوان نمونه در قسمت معرفی تاریخ هجری شمسی آن (با نام Persian Calendar) ذکر شده "تقویم هجری شمسی ایرانیان کاملترین تقویم
جهان است, این تقویم در هر 3.8 میلیون سال تنها یک روز اشتباه دارد".
یکی از علل متفاوت بودن کنترل فوق با دیگر کنترلها در آن
است که اصول تبدیلات تاریخ (چه در هجری شمسی و چه در دیگر تقویمها) کاملا رعایت
شده. برای اثبات این مطلب از شما دعوت میکنم بخشهای بعدی را با دقت مطالعه
نمایید.
● از این کنترل به عنوان یک کتابخانه استفاده نمایید !
یکی از امکانات عالی این کنترل توانایی شما برای استفاده از
آن به عنوان یک کتابخانه فقط برای در اختیار داشتن توابع تبدیلات تاریخ است. این
به آن معناست که در صورت تمایل برنامهنویس میتواند با Load
کردن کلاسهای موجود در این کتابخانه به صورت کاملا کد وار (همان طور که کنترل با
آن نوشته شده), تنها از توابع کنترل استفاده نماید.
برای این منظور کافی است از منوی Project
عبارت References را انتخاب کنید و در کادری که ظاهر میشود بوسیله دکمه Browse… مسیر و فایل کنترل (DateConvertJS2.ocx) را بیابید. با این کار خواهید دید که در لیست پیش رویتان گزینه «Date Convert JSv2.0
Trial» اضافه و انتخاب شده است. دکمه Ok
را کلیک کنید و اگر میخواهید بدانید چه گنجینه ارزشمندی در اختیارتان است به شما
پیشنهاد میکنم در همین مکانی که هستید کلید F2
را بفشارید تا وارد محیط Object Browser شوید و با
انتخاب عبارت DateConvertJS از کمبوی بالای صفحه, کنکاش در محتویات کتابخانه
مذکور را آغاز کنید.
برای استفاده از توابع ابتدا نیاز خود را بررسی کنید. به
عنوان مثال اگر فقط احتیاج به تبدیلات تاریخی از هجری شمسی به دیگر تاریخها را
دارید کافیست مطابق کد زیر کلاس مربوطه را برای برنامه خود بارگذاری کنید:
Public HijriD As New
DateConvertJS.Persian |
اگر امکانات هر کلاس را بررسی نمایید خواهید دید که در کلاسهای
مربوط به تاریخها, مجموعه کاملی از توابع مورد نیاز وجود دارند که در نگاه کلی
عبارتند از:
نام تابع |
عملکرد |
خروجی |
Date_jdn |
تبدیل تاریخ از قالب سال,ماه و روز به معادل JD
number آن |
نوع Long معادل JD number تاریخ ورودی |
jdn_Date |
عکس تابع بالا عمل میکند |
تاریخ با قالب فیلدهای مجزاء سال,ماه و روز |
LeapYear |
کبیسه بودن سال ورودی |
Boolean |
LastDayOfMonth یا DayInMonth |
مشخص میکند تعداد روزها در ماه تاریخ ورودی را |
Integer |
DayOfWeek |
مشخص میکند تاریخ ورودی چندمین روز هفته است |
WeekdayNumberingStyles روز را که برای هر روز هفته کدی در نظر گرفته. به
عنوان مثال کد روز دوشنبه عدد یک برابر استاندارد ISO_8601 است |
MonthName |
معادل نام ماه بر اساس نوع تقویم |
String |
WeekDayName |
نام روز در هفته را با توجه به کد حاصله از DayOfWeek و مشخصات نوع تقویم و زبان ورودی |
String |
● ساختار تبدیلات تاریخ به کار رفته در کنترل
همان طور که در جدول بالا ذکر شد و در کتابخانه کنترل میبینید
کلیه تاریخها به عددی که آن را JDN میخوانیم, تبدیل میشوند. عدد JDN مربوط به هر تاریخ, در
هر تقویم یکی میباشد. یعنی شما در تبدیل یک تاریخ میلادی به JDN معادل عددی به دست میآورید که از تبدیل معادل همان تاریخ در هجری
شمسی به JDN به دست خواهید آورد. بنابراین میبینید
که تمام تقویمها از زبان مشترکی که در اینجا JDN
است, استفاده میکنند تا بتوانند به یکدیگر تبدیل شوند.
با بررسی بیشتر در توابع به کار رفته در کنترل خواهید دید
که عمل تبدیل تاریخها یکطرفه نمیباشد ! شما میتوانید هر تاریخ در هر نوع تقویم
را به معادلش در تقویم دیگر برده و یا برگردانید. این اصل را در ریاضیات فراموش
نکنید که «اصلی که برگشت پذیر
نباشد را میتوان رد کرد» .
دقیقا نقطه قوت این کنترل در همین جاست که
امور تبدیلات تاریخها یک طرفه نیست و این خود اثباتی بر صحت عملکرد آن میباشد.
حال با یافتن فصل مشترکی بین یک تاریخ در همه انواع تقویمها
میتوان مشکل بزرگ ذخیره تاریخهای غیر میلادی را حل کرد. وی به شما توصیه میکنم
از این به بعد کلیه دادههای تاریخی خود را با تبدیل تاریخ مربوطه به عدد JDN معادل به جای نوع Date در نوع Long ذخیره کنید. با این کار فقط با ذخیره یک عدد Long میتوانید از آن کلیه تاریخهای مورد نظر در هر تقویم را بازیافت
نمایید. به عنوان مثال برایتان تاریخ پانزدهم فوریه سال 2006 را نمایش میدهم:
تقویم |
تاریخ معادل 15 فوریه 2006 |
عدد JDN معادل |
Civil* |
2006/02/15 |
2453782 |
Hebrew |
5766/05/17 |
2453782 |
Islamic |
16/01/1427 |
2453782 |
Julian |
2006/02/02 |
2453782 |
Persian |
26/11/1384 |
2453782 |
*
نوع تقویم Civil
همان Gregorian
یا میلادی است |
همان طور که ملاحظه کردید در خود کلاسها از عنوان Civil بجای Gregorian, همینطور از عنوان Islamic برای هجری قمری و از عنوان Persian
بجای هجری شمسی استفاده شده است.
سوال : چگونه تاریخها را به یکدیگر
تبدیل نماییم ؟
همان طور که در مورد عدد JDN
صحبت شد, میتوانید با واسط قرار دادن این عدد بین کلاسهای تقویم مورد نظر خود
اقدام به تبدیلات تاریخ نمایید. در کد زیر چگونگی تبدیل تاریخ پانزدهم فوریه 2006 به معادل هجری شمسی آن آورده
شده:
Private
CivilD As New
DateConvertJS.Civil Private
PersianD As New DateConvertJS.Persian |
Private Sub Main() Dim
m_Year As Integer:
m_Year = 2006 Dim
m_Month As Integer: m_Month = 2 Dim
m_Day As Integer:
m_Day = 15 Dim JDn As Long JDn = CivilD.Civil_jdn(m_Year, m_Month, m_Day) Call PersianD.jdn_Persian(JDn,
m_Year, m_Month, m_Day) End Sub |
خروجی برنامه فوق به این ترتیب خواهد بود: m_Year=1384,
m_Month=11, m_Day=26
با کمی دقت در کلاسهای همراه کنترل درخواهید یافت که کلاس
دیگری با نام DateConvert وجود دارد
که بوسیله آن میتوانید با کدهای کمتری تبدیلات تاریخ را انجام دهید به کد زیر
توجه کنید:
Private DCM As New DateConvertJS.DateConvert |
Private Sub Main() Dim
m_Year As Integer:
m_Year = 2006 Dim
m_Month As Integer: m_Month = 2 Dim m_Day As Integer:
m_Day = 15 Call DCM.Date_to(m_Year, m_Month, m_Day, Gregorian, Persian) End Sub |
گرچند که وجود کلاس DateConvert ضروری نبود و میتوانید تنها با کلاس تقویمها اهدافتان را محقق سازید اما
هر جایی که احساس کردید حجم کدهایتان آزار دهنده خواهد بود از این کلاس استفاده
کنید. در واقع این کلاس خود با ارجاع غیر مستقیم به کلاسهای اصلی, سرویس دهی میکند.
همچنین در دورهای مقایسهای که بارها از شرط برای بررسی تاریخ استفاده کردهاید,
این کلاس را فرا خوانید, زیرا شرط مورد نظرتان تنها یک بار در این کلاس به کار
خواهد رفت و بارها از آن استفاده میکنید. به عنوان مثال کد زیر نام ماه تاریخ
ورودی را بر اساس نوع تقویم مورد استفاده, برمیگرداند:
Private DCM As New DateConvertJS.DateConvert Private CalTyp As CalendarTypes |
Private Sub
Main() MsgBox DCM.MonthName(m_Month,
m_Day, m_Year, CalTyp) End Sub |
این کد نسبت به تاریخ ورودی همین طور نوع تقویم که در CalTyp نگه داری میشود, و البته زبان مورد استفاده کاربر (که میتوانید
آن را وارد نکنید) عمل مینماید.
با وجود بیش از 80 خصوصیت در این کنترل ادعای فوق انعطاف
بودنش اثبات میشود. شما میتوانید هر آنچه را که میخواهید تغییر دهید و به نفع
برنامه خود خصوصیات را مقدار دهی کنید. اندازه ثابت, رنگهای غیر قابل تغییر و
الگوهای یکنواخت را دیگر در اینجا نخواهید دید. حتی اگر امکانات موجود در خصوصیات
کنترل برایتان به پایان رسیدند باز هم ناامید نشوید. زیرا کنترل خصوصیت ویژهای را
عبور میدهد که میتوانید بوسیله آن تک تک عناصر و اشیاء به کار رفته در سطح کنترل
را مدیریت کنید. این خصوصیت ویژه که Controls نام دارد,
در خود تمام اشیاء موجود در کنترل را جای داده است تا بوسیله آنها بتوانید به
خصوصیاتشان دست بابید. پس میبینید که تعداد اصلی خصوصیات مربوط به کنترل فوق حتی
خیلی بیشتر از اینها میباشد. در مباحث پایانی به بررسی این خصوصیت خواهیم
پرداخت.
در این قسمت فقط بوسیله کد میخواهیم یک برنامه تقویم
رومیزی بنویسیم.
ابتدا برروی شمایل کنترل DateBoardJS موجود در Toolbox
دوبل کلیلک کنید تا برروی فرمتان آماده کار شود.
حال کدهای زیر را در فرمتان وارد کنید سپس کلید F5
را بفشارید.
Private Sub
Form_Load() With DateBoardJS1
.Year = Year(Now) .Month = Month(Now) .Day = Day(Now) .CalendarType
= Persian .DayNameLanguage
= lFarsi
.DayNameMaxLength = 1
.DayNameFontSize = 18 Set m_Font = .Font With m_Font .Charset
= 178 '
=ARABIC_CHARSET .Name = "Tahoma" .Size = 18 End With Set .Font = m_Font End With End Sub |
Private Sub
Form_Resize() DateBoardJS1.Move
0, 0, ScaleWidth, ScaleHeight End Sub |
پر استفادهترین خصوصیتات این کنترل Year, Month و Day میباشند. زیرا بوسیله آنها تاریخ مورد نظر خود را وارد میکنید.
هر سه این خصوصیات در نوع Integer
میباشند. همینطور بوسیله خصوصیت CalendarType
میتوانید نوع تقویم مورد استفاده خود را تغییر دهید. با هر تغییر مقدار CalendarType خصوصیات Year, Month و Day بطور اتوماتیک با سال, ماه و روز نوع
تقویم جدید به روز خواهند شد.
● نکته: در صورتی که روز, ماه یا حتی
عدد سال ورودی نامعتبر باشد (یعنی بر اساس نوع تقویم اطلاعات ورودی تولید یک تاریخ
حقیقی را نکند), کنترل از در نظر گرفتن داده جدید صرف نظر کرده و داده قبلی آن
خصوصیت جایگزین داده ورودی میشود.
در کد مثال قبل میبینید که برای به دست آوردن تاریخ جاری
هجری شمسی (در این جا ما از لفظی Persian استفاده
میکنیم) ابتدا مقدارهای سال, ماه و روز را با مقدارهای جاری میلادی سیستم
کاربر, تنظیم کرده سپس با تغییر نوع تقویم به Persian
میتوانیم معادل تاریخ روز را در هجری شمسی در کنترل بنشانیم.
این نکته را خاطر نشان شوم که تنظیم سال, ماه و روز بر اساس
تاریخ جاری سیستم کاربر تنها برای زمانی که نوع تقویم Gregorian
است, درست میباشد. و همیشه توجه به نوع تقویم برای نشاندن تاریخ روز ضروری است.
علت اینکه برای تنظیم تاریخ سه خصوصیت در نظر گرفته شده
کاملا روشن است. زیرا در صورت یکی بودن خصوصیت تاریخ وردی آنگاه باید خصوصیت دیگری
برای تعیین فرمت تاریخ ورودی تعریف میشد. ممکن است قبلا با ابن مشکل در برنامهنویسی
مربوط به دادههای تاریخی مواجه شده باشید که در بسیاری از مواقع تشخیص عدد روز در
تاریخ از ماه مشکل و حتی غیر ممکن میشود. مثال 02/03/2006 مناسب برای این بحث است. اگر شما ندانید که فرمت این تاریخ dd/mm/yyyy است یا mm/dd/yyyy چگونه میتوانید
بفهمید که ماه تاریخ 3 است یا 2 ؟!؟
البته در این کنترل برای خروجیهای نمایشی فرمتهایی تعریف
شده است که در جای خود درباره آنها بحث خواهد شد.
حال فرمان ChangeDate
را معرفی میکنم. بوسیله این
فرمان میتوانید همه خصوصیات سال, ماه, روز و نوع تقویم را به یکباره تغییر دهید.
With
DateBoardJS1 '.Year =
m_Year '.Month = m_Month '.Day =
m_Day
'.CalendarType = Persian .ChangeDate
m_Year, m_Month, m_Day, Persian End With |
در اینجا هم اشاره میکنم که توجه داشته باشید, تاریخ ورودی
بوسیله فرمان ChangeDate باید براساس نوع تقویم ورودی
به فرمان باشد, در غیر این صورت این روال اقدام به تغییر تاریخ ورودی با توجه به
تقویم مد نظر شما, نخواهد کرد.
● خصوصیات نام روز از هفته DayName
بعد از تغییر نوع تقویم لازم است که خصوصیات دیگری را تغییر
دهید تا برچسبهای نمایشی نیز با توجه به زبان و نوع تقویم مورد استفاده تغییر
کنند. خصوصیات دسته DayName از این جمله میباشند. این خصوصیات
برای تنظیم نام روزهای هفته (شنبه, یکشنبه و ...) طراحی شدهاند.
خصوصیت DayNameLanguage : بوسیله این خصوصیت زبانی که قرار است نام روزها بوسیله آن نمایش داده شوند را انتخاب کنید. البته این
مسئله کاملا در اختیار شما است و کنترل تا آنجایی که برایش تعریف شده, نام روزها
و حتی ماهها را بر اساس زبانهای موجود در آن نمایش میدهد. گرچند که ممکن است
انتظار داشته باشید که کنترل همراه با تغییر نوع تقویم, بطور اتوماتیک اقدام به
تعیین این خصوصیات نماید (مثلا وقتی که نوع تقویم هجری شمسی است زبانها به فارسی
تغییر کنند), باید بگویم این مسئله ممکن نمیباشد. زیرا برنامه سازان و کاربرانی
هستند که میخواهند یک نوع تقویم را در زبان مورد استفاده خودشان به کار ببرند
(مثلا نوع تقویم اسلامی یا هجری قمری در زبان فارسی نه عربی). وجود این خصوصیت
موجب میشود تا کاربران برای انتخاب زبان مورد علاقه خود دچار مشکل نشوند.
به این ترتیب انتخاب زبانهای نمایشی در کنترل بر عهده شما
است. میتوانید زبان فارسی را با هجری شمسی برگزینید یا با نوع میلادی که این
مسئله موجب میشود کنترل در حالت اول نام روز اول هفته را "شنبه" و در
حالت دوم "Shanbeh" را نمایش دهد.
حال به عکس مثال بالا توجه کنید: کنترل, نام ماه اول سال در
تقویم میلادی با تنظیمات زبان اینگلیسی, "January"
را عبور میدهد اما در زبان فارسی عبارت "ژانویه" را.
البته چگونگی تنظیم زبان مربوط به نام ماهها را در جای خود
بررسی میکنیم.
● نکته: در
صورتی که مقدار این خصوصیت lMachine یا عدد صفر باشد, کنترل برای به دست آوردن نام روزها از تنظیمات زبان
ماشین (سیستم کاربر) استفاده میکند. به این ترتیب دامنه تحت پوشش به چند زبان
موجود در کنترل محدود نمیشود و کاربران دیگر زبانها نیز خواهند توانست به نحو
احسن از این کنترل بهره برند.
● نکته: برای
تنظیمات زبانهای خانواده عربی از خصوصیت Charset همراه Font استفاده کنید. برای Charset عربی از
کد 178
استفاده کنید.
خصوصیت DayNameMaxLength : با
این خصوصیت تعیین کنید که حداکثر تعداد کاراکترهای قابل نمایش در نام روزها چه
تعدادی باشد. میتوانید از اعداد صفر تا 254 را تنظیم کنید اما کد 255 برای
زمانی است که میخواهید نام روزها با تمام طول خود نمایش داده شوند.
خصوصیت DayNameFontSize : به
منظور تنظیم ابعاد نام روزها (یعنی تنظیم اندازه فونت نمایشی آن) از خود خصوصیت Font کنترل مجزاء شده است.
خصوصیت DayNameMode : با
این خصوصیت سه حالت را برای نمایش دادههای نام روزها در کنترل تعیین نمایید:
حالت |
شرح |
0-dnm_None |
در این حالت نوار
نام روزها از کنترل حذف شده
و دیگر نام روزها نمایش داده نمیشود |
1-dnm_Program |
این گزینه پیش فرض
است که موجب میشود تنظیمات نام روزها
بر اساس تنظیمات کاربر برروی برنامه انجام شود |
2-dnm_Custom |
در این حالت دادهها
برای نمایش در نوار نام روزها از خصوصیت DayNameCustom میآید تا همه کاربران بتوانند حتی
نامهای سفارشی خود را در کنترل وارد کنند و نمایش دهند |
خصوصیت DayNameCustom : با
این خصوصیت میتوانید نام روزهای سفارشی خود را به کنترل بشناسانید. مقدار پیش
فرض آن عبارت "Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday" است.
همچنین برای اینکه این خصوصیت باز مقدار پیش فرض خود را بگیرد آن را برابر تهی
"Empty"
قرار دهید.
کار این خصوصیت آن است که در مواقعی که کاربر یا برنامه
نویسی که در زبانی به جزء زبانهای تعریف شده در کنترل کار میکند, بتواند عبارات
نام روزهای زبان خود را به کنترل وارد نماید. میبینید که این یک خصوصیت پیشرفته
است.
برای وارد کردن نام روزهای هفته به ترتیب چیدمان آنها در
مقدار پیش فرض, نامها را قرار دهید و بوسیله کاراکتر میل "Vertical Bar |" نامها را از هم جدا کنید. این عبارت فقط یک نمونه است: "2 Shanbeh|3 Shanbeh|4 Shanbeh|5
Shanbeh|Jomeh|Shanbeh"
● نکته: این
کنترل برای در نظر گرفتن روزهای هفته از استاندارد ISO_8601
استفاده میکند. در این استاندارد روز اول هفته روز دوشنبه است و به این ترتیب کد
روزها را به ترتیب دوشنبه=1 , سهشنبه=2 و ... تنظیم مینماید. البته خصوصیتی در
خود کنترل وجود دارد که بوسیله آن میتوانید روز اول هفته, در حالت نمایش را تغییر
دهید اما با تغییر آن کد روزها و ترتیب قرار گرفتنشان در این خصوصیت, تغییر نمیکند.
● نکته:
کنترل تنها زمانی نام روزها را بر اساس عبارت موجود در این خصوصیت مینشاند, که
خصوصیت DayNameMode مقدار 2 یا dnm_Custom را داشته باشد.
چگونگی چیده شدن روزها نیز در اختیار شما است:
خصوصیت CalendarArrange : این
خصوصیت 4 مقدار میگیرد ca_Top=0 , ca_Bottom=1 , ca_Left=2 , ca_Right=3
. بوسیله این خصوصیت میتوانید
تعیین کنید که نوار نام روزها در کجای مستطیل صفحه تاریخ نمایش داده شود. در بالا
یا پایین و یا کنارههای سمت چپ یا راست.
خصوصیت DayofWeekArrange : در
صورتی که مقدار این خصوصیت True باشد
چیدمان روزها از راست به چپ تنظیم میشود. و اگر False
باشد روزهای تقویم, از چپ به راست در صفحه تقویم چیده میشوند. بنابه اینکه دادههای صفحه
تقویم اعداد ریاضی میباشند چیدمان آغازی, از چپ به راست است. یعنی مقدار پیش فرض
این خصوصیت مقدار False است.
● نکته: در
اینجا استفاده از عبارات راست به چپ یا چپ به راست برای زمانی که خصوصیت CalendarArrange مقدارهای صفر یا یک را داشته باشد (یعنی نوار نام روزها بالا یا
پایین صفحه باشد) درست خواهد بود. در صورتی که خصوصیت CalendarArrange یکی از دو مقدار 2 یا 3 (نوار ابزار در کناره سمت
چپ یا راست) را داشته باشد باید از عبارت "بالا به پایین برای مقدار True" و عبارت "پایین به بالا برای مقدار False" , استفاده کرد.
خصوصیت FirstDayOnWeek : اگر
برای شما نوع و چگونگی نمایش روزها اهمیتی نداشته باشد, بطور حتم اینکه روز اول
هفته تقویمتان چه روزی باشد, مهم خواهد بود. بوسیله این خصوصیت روز اول هفته را
تعیین کنید تا در صفحه تاریخ چیدمان صحیح روزها بر اساس تنظیمات مورد نظرتان
انجام گیرد.
همان طور که قبلا توضیح داده شد مقدار پیش فرض این خصوصیت
روز دوشنبه است و البته کد این روز هم در کنترل عدد 1 میباشد. باز خاطر نشان شوم
که با تغییر روز اول هفته کد روزها تغییر نخواهند کرد بلکه فقط نمایش چیدمان روزها
تغییر میکند.
● نکته: از
امکانات دیگر این کنترل امکان نمایش روزهای تعطیل با رنگی متفاوت از بقیه روزها
است. کنترل به طور پیش فرض همه روزهای آخر هفته را تعطیل فرض میکند. همین طور
برای شناسایی روزهای آخر هفته از این خصوصیت استفاده میکند. بنابراین در مقدار
دهی صحیح این خصوصیت دقت لازم را به خرج دهید.
یکی دیگر از امکانات عالی این کنترل توانایی شما برای ایجاد
ظاهری زیبا و با الگوهای متفاوت در صفحه تاریخ میباشد. در این قسمت خصوصیاتی از
کنترل که مربوط به این بحث است مورد بررسی قرار میگیرد.
خصوصیت BorderStyle :
اگر مقدار این خصوصیت صفر یا bs_None باشد
کنترل هیچ حاشیهای در اطراف صفحه تاریخ نمایش نمیدهد اما اگر مقدار این خصوصیت
یک یا bs_Single باشد
کنترل (براساس دو خصوصیت بعدی مورد بحث) اقدام به ترسیم حاشیه اطراف صفحه مینماید.
خصوصیت BorderWidth : اگر
کنترل را طوری تنظیم کرده باشید که برای خود حاشیه رسم نماید, بوسیله این خصوصیت
میتوانید اندازه حاشیه را تعیین کنید.
خصوصیت Appearance : بوسیله
این خصوصیت میتوانید نوع ترسیم حاشیه را تعیین کنید. البته اگر برابر efFlat باشد فقط خطوطی اطراف صفحه تاریخ
ترسیم میشود.
خصوصیت BorderColor :
رنگ حاشیه اطراف را با این خصوصیت تعیین کنید.
خصوصیت BackStyle : اگر
برابر bp_Transparent یا عدد صفر
باشد موجب میشود که تمام پس زمینه و حاشیه اطراف کنترل محو شده و فقط لیبلهای
نمایشی قابل مشاهده باشند. در غیر این صورت بوسیله این خصوصیت میتوانید از 50
الگوی زیبایی که برایتان طراحی شده استفاده کنید.
خصوصیات BackColor1
و BackColor2 : با
این دو خصوصیت رنگهای پس زمینه را تنظیم کنید.
خصوصیت BackPChangeEtS :
بوسیله این خصوصیت میتوانید به سرعت جای رنگهای پس زمینه را تغییر دهید. یعنی به
جای اینکه خود مقدارهای خصوصیات BackColor1 و BackColor2 را به یکدیگر تغییر دهید, این خصوصیت موجب این تغییر میشود اما
مقدارهای اصلی دو رنگ نام برده شده تغییر نمیکنند. این خصوصیت باعث میشود کنترل
در زمان اعمال تغییرات به طور اتوماتیک مقادیر دو رنگ پس زمینه را به یکدیگر تغییر
دهد. یکی از کاربردهای این خصوصیت برای اعمال تغییر جهت در Bound ترسیمات است که در جای خود توضیح داده میشود.
خصوصیت BackPBound : با
این خصوصیت محدودهای تعریف میکنید که در آن محدوده ترسیمات انجام نشده و فقط رنگ
پس زمینه اول در آنجا قرار میگیرد. زمانی این خصوصیت را مقدار دهی کنید که
هماهنگی میان خطوط ترسیم و رنگهای پس زمینه ممکن نباشد. Bound تنها روی رنگ اول یعنی خصوصیت BackColor1 اعمال میشود. البته میتوانید برای تغییر جهت اعمال Bound مقدار خصوصیت BackPChangeEtS را تغییر دهید.
خصوصیت BackPaint3D : در
حالت عادی با توجه به الگویی که برای ترسیمات پس زمینه صفحه تاریخ خود انتخاب کردهاید,
ترسیمات از رنگ اول BackColor1 آغاز شده
و به رنگ دوم BackColor2 ختم میشود.
مگر اینکه مقدار این خصوصیت برابر True باشد که
در این صورت ترسیمات از رنگ اول شروع شده تا میان محدوده ترسیمات به رنگ دوم ختم
میشود, سپس باز از میان محدوده ترسیمات که حاوی رنگ دوم است, ترسیمات آغاز شده و
تا پایان محدوده ترسیمات به رنگ اول پایان مییابد.
در واقع با وجود این خصوصیت تعداد الگوهای قابل استفاده در
کنترل دو برابر میشود و به بیش از 100 الگوی مختلف میرسد.
● نکته: برخی
از الگوهایی که در کنترل قرار داده شدهاند, اگر خصوصیت BackPaint3D برابر True باشد زیباتر خواهند بود. الگوهای دایرهای یا mCircle ها از این دستهاند.
خصوصیت BackMove :
این یک خصوصیت پیشرفته از نوع String میباشد که میتوانید
بوسیله آن ابعاد کادر درونی صفحه تاریخ را تغییر دهید. قالب این خصوصیت به شکل
"Left,Top,Right,Bottom" است
و در این مثال "10,0,15,30" داریم: کادر درونی صفحه تاریخ از سمت چپ کادر نسبت به
دیواره سمت چپ 10 واحد, از بالای کادر هیچ فصلهای, از سمت راست 15 واحد و از
پایین کادر به اندازه 30 واحد فاصله میگیرد. همان طور که در قالب میبینید باید
اعداد ورودی خود را بوسیله کاراکتر کاما از دیگر اعداد جدا نمایید. از این خصوصیت
برای زمانی استفاده کنید که میخواهید جعبه گزارش تاریخ, وجودی مستقل بر روی صفحه
نمایش تاریخ داشته باشد. کمی جلوتر درباره جعبه گزارش تاریخ به طور مفصل توضیح
داده شده است.
● نکته: این
خصوصیت را تنها از طریق کد میتوانید مقدار دهی کنید.
خصوصیت ForeColor :
برای نمایش روزهای متعلق به ماه تاریخ ورودی, از این رنگ استفاده میشود.
خصوصیت DayColor :
لیبل روز تاریخ ورودی دارای این رنگ است تا کاربر بتواند روز انتخابی را در میان
دیگر روزهای ماه تاریخ ورودی تشخیص دهد.
خصوصیت OutDaysShow
:
با توجه به اینکه حاصل ضرب تعداد سطر و ستونهایی که در صفحه تاریخ نمایش داده میشوند
با تعداد روزهای ماه ورودی یکی نیستند (اغلب تعداد سطرها 5 و تعداد ستونها 7
است که حاصل ضرب یعنی عدد 35 بزرگتر از پر روزترین ماهها یعنی 31 میشود),
تعدادی روز از ماه قبل و بعد از ماه ورودی, درون صفحه تاریخ قابل نمایش خواهد بود.
در صورتی که این خصوصیت مقدار True را داشته
باشد روزهای نام برده درون صفحه تاریخ نمایش داده میشوند.
خصوصیت OutDaysColor
:
روزهای خارج از ماه ورودی با این رنگ قابل تشخیص خواهند بود.
خصوصیت OutDaysShadow
:
این خصوصیت رنگ سایه روزهای خارج از ماه ورودی را مشخص میکند. سایه روزها زمانی
نمایش مییابد که اشارهگر ماوس را برروی لیبل یک روز حرکت دهید (کمی جلوتر درباره
سایه روزها به طور مفصل صحبت شده است).
خصوصیت OutDaysActive
:
اگر این خصوصیت مقدار False را داشته
باشد زمانی که یکی از روزهای خارج از ماه ورودی را بوسیله ماوس انتخاب میکنید
دیگر رویداد SelectedDay اتفاق
نمیفتد. همچنین با حرکت اشارهگر ماوس برروی روزهای نام برده, دیگر سایه آنها
نمایش نمییابد.
خصوصیت DayNameColor
:
متن لیبلهایی که نام روزهای هفته را نمایش میدهند دارای این رنگ هستند.
خصوصیت DayNameApartBackStyle
:
در صورتی که مقدار این خصوصیت True باشد, ترسیمات پس زمینهای برای نوار نام روزها به طور مجزاء و با خوصیاتی
که شرح داده میشوند, انجام خواهد شد.
خصوصیت DayNameBackStyle
:
بوسیله این خصوصیت میتوانید از 50 الگوی زیبایی که برایتان طراحی شده, برای
ترسیمات پس زمینهای نوار نام روزها استفاده کنید.
خصوصیات DayNameBackColor1 و DayNameBackColor2
:
با این دو خصوصیت رنگها را برای ترسیمات پس زمینهای نوار نام روزها تنظیم کنید.
خصوصیت DayNameChangeStarttoEnd : این خصوصیت همانند
خصوصیت BackPChangeEtS
است با این تفاوت که به ترسیمات پس زمینهای نوار نام روزها
مربوط میشود.
خصوصیت DayNameBackBound : این خصوصیت همانند
خصوصیت BackPBound
است با این تفاوت که به ترسیمات پس زمینهای نوار نام روزها
مربوط میشود.
خصوصیت DayNameBackPaint3D : این خصوصیت همانند
خصوصیت BackPaint3D
است با این تفاوت که به ترسیمات پس زمینهای نوار نام روزها
مربوط میشود.
خصوصیت DayNameAreaBackStyle : اگر ترسیمات پس زمینهای نوار
نام روزها با صفحه تاریخ متفاوت باشد بوسیله این خصوصیت میتوانید فضایی میان آن
دو نوع طرح ترسیم شده ایجاد کنید, تا هر دوی آنها قابل تشخیص از یکدیگر باشند.
خصوصیت BackStylesProportion : در صورتی که این خصوصیت مقدار True را داشته باشد, مقادیر خصوصیات تمام ترسیمات پس زمینهای در کنترل
از خصوصیات اصلی تبعیت میکنند (به عنوان مثال با توجه به True بودن این خصوصیت 6 خصوصیت قبلی که تشریح شدند دیگر قابل ارجاع
برای ترسیمات پس زمینهای نوار نام روزها نخواهند بود).
● نکته:
خصوصیات مربوط به ترسیمات پس زمینهای نوار نام روزها فقط از طریق کد قابل تغییر
هستند (بوسیله کد زیر میتوانید یک ترسیم پس زمینهای بی دردسر را انجام دهید).
With DateBoardJS1
.BackStylesProportion = False ' Proportion
Setting .DayNameBackColor1 =
.BackColor1
.DayNameBackColor2 = .BackColor2
.DayNameBackPaint3D = True
.DayNameBackStyle = bp_Circle5
.DayNameApartBackStyle = True End With |
● تنظیمات روزهای تعطیل Holidays
همان طور که قبلا هم اشاره شد, در این کنترل امکان نمایش
روزهای تعطیل با رنگی متفاوت از روزهای دیگر, وجود دارد. همین طور گفتیم کنترل
به طور پیش فرض تمام روزهای آخر هفته را به عنوان روز تعطیل در نظر میگیرد.
همچنین در این قسمت فرا خواهید گرفت که چگونه دیگر روزها را به عنوان یک روز
تعطیل به کنترل بشناسانید.
خصوصیت HolidaysShow : به طور کلی برای اینکه کنترل اقدام به اعمال
تغییرات روزهای تعطیل نماید, مقدار این خصوصیت را برابر True قرار دهید.
خصوصیت HolidaysColor : متن لیبلهایی که حاوی
یک روز تعطیل است با این رنگ از دیگر لیبلها مجزاء میشود.
● نکته: روزهای
خارج از ماه ورودی نمیتوانند از امکانات نمایش روزهای تعطیل استفاده کنند.
خصوصیت DayNameHolidaysShow : اگر مقدار این خصوصیت True باشد (و البته باید مقدار خصوصیت HolidaysShow نیز True باشد) نام روز آخر هفته نیز از
تنظیمات روزهای تعطیل برای نمایش رنگ متن خود بهره میبرد (به عنوان مثال اگر روز
اول هفته را روی شنبه تنظیم کرده باشید, رنگ متن روز جمعه برابر رنگ روزهای تعطیل
خواهد بود).
فرمان AddHoliday : بوسیله این فرمان خیلی
راحت میتوانید یک تاریخ جدید را به عنوان یک روز تعطیل در جعبه روزهای تعطیل
قرار دهید.
AddHoliday(YearIn As Integer,
MonthIn As Integer, DayIn As Integer) |
اگر تاریخی که وارد میکنید قبلا در جعبه روزهای تعطیل
موجود باشد, تاریخ جدید در جعبه قرار نخواهد گرفت.
فرمان RemoveHoliday : بوسیله این فرمان میتوانید
تاریخی که قبلا به عنوان یک روز تعطیل به کنترل معرفی کردهاید را از جعبه روزهای
تعطیل خارج نمایید.
RemoveHoliday(YearIn As Integer,
MonthIn As Integer, DayIn As Integer) |
اگر تاریخی که وارد میکنید در جعبه روزهای تعطیل موجود
نباشد, هیچ اتفاق یا خطای خاصی روی نمیدهد !
گرچند که بعضی از الگوهای پس زمینهای طوری هستند که روزها
را در صفحه تاریخ از یکدیگر مجزاء نشان میدهند, اما این امکان را هم دارید که با
تنظیم و ایجاد خطوطی مابین سطرها و ستونها موجبات جدول بندی صفحه تاریخ را فراهم
سازید.
خصوصیت LineMode : این خصوصیت نمایش خطوط
را تنظیم میکند. چهار حالتی که به خود میگیرد به شرح ذیل است.
حالت |
شرح |
0-vbSBNone |
در این حالت هیچ
یک از از خطوط افقی یا عمودی نمایش داده نمیشوند |
1-vbHorizontal |
با این گزینه تنها
خطوط افقی نمایش داده میشوند |
2-vbVertical |
با این گزینه تنها
خطوط عمودی نمایش داده میشوند |
3-vbBoth |
در این حالت هر
دو دسته خطوط افقی و عمودی نمایش داده میشوند |
خصوصیت LineStyle
: این خصوصیت تعیین میکند
که خطوط به شکل تمام (کامل), نقطه چین, خط چین و یا ترکیبی از آنها ترسیم شوند.
خصوصیت LineDrawMode
: بوسیله این خصوصیت نوع واکنش خطوط با رنگ و الگوهای پس
زمینه خود را تعیین کنید.
خصوصیت LineColor : رنگ خطوط را نیز در
اینجا مقدار دهی کنید.
خصوصیت LineWidth : ضخامت خطوط ترسیمی, در
این خصوصیت مقدار دهی میشود.
● نکته:
خصوصیات LineStyle, LineDrawMode و LineWidth را تنها از طریق کد میتوانید مقدار دهی کنید.
اگر تنظیماتی که در این بخش به شما معرفی میشوند را در
کنترل اعمال کنید, زمانی که اشارهگر ماوس را برروی لیبل روزها حرکت دهید, سایه
متن آن به نمایش در میآید.
خصوصیت ShadowActive : اگر مقدار این خصوصیت
برابر False باشد, هیچ سایهای به هیچ وجه درون
صفحه تاریخ مشاهده نخواهد شد.
خصوصیت ShadowColor : رنگ سایه روزهای متعلق
به ماه ورودی را در این خصوصیت تنظیم نمایید.
● نکته: سایه
مربوط به روزهای خارج از ماه ورودی به طور مجزاء در خصوصیت OutDaysShadow که قبلا معرفی شد تنظیم میگردند.
خصوصیت ShadowDepth : فاصله میان متن روز با
سایه خود در این خصوصیت مقدار دهی میشود (متن روز بر سایه خود همپوشانی دارد و با
زیاد کردن عدد موجود دراین خصوصیت موجب میشوید که سایه بهتر قابل مشاهده باشد).
خصوصیت ShadowPosition : جهت و سوی حرکت سایه,
نسبت به متن روز را در این خصوصیت تنظیم کنید. به عنوان مثال اگر مقدار این خصوصیت
برابر po_TopLeft یا عدد صفر باشد, سایهها
در جهت بالا سمت چپ نسبت به محل قرار گیری متن روز تشکیل میشوند.
● نکته: اگر
مقدار این خصوصیت برابر po_Center یا عدد 4 باشد سایه به طرف مرکز حرکت کرده بنابراین سایهای دیده نمیشود.
در واقع متن روز به طور کامل بر سایه خود همپوشانی میکند.
● نکته: نام
روزهای هفته نمیتوانند سایه بگیرند. علت این امر را کمی جلوتر در قسمت رویدادها
متوجه خواهید شد.
رویداد DateChange
: این رویداد زمانی رخ میدهد که اقدام به تغییر تاریخ
کنترل نمایید. در حقیقت زمانی که یکی از خصوصیات Year, Month و Day بوسیله شما و یا از طرق غیر مستقیم,
تغییر کنند, این رویداد رخ خواهد داد.
رویداد SelectedDay : وقتی یکی از
روزهای
صفحه تاریخ را با Click برمیگزینید این رویداد اتفاق میفتد.
همان طور که در قالب رویداد ملاحظه میکنید مشخصات تاریخ انتخابی کاربر به همراه
نوع تقویمی که تاریخ انتخابی در آن قرار دارد, بوسیله رویداد برگشت داده میشوند.
از آنجایی که در صفحه تاریخ امکان نمایش چند تقویم به طور همزمان نیز وجود دارد,
برگشت دادن نوع تقویم, برنامه نویس را برای تشخیص دقیق تاریخ انتخابی یاری مینماید.
SelectedDay(YearS As Integer,
MonthS As Integer, DayS As Integer, DateMode As CalendarTypes) |
● نکته: اگر
خصوصیت OutDaysActive مقدار False را داشته
باشد, به هنگام انتخاب روزهای خارج از ماه ورودی کنترل, این رویداد اتفاق
نمیفتند.
خصوصیت DownActive : اگر این خصوصیت مقدار False را داشته باشد به هنگام انتخاب یک روز, دیگر رویداد SelectedDay (و موارد مربوط به انتخاب یک روز مانند محو شدن سایه), اتفاق
نمیفتد.
● نمایش چند تقویم در یک صفحه !
یکی از امکانات منحصر به فرد این کنترل امکان نمایش چند نوع
تقویم فقط در یک صفحه میباشد. به طور کلی انواع و خصوصیات تقویمهایی که در صفحه
تاریخ نمایش مییابند را میتوانید از تابع ItemDate
دریافت کنید. فقط کافی است شماره ایندکس تاریخ مورد نظر را وارد نمایید. به طور
پیش فرض تنظیمات جدول تاریخ اصلی با ایندکس صفر در کنترل ذخیره میشوند. یعنی حتی اگر تقویم جدیدی به کنترل اضافه نکرده باشید, همان تقویمی که
به هنگام ایجاد کنترل مشاهده کردید و در زمان طراحی برنامهتان خصوصیات آن را بوسیله پنجره Properties تغییر دادهاید, جدول تاریخ اول و پیش فرض کنترل خواهد بود و همان
طور که گفته شد برای شناسایی آن باید از کد صفر استفاده کنید. به زودی این مسئله
برای شما روشن تر خواهد شد.
عملگر ItemDate
: با وارد کردن شماره ایندکس جدول تاریخ مورد نظر, این عملگر
اطلاعات تقویم موجود در حافظه کنترل را به خروجی تحویل میدهد. خروجی این
عملگر از نوع DateTables
میباشد
و در جدول زیر مشخصات و کاربرد عناصر موجود در این نوع دادهای را مشاهده مینمایید.
عنصر |
شرح |
CalendarType |
بوسیله این عنصر نوع
تقویم جدول تاریخ تعیین میشود |
FontSize |
اندازه فونت برای
نمایش اطلاعات جدول تاریخ |
DayNameMode |
همانند خصوصیت DayNameMode خود کنترل است با این تفاوت که مربوط به جدول تاریخ
مورد ارجاء میباشد |
DayNameCustom |
اگر عنصر DayNameMode این جدول تاریخ مقدار 2 یا سفارشی را داشته باشد, نام
روزهای این جدول تاریخ
از این عنصر گرفته میشود. این عنصر
همانند خصوصیت DayNameCustom در خود کنترل است |
DayNameMaxLen |
همانند خصوصیت DayNameMaxLength کنترل است و با آن حداکثر طول نام
روزهای جدول تاریخ مد نظر را تعیین میکنید. اگر مقدار این
خصوصیت عدد 255 باشد نام روزهای هفته با طول کامل نمایش مییابند |
DayNameFontSize |
اندازه فونت لیبلهای
نام روزها در این عنصر نگه داری میشود |
DayNameLan |
زبان مورد نظر برای
نمایش نام روزها از این عنصر میآید. این عنصر مشابه خصوصیت DayNameLanguage در خود کنترل است |
RtoLAuto |
اگر مقدار این عنصر True
باشد کنترل بدون در نظر گرفتن داده موجود در عنصر RightToLeft به طور اتوماتیک برای نوع تقویمهای Islamic و Persian کلیه لیبلها را به
صورت Right to Left با مقدار True در میآورد و Right to Left بقیه نوع تقویمها را False تنظیم میکند (کمی جلوتر درباره
تنظیم خصوصیات
RightToLeft خود
کنترل صحبت خواهد شد) |
RightToLeft |
بوسیله این عنصر تنظیمات
Right to Left مربوطه با توجه به نوع تقویم و زبان انتخابی را انجام
دهید |
Place |
مکان قرار گیری دادههای
جدول تاریخ جدید بوسیله این عنصر تنظیم میشود. نمیتوانید محل تنظیم دادههای
جدول تاریخ پیش فرض را تعیین کنید ! زیرا به طور دائم محل آن مزکز یا po_Center با کد 4 است |
PlaceOut |
اگر مقدار این عنصر True باشد تنظیم محل قرار گیری دادههای جدول تاریخ رو به خارج محاسبه و
اعمال میشود |
ReportBox |
تنظیمات مربوط به جعبه
گزارش که از نوع ReportBoxs بوده و بوسیله آن میتوانید
تنظیماتی از قبیل فرمت نمایش نام ماهها و یا زبان نمایش نام ماهها را اعمال کنید.
این عنصر به همراه خصوصیات مربوط به ReportBox خود کنترل در
قسمتهای مربوطه به طور مفصل
شرح داده خواهد شد |
ChildDay |
در صورتی که مقدار این
خصوصیت True باشد جدول تاریخ فوق از عملگرهای
جدول تاریخ اصلی (که با کد صفر شناخته میشود) پیروی میکند. به عنوان مثال وقتی
اشارهگر ماوس را برروی یکی از روزهای مربوط به این جدول تاریخ حرکت دهید سایه
در زیر داده معادل جدول تاریخ اصلی تشکیل میشود. و یا وقتی یکی از روزهای این
جدول تاریخ را انتخاب میکنید, رویداد SelectedDay, تاریخ مربوط به جدول اصلی تاریخ
را عبور میدهد ( در واقع با این عنصر باعث میشود این جدول تاریخ فرزند جدول
تاریخ اصلی شده و از عملگرهای مادر خود پیروی کند) |
اگر در خصوصیات خود کنترل کمی
دقت کرده باشید در خواهید یافت که همه عناصر موجود در نوع دادهای DateTables برای خود کنترل نیز تعریف شدهاند. اما این خصوصیات مربوط به کدام
جدول تاریخ هستند؟ به جدول زیر توجه نمایید:
خصوصیات کنترل |
|
عناصر جدول تاریخ با ایندکس صفر |
CalendarType |
= |
CalendarType |
Font.Size |
= |
FontSize |
DayNameMode |
= |
DayNameMode |
DayNameCustom |
= |
DayNameCustom |
DayNameMaxLength |
= |
DayNameMaxLen |
DayNameFontSize |
= |
DayNameFontSize |
DayNameLanguage |
= |
DayNameLan |
RightToLeftAuto |
= |
RtoLAuto |
RightToLeft |
= |
RightToLeft |
مقدار پیش
فرض 4 یا مرکز را دارد |
= |
Place |
False |
= |
PlaceOut |
ReportBox Properties |
= |
ReportBox |
چون خود جدول
تاریخ مادر است پس خصوصیت معادل این عنصر را ندارد |
= |
ChildDay |
بنابراین بوسیله کد زیر خیلی راحت میتوانید همان دادههای
خصوصیات کنترل که مربوط به جدول تاریخ اصلی میشوند را در قالب DateTables دریافت کنید.
Dim Dtab As DateTables Dtab = DateBoardJS1.ItemDate(0( ' 0 ,zero is index main DateTable |
همچنین با کدی که معرفی شد سریع
تر قادر خواهید بود جداول تاریخ جدید را به کنترل بیفزایید. این موضوعی است که در
بخش بعدی مطالعه خواهید کرد.
● نکته:
عملگر ItemDate تنها برای دریافت دادههای جداول تاریخ طراحی شده و بوسیله آن نمیتوانید
به طور مستفیم مقادیر را تغییر پاک کنید یا آنها را ویرایش نمایید.
عنصر ReportBox: این عنصر در
دادههای نوع DateTables (منظور تنظیمات جداول تاریخ
است) نیاز به توضیحات بیشتری دارد. زیرا خود شامل عناصر دیگری است که برای تنظیم و
بهینه کردن خروجی در جعبه گزارش (که بعدا به طور مفصل شرح داده خواهد شد), مورد نیاز
میباشند. شرح عناصر آن به شرح زیر است:
عنصر |
شرح |
Data DataCustom FontSize ForeColor Language |
این عناصر در این
نسخه کاربردی ندارند. در نسخههای بعدی امکان اضافه کردن جعبه گزارش جدید به کنترل فراهم میشود
و به این ترتیب این عناصر فعال خواهند شد. در حال حاظر فقط برای جدول تاریخ اصلی
کاربرد دارند که بوسیله خصوصیات مربوطه تعیین میشوند |
MonthNameMode |
اگر مقدار این عنصر
عددی به جزء یک باشد قادر خواهید بود برای نام ماههای جدول تاریخ در قسمت جعبه گزارش از نامهای سفارشی استفاده کنید. و اگر مقداری یک را داشته باشد
نام ماهها از تنظیمات پیش
فرض کنترل گرفته میشوند (این یک همان
کد dnm_Program است). برای اطلاعات بیشتر به توضیحات
خصوصیت MonthNameMode مراجعه نمایید |
MonthNameCustom |
در این نسخه اگر
عنصر MonthNameMode این جدول تاریخ, عددی به جزء یک را
داشته باشد نام ماه برای گزارش مربوط به داده جدول تاریخ مورد ارجاء, از این
خصوصیت میآید. برای اطلاعات بیشتر
و چگونگی فرمت دهی نام ماهها در این عنصر به توضیحات خصوصیت MonthNameCustom مراجعه نمایید |
عملگر AddDate
: برای اینکه یک جدول تاریخ جدید به کنترل اضافه کنید از این
عملگر استفاده نمایید. برای این منظور ابتدا یک آرایه از نوع DateTables تعریف کرده سپس عناصر آرایه خود را
با توجه به مشخصات جدول تاریخ مورد نظر مقدار دهی کنید و بعد بوسیله این عملگر آن
آرایه را به جداول تاریخ کنترل اضافه کنید.
● نکته: اگر
میخواهید جدول تاریخ جدید مشابه جدول تاریخ اصلی باشد از کدی که در بالا معرفی شد
استفاده کنید. یعنی اطلاعات جدول تاریخ اصلی که با ایندکس صفر, از طریق عملگر ItemDate قابل دریافت است را در آرایهای که تعریف نمودید قرار دهید.
به یک مثال توجه کنید:
Dim Dtab As DateTables With DateBoardJS1 .CalendarType = Gregorian
' DateTable(0) .Font.Size = 22
' (0) .DayNameMode = dnm_Program
'
(0) .DayNameMaxLength = 255
'
(0) .DayNameFontSize = 24
'
(0) .DayNameLanguage = lMachine ' (0) .RightToLeftAuto = True
'
(0) Dtab = .ItemDate(0) ' Information
DateTable(0) to Dtab With Dtab .CalendarType = Persian ' DateTable(1) .FontSize = 16 ' (1) .DayNameMode = dnm_None ' (1) '.DayNameMaxLen
= 1 ' (1) .DayNameFontSize = 14
'
(1) .DayNameLan = lFarsi
'
(1) .RtoLAuto = True
'
(1) .Place = po_TopRight
'
(1) End With .AddDate Dtab ' Add New
DateTable to BoardDate End With |
همچنین برای روشن تر شدن این موضوع یک
برنامه نمونه با نام تقویم 85 (Calendar 85) در سایت www.IranVig.com قرار دادهام برای
استفاده از آن روی این لینک کلیک کنید.
● نکته:
محدودیتی برای وارد کردن جداول تاریخ وجود ندارد اما در یک نگاه 8 حالت در اطراف
جدول تاریخ اصلی (یعنی حداکثر 9 حالت با جدول تاریخ اصلی) و در نگاهی دیگر با توجه
به اینکه فقط 5 نوع تقویم توسط این کنترل پشتیبانی میشود, منطقا-حداکثر 5 جدول
تاریخ در کنترل میتوانید داشته باشید. اما بدون در نظر گرفتن این محاسبات تنها
255 شماره بدون در نظر گرفتن جدول تاریخ اصلی, را میتوانید به کنترل بیفزایید !
عملگر CountDate : خروجی این تابع
عددی در نوع Byte
است که مشخص کنند تعداد کل جداول تاریخ موجود در کنترل است. اگر هیچ جدول تاریخی
را اضافه نکرده باشید خروجی این تابع عدد یک است که نشان میدهد یک
جدول تاریخ در کنترل وجود دارد و آن هم همان جدول تاریخ اصلی (یا مادر) است.
عملگر RemoveDate : در ورودی این
عملگر ایندکس جدول تاریخی که میخواهید حذف شود را قرار دهید تا این اتفاق
بیفتد. فقط مسئلهای که نباید فراموش کنید آن است که, با حذف یک جدول تاریخ شماره ایندکس جداول
تاریخ بعد از ایندکس حذف شده یک شماره به عقب بر میگردند. به کد زیر توجه کنید.
Private Sub ComAddDate_Click() Dim Dtab As DateTables
With DateBoardJS1 If .ItemDate(.CountDate
- 1).Place = po_BottomRight Then Exit Sub Dtab = .ItemDate(0) With Dtab .CalendarType = Persian .DayNameMode = dnm_None .DayNameLan = lFarsi End With Dtab.Place = .ItemDate(.CountDate
- 1).Place + 1 .AddDate Dtab
End With End Sub |
Private Sub ComClearDates_Click()
For ISum = 0 To DateBoardJS1.CountDate - 1 'DateBoardJS1.RemoveDate
ISum 'Don't Correct DateBoardJS1.RemoveDate 1 'Correct
Next ISum End Sub |
عملگر ClearDates : کدی که در قسمت
قبل مشاهده میکنید تنها یک مثال است و برای حذف همه جداول تاریخ به طور یکجا (البته جدول تاریخ
اصلی را شامل نمیشود) میتوانید از این عملگر استفاده کنید.
● تنظیمات گزارش تاریخ Report Box
در این کنترل جعبهای گنجاده شده که در آن میتوانید
اطلاعات ماهها, سال تقویم و یا هر چیزی که لازم میبینید به همراه جداول نمایش
تاریخ باید دیده شود را به نمایش در آورید. علت اهمیت فراگیری این بخش در آن است
که فرمت دادههای استفاده شده در این کنترل کمی با فرمتهای رایج مورد استفاده در
زبانهای برنامه نویسی و حتی خود سیستم عامل ویندوز, متفاوت است. در ادامه این
قسمت علت این امر شرح داده خواهد شد.
خصوصیت ReportBoxShow : با True کردن مقدار این خصوصیت میتوانید باعث نمایش جعبه گزارش در کنترل
شوید.
خصوصیت ReportBoxPosation : محل قرار گیری جعبه
گزارش را با این خصوصیت تعیین کنید.
خصوصیت ReportBoxForeColor : رنگ متون درون جعبه
گزارش از این خصوصیت میآید.
خصوصیت ReportBoxBackColor : رنگ پس زمینه جعبه
گزارش بوسیله این خصوصیت تعیین میشود. در جعبه گزارش امکان ترسیم الگوهای پس زمینهای
تعریف شده برای کنترل, از طریق خصوصیات وجود ندارد. اما در قسمتهای بعدی چگونگی
انجام آن را فرا خواهید گرفت.
خصوصیت ReportBoxAppearance : بوسیله این خصوصیت میتوانید
نوع ترسیم حاشیه اطراف جعبه گزارش را تعیین کنید. البته اگر برابر efFlat باشد اطراف جعبه گزارش با هیچ الگوی حاشیهای ترسیم
نمیشود.
خصوصیت ReportBoxLanguage : جعبه گزارش در اصل برای
نمایش ماه و یا نام ماهها ایجاد گردیده (گر چند که بوسیله آن میتوانید هر
اطلاعاتی نظیر نام روزها در هفته را نیز نمایش دهید). بوسیله این خصوصیت تنها
زبانی را تعیین میکنید که قرار است نام ماهها در آن زبان به جعبه گزارش برای نمایش
فرستاده شوند.
خصوصیت ReportFontSize : اندازه متن موجود در
جعبه گزارش از این خصوصیت میآید.
خصوصیت ReportBoxData : این خصوصیت شامل 27 فرمت دادهای آماده برای نمایش در جعبه گزارش است. در
جدول ذیل قالب دستوری هر نام و شماره فرمت, لیست شده.
● نکته: اگر
این خصوصیت مقدار 99 یا rd_Custom
را داشته باشد به آن معنی است که دادههای جعبه گزارش توسط کاربر و در خصوصیت ReportBoxCustom تعیین میشود.
● نکته: طریقه
فرمت دهی خاص این کنترل را در توضیحات مربوط به خصوصیت ReportBoxCustom (بخش بعدی) مطالعه نمایید.
● نکته: همان
طور که قبلا اشاره شد زبان مورد نظر برای نمایش نام روزهای هفته از خصوصیت DayNameLanguage میآید (البته این خصوصیت برای جدول تاریخ کد صفر
است و نام روزههای هفته برای دیگر جداول تاریخ از عنصر DayNameLan آن جدول تاریخ میآید).
● نکته: نام
ماهها از خصوصیت ReportBoxLanguage میآید (خصوصیت مذکور
برای جدول تاریخ کد صفر است و در نسخههای بعدی نام روزههای هفته برای دیگر جداول
تاریخ از عنصر ReportBoxs.Language آن جدول تاریخ
گرفته میشود).
کد |
نام |
فرمت |
مثال |
0 |
rd_Date1 |
yyyy0/mm0/dd0 |
1384/03/15 |
1 |
rd_Date2 |
m0/d0/yyyy0 |
7/29/2006 |
2 |
rd_Date3 |
m0/d0/yy0 |
11/2/06 |
3 |
rd_Date4 |
mm0/dd0/yy0 |
11/02/06 |
4 |
rd_Date5 |
mm0/dd0/yyyy0 |
11/02/2006 |
5 |
rd_DayMonYear |
d0 mmmm0 yyyy0 |
5 مهر 1384 |
6 |
rd_DayMon |
d0 m0 |
5 11 |
7 |
rd_DayMonName |
d0 mmmm0 |
5 September |
8 |
rd_MonYear |
m0/yyyy0 |
6 2005 |
9 |
rd_YearMon |
yyyy0/m0 |
2004/12 |
10 |
rd_MonNameYear1 |
mmmm0 yyyy0 |
September 2005 |
11 |
rd_YearMonName1 |
yyyy0 mmmm0 |
2008 ژوئن |
12 |
rd_MonNameYear2 |
mm0/yyyy0 |
05/1426 |
13 |
rd_YearMonName2 |
yyyy0/mm0 |
1427/08 |
14 |
rd_MonNameYear3 |
mm0 yy0 |
11 06 |
15 |
rd_YearMonName3 |
yy0 mm0 |
85 01 |
16 |
rd_MonName |
mmmm0 |
آذر |
17 |
rd_Mon |
m0 |
12 |
18 |
rd_DayNameDay |
dddd0 d0 |
Tuesday 16 |
19 |
rd_DayNameMon |
dddd0 mm0 |
سهشنبه 05 |
20 |
rd_DayNameMonName |
dddd0 mmmm0 |
Friday Sha'ban |
21 |
rd_DayNameDayMon |
dddd0 dd0 mm0 |
Saturday 10 03 |
22 |
rd_DayNameDayMonName |
dddd0 mmmm0 |
جمعه آبان |
23 |
rd_DayNameDayMonNameYear |
dddd0 d0 mmmm0 yyyy0 |
Friday 28 Aban 1378 |
24 |
rd_DayNameDayMonYear |
dddd0 dd0/mm0/yy0 |
Sunday 30/02/86 |
25 |
rd_DayMonNameYearDayName |
dd0 mmmm0 yyyy0 dddd0 |
03 رمضان 1428 الاحد |
26 |
rd_DayMonYearDayName |
d0 m0 yyyy0 dddd0 |
6 9 1428 Tuesday |
99 |
rd_Custom |
از خصوصیت ReportBoxCustom میآید |
- |
خصوصیت ReportBoxCustom : اگر فرمت داده مورد نظرتان یکی از دادههای خصوصیت ReportBoxData نبود, ابتدا مقدار ReportBoxData را به عدد
99 یا rd_Custom تغییر دهید سپس فرمت مورد نظر خود را در این خصوصیت بنویسید.
اسکلت فرمت نویسی تاریخها در این کنترل مشابه فرمت نویسی
دادههای تاریخی در زبانهای برنامه نویسی یا خود سیستم عامل ویندوز است. اما اصل
موضوع کمی متفاوت خواهد بود. در فرمت نویسی حالت عادی فقط با یک نوع تاریخ (یا
بهتر بگویم با یک جدول تاریخ) سرو کار دارید. اما در اینجا با توجه به امکان وجود
چندین جدول تاریخ آنهم با انواع مختلف تقویم, کار را کمی دشوار میکند. در انتها
راهکاری که برای حل این مسئله طرح و اجرا شد, خیال شما را از این بابت راحت میکند
چرا که فرمت دهی دادههای تاریخی در کنترل به همان سادگی قبل خواهد بود. به ترتیب
زیر عمل کنید.
فرمتها دقیقا همانهایی هستند که در حالت
عادی میبایست باشند. با این تفاوت که در انتهای کلمه فرمتی ورودی باید شماره ایندکس
جدول تاریخ موجود در کنترل را برای ارجاعات به خصوصیات و عناصر مربوطه, وارد نمایید.
برای مثال کلمه فرمتی ""yyyy را که در فرمت دهی عادی موجب تبدیل فرمت به سال تاریخ ورودی میشود
را مورد بررسی قرار میدهیم. فرض کنید میخواهیم داده خروجی سال جدول تاریخ پیش
فرض باشد. بنا به تعریفی که برای فرمت دهی در کنترل شد فرمت ورودیتان باید "yyyy0" باشد. چون
"yyyy"
که معادل عدد سال در حالت عادی بود و صفر "0" نیز کد ایندکس جدول تاریخ پیش فرض است.
حال از شما سوال میکنم, برای به دست آوردن شماره روز جدول
تاریخ دوم باید از چه فرمتی استفاده کرد ؟ (جواب: "d1" چون کد ایندکس جدول دوم 1 است!)
مثالهای ملموس دیگری را در جدول فرمتهای قسمت قبل مشاهده
میکنید. برای اینکه دقیقا بدانید از چه کلمات فرمتی میتوانید استفاده کنید بخش
بعدی یعنی عملگر FormatMyDate را مطالعه نمایید.
عملگر FormatMyDate : با وارد کردن یک
فرمت تاریخی, این تابع تبدیل شده آن فرمت را بر اساس تنظیمات شما در خصوصیات و
عناصر موجود در جداول تاریخ به خروجی میفرستد. اما اینکه بدانید از چه کلمات فرمتنی میتوانید
استفاده کنید, جدول زیر را مطالعه نمایید.
کلمه
فرمتی |
کاربرد |
مثال
ورودی |
تاریخ
مثال |
مثال
خروجی |
yyyyi |
سال
مربوط به جدول تاریخ i اُم |
yyyy1 |
2006/02/16 |
2006 |
yyi |
دو شماره آخر سال مربوط به جدول تاریخ i اُم |
yy0 |
26/11/1384 |
84 |
mmmmi |
نام ماه مربوط
به جدول تاریخ i اُم |
mmmm3 |
26/11/1384 |
بهمن |
mmi |
شماره ماه مربوط
به جدول تاریخ i اُم در دو عدد |
mm1 |
2006/02/16 |
02 |
mi |
شماره ماه مربوط
به جدول تاریخ i اُم |
m1 |
2006/02/16 |
2 |
ddddi |
نام روز از هفته مربوط
به جدول تاریخ i اُم |
dddd0 |
26/11/1384 |
چهار
شنبه |
ddi |
شماره روز مربوط
به جدول تاریخ i اُم در دو عدد |
dd2 |
26/11/1384 |
26 |
di |
شماره روز مربوط
به جدول تاریخ i اُم |
d5 |
2006/02/16 |
16 |
● نکته:
تفاوتی در کوچک یا بزرگ بودن کاراکترهای کلمات فرمتی وجود ندارد.
● نکته: اگر
در فرمت ورودیتان میخواهید از دادههایی استفاده کنید که نباید تبدیل به اطلاعات
شوند, میتوانید آنها را درون دو علامت نقل قول (2Quote
"") قرار دهید. در واقع عملگر
دادههایی را که بین دو علامت نقل قول باشند را برای تبدیل نادیده میگیرد.
عملگر FormatMyDate دو ورودی
دیگر نیز دارد که هر دو مربوط به زبان میشوند. یکی برای تنظیم زبان نام روزهای
خروجی و دیگری برای تنظیم زبان نام ماههای خروجی. البته میتوانید آنها را وارد
نکنید تا تابع از مقادیر پیش فرض دادههای موجود بر روی ماشین کاربر استفاده نماید.
فرمت کلی این عملگر به شکل زیر است:
FormatMyDate(FormatIn, [DayLanguage
As Languages = lMachine], [MonLanguage
As Languages = lMachine]) As String |
در ادامه چند مثال را بررسی میکنیم.
.CalendarType = Persian .Year = 1385: .Month = 3:
.Day = 5 Print .FormatMyDate("dd0 mmmm0 سال YYYY0",
lFarsi, lFarsi) |
فکر میکنید خروجی کد بالا چه خواهد بود ؟ (جواب: "05 خرداد سال
1385")
در کد بعدی کارها را کمی مشکل تر میکنیم:
With DateBoardJS1
.CalendarType = Gregorian
.Year = 2006: .Month = 11: .Day = 9
Dtab = DateBoardJS1.ItemDate(0)
Dtab.CalendarType = Persian
.AddDate Dtab
Print .FormatMyDate("yyyy1/mm1/Dd1" & " هجری شمسی برابر "
& _ "d0 MMMM0 yyyy0" & " میلادی", , lEnglish) End With |
خروجی کد بالا "18/08/1385 هجری شمسی
برابر 9 November 2006" است. اگر فرمت کد
بالا به شکل زیر در بیاید یعنی زبان نام ماههای خروجی به فارسی تبدیل شود رشته
خروجی "18/08/1385 هجری شمسی برابر 9 نوامبر 2006" خواهد شد.
.FormatMyDate("yyyy1/mm1/dd1" & " هجری شمسی برابر "
& _ "d0 mmmm0 yyyy0" & " میلادی", , lFarsi) |
در این عملگر امکان وارد کردن زبانهای قابل ارجاء وجود
دارد همین طور در خود کنترل برای نمایش فرمت مورد نظر در جعبه گزارش برای تنظیم
کردن زبان نام روزهای هفته باید از خصوصیت DayNameLanguage کمک بگیرید و همان طور که ذکر شد زبان نام ماهها
برای جعبه گزارش در خود کنترل از خصوصیت ReportBoxLanguage میآید. اینها تنظیمات زبانی پیش فرض کنترل هستند. در صورتی که
زبان مورد نظرتان جزء زبانهای تحت پوشش کنترل نبود این امکان برایتان فراهم آمده
تا با وارد کردن نام ماههای سفارشی به هدف خود برسید, موضوعی که در قسمت بعد بررسی
خواهد شد ...
خصوصیت MonthNameMode : اگر مقدار این
خصوصیت عددی به جزء یک باشد قادر خواهید بود در قسمت جعبه گزارش
از نام ماههای سفارشی استفاده کنید. و اگر مقدار یک (یا dnm_Program) را داشته باشد نام ماهها از تنظیمات
پیش فرض کنترل گرفته میشوند (همان طور که ذکر شد تنظیمات نام ماهها بوسیله زبان مورد
استفاده در خصوصیت ReportBoxLanguage و تنظیمات نوع تقویم
تعیین میشود). برای وارد کردن نام ماههای سفارشی باید از خصوصیت MonthNameCustom کمک بگیرید.
خصوصیت MonthNameCustom : داده پیش فرض این خصوصیت
رشته "January|February|March|April|May|June|July|August|September|October|November|December" است. برای وارد کردن نام ماههای سفارشی به نکات زیر توجه کنید:
● نکته: نامهای
سفراشی را به ترتیب و پشت سر هم در رشته ورودی نوشته و هر نام را بوسیله کاراکتر میل
"Vertical
Bar |" از یکدیگر جدا کنید.
● نکته: ترتیب
قرار گرفتن نام ماهها باید بر اساس ترتیب آنها در نوع تقویم مورد ارجاء باشد.
همان طور که در داده پیش فرض این خصوصیت میبینید ترتیب نام ماها بر اساس نوع تقویم
پیش فرض کنترل که Gregorian یا میلادی میباشد,
است. بنابراین به طور مثال برای تقویم هجری شمسی یا Persian
با توجه به نام اولین ماه یعنی "فروردین" باید رشته ورودی با این نام
آغاز شده و به ماه "اسفند" آخرین ماه ختم شود (یعنی باید به شکل "فروردین|اردیبهست|خرداد|تیر|مرداد|شهریور|مهر|آبان|آذر|دی|بهمن|اسفند" باشد).
● نکته: این
خصوصیت هیچ وقت نمیتواند خالی باشد و اگر آن را خالی کنید بلافاصله داده پیش فرض
در آن قرار خواهد گرفت.
● نکته: دو
خصوصیت MonthNameMode و MonthNameCustom را تنها از طریق کد میتوانید مقدار دهی کنید.
این کد نیز تنها یک مثال میباشد:
With DateBoardJS1
.CalendarType = Persian
.Year = 1385: .Month = 1: .Day = 1
.MonthNameMode = dnm_Custom '=2
.MonthNameCustom = "فروتی|اشا وهیشتا|هواروتات|تیشتریا|آمرتا|خشاترا وایریا|میترا|آپ|آترا|دتوشا|وهامناه|سپنتاآرمایتا" ' زبان اوستایی نام ماهها از 2000 قبل از میلاد تا 300 قبل از میلاد
Print .FormatMyDate("DDDD0 D0 MMMM0 YYYY0", lFarsi, lFarsi) End With |
خروجی کد بالا "سهشنبه 1 فروتی 1385" است و اگر فرمت
همان کد به شکل زیر تغییر کند خروجی کد پایین "فراوردین 1385 سهشنبه" میشود.
.MonthNameMode = dnm_Custom
'=2 .MonthNameCustom = "فراوردین|ارداوهیشت|خرداد|تیر|آمرداد|شهریوار |میهر|آبان|آدور|دی|وهمن|اسپندرمد" 'فارسی میانه از 300 قبل از میلاد تا 700
بعد از میلاد .FormatMyDate("mmmm0 yyyy0 dddd0", lFarsi, lFarsi) |
● کنترل تنظیمات تصویر Picture Properties
خصوصیت Picture : این خصوصیت از
نوع StdPicture بوده و میتوانید بوسیله
آن یک تصویر را درون صفحه تاریخ به نمایش درآورید.
خصوصیت PicPosition : محل قرارگیری
تصویر در صفحه تاریخ با این خصوصیت تعیین میشود. مثلا اگر مقدار این خصوصیت
po_BottomCenter یا عدد 7 باشد محل تصویر
طوری تنظیم میشود که حاشیه پایینی تصویر بر مرکز ظلع پایین صفحه تاریخ منطبق
باشد.
خصوصیت PicAutoSize : اگر مقدار این
خصوصیت True باشد تنظیم ابعاد
تصویر در اختیار شما خواهد بود (بوسیله خصوصیات PicHeight و (PicWidth.
اما اگر مقدار False
را داشته باشد ابعاد تصویر دقیقا همان ابعاد عکس ورودی خواهد بود.
خصوصیت PicFace : اگر مقدار این
خصوصیت True باشد تصویر تغییر
اندازه داده و هم اندازه کادر تصویر میشود, تا تمام صفحه (صورت) کار را بپوشاند.
همچنین برای اینکه مجوز تغییر اندازه خود را بگیرد به ناچار مقدار خصوصیت PicAutoSize را به True تغییر میدهد همین طور
تصویر را با تغییر مقدار خصوصیت PicPosition به po_Center,
در مرکز کادر تصویر قرار میدهد. و دیگر حتی به شما هم اجازه تغییر
خصوصیات PicAutoSize
و PicPosition را نمیدهد !
خصوصیات PicHeight و PicWidth : اگر تصویر
کنترل در حالت AutoSize
باشد و به شرطی که در حالت PicFace نباشد, بوسیله این دو خصوصیت میتوانید ابعاد تصویر را تغییر دهید.
● نکته: در این
کنترل امکاناتی فراهم آمده که بوسیله آنها میتوانید چندین تصویر دیگر را نیز به
صفحه تاریخ بیفزایید. در قسمتهای بعدی چگونگی این مطلب شرح داده خواهد شد.
● خصوصیت کنترل کامل Controls
خصوصیت Controls : این خصوصیت,
کلکسیونی از تمام اشیاء استفاده شده درون کنترل را بر میگرداند. برای
آنکه متوجه اهمیت موضوع شوید در زمان اجرای برنامه خود این خصوصیت را به پنجره Watches بیفزایید. سپس علامت بعلاوه "+"
کنار آن را کلیک کنید. به این ترتیب لیستی باز خواهد شد که باید حداقل شامل 45 آیتم
باشد. هر یک از این آیتمها در حقیقت اشیائی هستند که بوسیله آنها
کنترل ساخته شده. حتی وقتی خصوصیتی از کنترل را تغییر میدهید یک خصیصه و یا چند خصوصیت
این اشیاء تغییر میکند. به این ترتیب با در اختیار داشتن آنها میتوانید کاملا به
طور خصوصی هر عمل خاصی را که مد نظر دارید برروی کنترل پیاده کنید.
به عنوان مثال در کنترل خصوصیتی وجود ندارد که بوسیله آن
بتوانید رنگ فقط یکی از روزهای غیر تعطیل را به هر آنچه میخواهید تغییر دهید
(البته امکان تغییر رنگ همه روزها هست). اما با به دست آوردن کلیه خصوصیات لیبلی
که آن روز را نمایش میدهد به راحتی میتوانید این کار ار انجام دهید.
به طور کلی شش شیء (با خود صفحه اصلی UserControl میشود 7 شیء) در اختیار دارید که مشخصات هر یک را در جدول زیر میبینید.
نام شیء |
Type |
کاربرد
در کنترل |
شیء
مادر |
خصوصیات
غیر قابل تغییر |
ایندکس |
LabInfo |
Label |
نمایش شماره و نام روزها |
PicBoard |
.Tag و ابتدای .Caption و .AutoSize |
بله |
Lines |
Line |
از این شیء خطوط کنترل به وجود میآید |
PicBoard |
- |
بله |
ImgPic |
Image |
نمایش تصویر در کنترل |
PicBoard |
- |
بله |
PicBoard |
PictureBox |
صفحه تاریخ به این شیء گفته میشود |
UserControl |
ScaleMode |
- |
LabReport |
Label |
نمایش متون جعبه گزارش |
PicReportBox |
.AutoSize و .WordWrap |
بله |
PicReportBox |
PictureBox |
جعبه گزارش به این شیء گفته میشود |
UserControl |
ScaleMode |
- |
UserControl |
UserControl |
صفحه اصلی کنترل که همه اشیاء بر آن
سوار هستند |
- |
ScaleMode |
- |
توضیحات ستونهای جدول:
نام شیء : نامی که برای صدا زدن شیء از آن
استفاده میکنید مثلا اگر بخواهیم صفحه تاریخ را در کنترل مخفی کنیم به ترتیب زیر
عمل میکنیم.
Dim ObjCont As PictureBox Set ObjCont = DateBoardJS1.Controls("PicBoard") ObjCont.Visible = False |
ایندکس : اگر شیء مربوطه دارای ایندکس
باشد, برای صدا زدنش علاوه بر نام باید از ایندکس مربوط به آن نیز استفاده کرد. اشیائی
که در جدول بالا دارای ایندکس هستند ممکن است حتی تا 200 عدد از آنها برروی کنترل
ایجاد شود (مانند شیء LabInfo), بنابراین شما نیز میتوانید کپیهایی
از آنها ایجاد کرده و مورد استفاده قرار دهید. به عنوام مثال کد زیر رنگ یکی از
روزهای جدول تاریخ را تغییر میدهد (با توجه به اینکه روزهای جدول در لیبلهای LabInfo هستند بنابراین باید به این شیء ارجاء دهیم).
Dim ObjCont As
Label Set ObjCont = DateBoardJS1.Controls("LabInfo")(8) ObjCont.ForeColor = vbRed |
اشیائی هم که ایندکس میگیرند در جدول با کلمه "بلی" مشخص شدهاند و
اگر کمی دقت کنید اشیائی که ایندکس نمیگیرند جزء صفحات کنترل هستند و نمیتوانید
از آنها برروی کنترل تکثیر کنید. برای تکثیر نیز به روش زیر عمل کنید.
مثلا اگر میخواهید چند تصویر برروی کنترل داشته باشید
باید شیء ImgPic را مورد ارجاء قرار داده و از روی آن تکثیر کنید. سپس تصاویر جدید
را به ImgPic با ایندکسهای جدید اختصاص دهید.
Dim ObjCont As Image Load DateBoardJS1.Controls("ImgPic")(1) Set ObjCont = DateBoardJS1.Controls("ImgPic")(1) With ObjCont Set .Picture = LoadPicture(App.Path & "\Sample1.jpg") .Move 100, 100 .ZOrder vbSendToBack .Visible = True End With |
شیء مادر : شیء مادر همان صفحهای
است که شیء نامبرده در جدول برروی آن قرار دارد و در اصطلاح اصلی باید آن را Container صدا زد. به عنوان مثال Container لیبل
گزارش, خود صفحه گزارش است که آن را با نام PicReportBox میشناسیم. اما در انتها به خود صفحه اصلی یا برد UserControl میرسیم و همان طور که در جدول میبینید این صفحه دیگر شیء مادر یا
Container ندارد (درست مانند یک Form).
بررسی Container از چند جهت مهم است.
به عنوان مثال جعبه گزارش که در کنترل با نام ReportBox
شناخته میشود دارای پس زمینه شفاف نمیباشد و در خصوصیات کنترل نیز چنین امکانی
فراهم نیامده. اما میتوانید با تغییر Container شیء LabReport (که وظیفه نمایش متون جعبه گزارش را
در اختیار دارد) موجب شفاف شدن پس زمینه شوید. به کد زیر توجه کنید:
Dim ObjCont As
Label Set ObjCont = DateBoardJS1.Controls("LabReport")(0) With ObjCont
Set .Container = DateBoardJS1.Controls("PicBoard")
.Move 20, 20
.ZOrder vbSendToBack
.BackStyle = vbTransparent
.Caption = DateBoardJS1.FormatMyDate("mmmm0 yyyy0")
.Visible = True End With |
کد بالا حتی اگر تنظیمات بخش ReportBox
را هم فعال و تنظیم نکرده باشید کار میکند !
کاربرد دیگر شیء مادر یا همان Container
برای زمانی است که بخواهید به اصل شیء UserControl یعنی صفحه اصلی دسترسی داشته باشید. با کمی دقت در خواهید یافت که خصوصیت Controls شیء UserControl را عبور نمیدهد زیرا آن خصوصیت
فقط مخصوص عبور اشیاء درون UserControl است. بوسیله
ارجاء به خصوصیت Container یکی از اشیائی که شیء
مادرش UserControl است میتوانید به آن دسترسی
داشته باشید (در عمل فقط میتوانید همان خصوصیاتی که در کنترل است را در شیء جدید
تغییر دهید). کد زیر را مطالعه کنید:
Dim ObjCont As
Object Set ObjCont = DateBoardJS1.Controls("PicBoard").Container |
خصوصیات غیر قابل تغییر : برخی از خصوصیات اشیاء
موجود را نمیتوانید تغییر دهید زیرا با تغییر آنها بر عملکرد محاسبات کنترل صدمه
وارد میکنید. به عنوان مثل داده لیبلهای مربوط به نام روزها (یا LabInfo) در محاسبات کنترل نقش دارند, مثلا از کدی مانند "Val(LabInfo(14).Caption)"
در خود کنترل استفاده میشود. اما در این مورد تغییر اطلاعات آنها با اضافه کردن
مقادیری به انتهای دادههای آنها مشکلی به وجود نمیآورد. به عنوان مثال در کد زیر
با اضافه کردن کاراکتری به انتهای داده تمام لیبلهایی که نام روزها را نمایش میدهند
باعث زیباتر شدن تقویم میشویم (لیبلهایی که نام روزها را نمایش میدهند دارای
داده عددی نیستند و از همین خصلتشان میتوان برای شناسایی آنها استفاده کرد).
Dim ObjCont As
Object For Each
ObjCont In DateBoardJS1.Controls
With ObjCont If
.Name = "LabInfo" Then _ If
Val(.Caption) = 0 Then .Caption = .Caption &
"."
End With Next |
مشاهده میکنید وجود کلکسیون Controls
برروی این کنترل رابطی است که انعطاف Date Convert JS
را چندین برابر میکند. هر آن چیزی که لازم دارید و در خصوصیات کنترل وجود ندارد
را با این کلکسیون میتوانید به دست آورید. از تغییر Font
هر یک از لیبلهای نمایشی گرفته تا تغییرات دیگری نظیر ترسیمات پس زمینهای جعبه
گزارش که بوسیله خصوصیات کنترل چنین امکاناتی را ندارید. در پایان این بخش چند
نکته را معرفی میکنم تا هر چه بهتر از این کلکسیون بهره ببرید.
● نکته: در
هر باری که تغییرات را برروی اشیاء کنترل اعمال میکنید ممکن است کنترل تنظیمات
شما را به طور خودکار به حالت مورد پردازش خود برگرداند به این ترتیب مجبور خواهید
بود که دوباره این تغییرات را اعمال کنید. اما کد برنامهتان از کجا باید متوجه
اعمال تغییرات بوسیله کنترل شود؟ رویداد DateChange میتواند
کمک زیادی کند چون این رویداد زمانی که خصوصیات اصلی کنترل (تنظیمات تاریخ) تغییر
میکنند اتفاق میفتد. یعنی اعمال تنظیماتتان را درون این رویداد قرار دهید.
● نکته:
مقدار خصوصیت StopChanges را در ابتدای تغییرات False و در انتها True کنید. شرح
عملکرد این خصوصیت کمی جلوتر به طور مفصل بیان شده است.
● نکته: ممکن
است بعد از تغییرات در یک شیء, کنترل در عملکرد خود دچار مشکل شود. در چنین مواقعی
سعی کنید راههای دیگری را برای اعمال تغییرات سفارشی خود بیابید و از اجرای تغییرات,
بوسیله کلکسیون اشیاء که مشکوک هستند صرف نظر کنید زیرا هیچ گونه مسئولیتی را در
ارتباط با عملکرد ناقص کنترل در زمان دست کاری خصوصیات اشیاء درونی آن برعهده نمیگیرم.
ممکن است مشکلات خودشان را در زمان طراحی برنامهتان نشان ندهند, اما روی میز
کاربر و در زمان اجرای برنامهتان حتما دردسر ساز خواهند شد !
فکر میکنم تا اینجای توضیحات کاملا برایتان ادعای فوق
انعطاف بودن این کنترل ثابت شده باشد. اما عجله نکنید هنوز خصوصیات و امکانت دیگری
نیز باقی مانده که به تدریج راجع به آنها صحبت خواهد شد.
خصوصیت Description : در زمان طراحی
برنامهتان
دکمهای را
در کنار این خصوصیت در پنجره خصوصیات مشاهده میکنید که با فشردن آن صفحه Description باز میشود. این صفحه شامل توضیحاتی پیرامون برخی توابع موجود در
کتابخانههای کنترل است. همین طور اطلاعاتی درباره انواع تقویمهای به کار رفته در
کنترل ارائه میدهد.
خصوصیت Font : در تمام کنترل
تنها یک خصوصیت Font
وجود دارد. یعنی تنها یک نوع فونت برای تمام اشیاء میتوانید به کار ببرید. علاوه بر
این خصوصیت همان طور که قبلا اشاره شد برای تعیین اندازه متون قادر هستید از خصوصیات
DayNameFontSize, DateTable(i).DayNameFontSize, DateTable(i).FontSize, ReportBox.FontSize و ReportFontSize استفاده کنید. اما هر جایی که لازم بود به طور کامل
خصوصیات Font یک شیء را تغییر دهید از کلکسیون اشیاء یعنی
خصوصیت Controls بهره گیرید.
خصوصیت hDC : این خصوصیت
تنها دستگیره handle ترسیمات (گرافیکی) شیء UserControl
را بر میگرداند.
خصوصیت hWnd : این خصوصیت
تنها دستگیره handle شیء UserControl
را بر میگرداند.
خصوصیت RightToLeftAuto : اگر مقدار این
خصوصیت True باشد کنترل به طور
اتوماتیک Right to Left
متون و نمایش خود را برای تقویمهای Islamic و
Persian برابر True میکند و مابقی تقویمها با Right to Left=False مقدار دهی میشوند. علت این امر کاملا واضح است, از آنجایی که در
تقویمهای هجری از خط الرسم عربی استفاده شده, میبایست دارای Right to Left=True باشند تا دادهها با ترتیب صحیح به نمایش در آیند.
لازم به ذکر است در صورت True بودن این
خصوصیت دیگر قادر به تغییر مقدار خصوصیت RightToLeft
کنترل نخواهید بود چرا که آن خصوصیت بالاجبار مقدار True
را میگیرد.
خصوصیت RightToLeft : اگر مقدار خصوصیت
RightToLeftAuto کنترل برابر
با False باشد بوسیله این
خصوصیت میتوانید
تنظیمات Right
to Left دلخواه خود را در کنترل اعمال کنید.
فقط توجه داشته باشید اگر Right to Left کنترل
برابر True باشد برای اینکه نتیجه را کامل مشاهده کنید حتما باید Charset فونتی که انتخاب کردهاید هم, برابر Arabic_Charset باشد (در قسمت ابزار ComDlg32Font توضیحات بیشتری در این باره وجود دارد).
خصوصیت StopChanges : به دلیل فراوانی
بالای خصوصیات کنترل, زمانی که از طریق کد میخواهید خصوصیات
را مقدار دهی کنید, با تغییر هر خصوصیت, کنترل خود را یک بار در قسمت مربوطه به روز میکند.
اما اگر تعداد تغییرات زیاد باشد علاوه براینکه سرعت عملکرد برنامه پایین میآید
چهره خوشایندی را نیز به وجود نمیآورد. این خصوصیت در این زمینه کمک زیادی میکند.
اگر مقدار آنFalse باشد
(که همان داده پیش فرضش هم هست) به هنگام اعمال کوچک ترن تغییر در هر خصوصیت,
کنترل بلافاصله به روز شده و تغییرات را نمایش میدهد. حال شرایطی را فرض کنید که
مثلا 15 خصوصیت دارید که باید مقادیر همه آنها به طور متوالی تغییر کند. در چنین
زمانی کنترل حداقل 15 بار خود را به روز میکند. اما اگر مقدار خوصصیت StopChanges برابر True باشد با تغییرات خصوصیات دیگر هیچ به روز رسانی انجام نمیشود (یعنی
مقادیر خصوصیات تغییر میکنند اما نتیجهای دیده نمیشود).
بنابراین در زمان اعمال تغییرات طولانی برروی کنترل در
ابتدای تغییرات مقدار این خصوصیت را True
کنید و در انتها آن را باز به False
برگردانید.
Dim Dtab(1 To 2) As
DateTables With DateBoardJS1
.StopChanges = True
.BackMove = "0,30,0,0"
' Left, Top, Right, Bottom
.CalendarType = CalendarType
.ClearDates
Dtab(1) = .ItemDate(0): Dtab(2) =
.ItemDate(0)
If CalendarType = Persian Then .DayNameLanguage = lFarsi .DayNameMaxLength = 255 ' 255 is code full len Dtab(1).CalendarType
= Islamic:
Dtab(2).CalendarType = Gregorian
ElseIf CalendarType = Islamic Then .DayNameLanguage = lArabic .DayNameMaxLength = 5 Dtab(1).CalendarType
= Gregorian: Dtab(2).CalendarType = Persian Else .DayNameLanguage = lEnglish .DayNameMaxLength = 3 Dtab(1).CalendarType
= Persian:
Dtab(2).CalendarType = Islamic
End If
.FirstDayOnWeek = IIf(CalendarType = Gregorian, WeekStartsOnSunday, WeekStartsOnSaturday)
.Font.Charset = ARABIC_CHARSET ' =178
.DayNameFontSize = 16
.ReportBoxAppearance = efFlat
.ReportBoxCustom = "mmmm0 yyyy0"
.ReportBoxPosation = po_TopCenter
.ReportBoxLanguage = lFarsi
.ReportFontSize = 18
.ReportBoxShow = True
.Font.Size = 16
.Font.Bold = True
Dtab(1).Place = po_BottomCenter: Dtab(2).Place
= po_CenterLeft
Dtab(1).DayNameMode = dnm_None: Dtab(2).DayNameMode
= dnm_None
.AddDate Dtab(1): .AddDate Dtab(2)
.Refresh
.StopChanges = False End With |
● نکته: اگر
مقدار خصوصیت StopChanges برابر True باشد و آن را False کنید, این
عمل باعث نمیشود که کنترل خود را در آن زمان به روز کند, بلکه در تغییر بعدی که
در یک خصوصیت دیگر میدهید عمل به روز شدن اتفاق میفتد. اما اگر میخواهید در همان
زمان False کردن مقدار آن, کنترل نیز به روز شود از عملگر Refresh استفاده کنید.
عملگر Refresh : با اجرای این
عملگر حتی اگر مقدار خصوصیت StopChanges هم True
باشد کنترل خود را در همه قسمتها به روز میکند. به کد قبلی توجه کنید. اجرای این عملگر
مقدار خصوصیت StopChanges را تغییر نمیدهد, اما در هر
شرایطی کار خود را انجام میدهد.
عملگر Today : با اجرای این
عملگر تاریخ تقویم براساس تاریخ سیستم کاربر تنظیم میشود. تعیین و تبدیل تاریخ از
مقدار پیش فرض سیستم کاربر به نوع تقویم مورد استفاده بر عهده خود عملگر میباشد.
عملگر NextDay : وظیفه این
عملگر تغییر تاریخ تقویم به چند روز بعد یا قبل از تاریخ فعلی تقویم است و دارای یک
آرایه ورودی از نوع Integer
میباشد.
تعداد روزها
را بوسیله آن ورودی تعیین کنید. در ضمن اگر مقدار ورودی عددی مثبت باشد تقویم به
جلو (یعنی روزهای بعدی) میرود و اگر منفی باشد از روزهای تقویم کاسته میشود.
عملگر NextMonth : این عملگر نیز
همانند NextDay
عمل میکند
با این تفاوت که روی ماههای تقویم کار انجام میدهد.
Call DateBoardJS1.NextDay(7) ' 7 day next = 1 Week Call DateBoardJS1.NextDay(-2) ' 2 day previous Call DateBoardJS1.NextMonth(1) ' 1 month next Call DateBoardJS1.NextMonth(-5) ' 5 month previous |
● نکته: مبنای
تغییر ماه تعداد روز خاصی نمیباشد (مثلا 30 روز برای نرمال تعداد روزهای یک ماه). به عنوان
مثال اگر در روز 31 یک ماه باشید و به ماه بعدی بروید با توجه به اینکه ماه بعدی
29 روزه است, عملگر به جای اینکه 30 روز به تاریخ اضافه کند (با این کار تاریخ به
اولین روز دو ماه بعد تغییر خواهد کرد) ابتدا به ماه بعدی رفته و با توجه به اینکه
ماه بعدی فقط 29 روز دارد آخرین روز ماه بعدی را تعیین مینماید ! این رفتار عملگر
کاملا منطقی است چون در غیر این صورت وقتی مثلا 24 ماه تغییر تاریخ میداید در اصل
26 ماه تغییرات داشتید ! اما اکنون اینگونه نیست.
خصوصیت Container : این کنترل خود یک
شیء Container است و این به آن
معنا است که همانند یک PictureBox
یا Frame میتوانید برروی آن اشیاء دیگر را نیز سوار کنید.
دو ابزار مفید نیز همراه کنترل دریافت خواهید کرد. در اینجا
آنها را معرفی کرده و طریقه استفادهشان را شرح خواهم داد.
کلاس PaintBoard
: تمام
الگوها و
طراحیهای
صفحات کنترل توسط این کلاس انجام میشود. سراسری ساختن این کلاس قدم دیگری است در
جهت انعطاف بخشیدن هر چه بیشتر به این کنترل. برای استفاده از آن ابتدا به شکل زیر
یک آرایه ارجاء تعریف کنید.
Dim PBoard As New DateConvertJS.PaintBoard |
PBoard.PaintOnObject(ObjectIn As Object, _ X1 As Long, Y1 As Long, _ X2 As Long, Y2 As Long, _ ColorStart As Long, ColorEnd As Long, _ [ModePaint As ModelPaint = mVertical], _ [Paint3D As Boolean = False], _ [ChangheEtoS As Boolean = False], _ [Bound As Integer]) |
به این ترتیب عملگری در اختیارتان قرار میگیرد که بوسیله آن با
وارد کردن فقط یک شیء که بتوان روی آن ترسیمات انجام داد, میتوانید الگوهای تعریف
شده را برروی آن شیء پیاده کنید. ساختار گرامری آن عملگر, که PaintOnBoard نام دارد را در کد بالا میبینید. به عنوان مثال کد زیر در هر حال
(منظور تغییر اندازه Form است) پس زمینه یک فرم را با الگوی
مورد نظر طراحی میکند.
Dim PBoard As New DateConvertJS.PaintBoard |
Private Sub Form_Load() Me.AutoRedraw = True End Sub |
Private Sub Form_Resize() PBoard.PaintOnObject Me, 0, 0, ScaleWidth, ScaleHeight, _ vbBlue, vbWhite End Sub |
از این کلاس برای وسعت بخشیدن به کارکرد
کنترل نیز استفاده کنید. مثلا در کنترل امکاناتی برای ترسیمات الگویی پس زمینه
جعبه گزارش وجود ندارد. اما با این کلاس و از طریق کد زیر این کار به راحتی انجام
میشود.
Dim PBoard As New DateConvertJS.PaintBoard |
Private Sub DateBoardJS1_DateChange() Dim ObjCont As PictureBox Set ObjCont =
DateBoardJS1.Controls("PicReportBox") With ObjCont .AutoRedraw = True .Cls PBoard.PaintOnObject ObjCont, 0, 0, .ScaleWidth, .ScaleHeight, _ .BackColor, vbButtonFace, mRectangle1, True End With Set ObjCont = Nothing End Sub |
Private Sub Form_Resize() Call DateBoardJS1_DateChange End Sub |
کلاس COMDLG32Font : این کلاس دقیقا کار کنترل Common Dialog را انجام میدهد, اما فقط
برای نمایش صفحه انتخاب Font,
ولی با امکانات بیشتری. کنترل Common Dialog چند کاستی مهم داشت که در اینجا رفع شده است. مثلا Charset فونت انتخابی را عبور نمیداد و یا اگر
رنگ نیز در کادر انتخاب فونت وجود داشت و آن را تغییر میدادید, رنگ انتخابی را نیز عبور
نمیداد. اما در اینجا خروجی کلاس یک آرایه از نوع StdFont است. همین طور خروجی مختص به رنگ نیز وجود دارد. کد زیر نمونه بسیار
خوبی برای آموختن چگونگی استفاده از این کلاس میباشد.
On Error GoTo ErrL Dim DlgFont As New DateConvertJS.COMDLG32Font With DlgFont .OwnerHandle = Me.hWnd .CancelError = True .Color = LabSample.ForeColor .Flags = CF_BOTH + CF_EFFECTS Set .Font = LabSample.Font .ShowFont Set LabSample.Font = .Font LabSample.ForeColor = .Color End With ErrL: Set DlgFont = Nothing |
مهم ترین دلیلی که باعث شد چنین کلاسی
درون این کامپوننت ایجاد گردد, همان خصوصیت Font.Charset است. زیرا بدون آن امکان تغییر خط
الارسم به عربی و یا دیگر خطوط وجود نخواهد داشت. توصیه من به شما این
است که از این به بعد به جای Common Dialog از همین کلاس برای انتخاب فونت استفاده کنید.
« برای خرید نسخه اصلی به سایت www.CodeVig.com مراجعه کنید و یا با ایمیل
Soltani63@Yahoo.com تماس حاصل فرمایید »
Date Convert JS v2.0
Javad Soltani
بهمن 1384
February 2006
پایان