Date Convert JS ver 2.0

 

Version:

2.0 (2.0 Trial)

Copyright:

2005-2006 JS Corporation ©

Control Programmer:

Javad Soltani

 

Javad_JSP@yahoo.com

 

● مقدمه. 1

● از این کنترل به عنوان یک کتابخانه استفاده نمایید ! 2

● ساختار تبدیلات تاریخ به کار رفته در کنترل.. 3

سوال  : چگونه تاریخ‌ها را به یکدیگر تبدیل نماییم ؟. 3

● فوق انعطاف !؟. 4

● خصوصیات اصلی... 4

● خصوصیات نام روز از هفته DayName. 5

● چگونگی تنظیم چیدمان داده‌ها 7

● ترسیمات, رنگ‌ها و الگوها 7

● تنظیمات روز‌های تعطیل Holidays. 9

● خطوط.. 10

● سایه‌ها 10

● رویداد‌ها 11

● نمایش چند تقویم در یک صفحه ! 11

● تنظیمات گزارش تاریخ Report Box. 14

● کنترل تنظیمات تصویر Picture Properties. 18

● خصوصیت کنترل کامل Controls. 18

● دیگر خصوصیات و فرمان‌ها 20

● ابزارهای همراه کامپوننت... 22

 

 

● مقدمه

 

کنترل فوق انعطاف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

« Download »

 

در زمینه کنترل داده‌های تاریخی در برنامه‌نویسی تاکنون الگوریتم‌ها و برنامه‌های زیادی وارد این عرصه شده اما سلامت و صحت عملکرد بسیاری از آنها به دلیل ناقص بودن الگورتم مورد استفاده در آنها دچار خدشه شده و با کمال تأسف باید گفت که تعداد انگشت شماری از آنها فقط تا 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

Javad_JSP@Yahoo.com

بهمن 1384

February 2006

پایان