کنترل انتخاب تاریخ در پریماورا
این یک بادداشت فنی دربارهی پیادهسازی تقویم شمسی در کنترل انتخاب تاریخ در پریماورا است که ممکن است برای علاقهمندان به چگونگی کارکرد پرنیان (فارسیساز پریماورا) جالب باشد.
پیادهسازی تقویم شمسی در کنترل انتخاب تاریخ (Date Picker) در پریماورا نهایتا کاری خلاقانه و جالب شد. پیش از این هربار که به این مسئله فکر کرده بودم، به خاطر پیچیدهگیهایی که در آن پیشبینی میکردم، از انجام آن منصرف شده بودم. تا این بروزآوری آخر که به نظرم اینقدر خوب شده بود که حیف بود این امکان را نداشته باشد.
در کنار هر کنترل وارد کردن تاریخ در پریماورا یک کلید هست. این کلید کنترل انتخاب تاریخ را نمایش میدهد تا کاربر بر اساس یک جدول تقویمی تاریخ مورد نظر را انتخاب کند. در تصویر زیر این کنترل را در وضعیت اصلی و در وضعیت تقویم شمسی نشان داده شده است. همانطور که در تصویر مشخص است، تقویم شمسی و میلادی همزمان نشان داده میشود و کاربر میتواند به صورت همزمان، تاریخ را به شمسی و یا میلادی انتخاب کند.
برای انجام اینکار روشهای مختلفی بررسی شد. روشهای سادهتری نظیر جایگزین کردن کامل این کنترل با کنترلهای استاندارد انتخاب تاریخ، عمدتا به دلیل آنکه این کنترل توسط خود برنامهنویسان پریماورا توسعه داده شده است و از اینرو اینترفیسهای استانداردی ندارد ممکن نشد. نهایتا تصمیم گرفتیم این کنترل را به هنگام نمایش فارسی کنیم. به این معنا که عملیات نمایش اعداد روزها هک شود و وقتی هر یک از این روزها روی صفحه نمایش داده میشود، در کنار آن روز معادل شمسی هم چاپ شود. خوشبختانه خانههایی که برای نمایش روزها در کنترل اصلی هستند به اندازهی کافی بزرگ هستند که روزهای تقویم شمسی هم در آنها قابل نمایش باشد. نکتهی کلیدی اینجاست که جدول تقویم یک Window است و خانههای آن Windowهای متفاوتی نیستند که بشود متن آنها را تغییر داد. عملا این خانهها با تابع ExtTextOut کشیده میشوند. بنابر این تابع را تغییر دادیم، به ترتیبی که اعداد مربوط به تقویم شمسی را هم در کنار مبلادی نمایش دهد.
برای اینکار البته لازم است که بدانیم کنترل در حال ترسیم کدام ماه است. اینکار را میتوانیم با خواندن متن کنترلی که ماه را نشان میدهد انجام دهیم. خوشبختانه این یک کنترل استاندارد ویندوز است (شکل زیر) که میتوان به راحتی آنرا پیدا کرد، متن آنرا خواند و آنرا برای نمایش ماه شمسی تغییر داد.
اکر چه به دلیل روشی که توضیح داده شد ما مجبور خواهیم بود تقویم را با پایهی میلادی نشان دهیم. یعنی ماهی که نمایش داده میشود میلادی است، و فقط معادلهای شمسی روزها نمایش داده میشوند. با اینحال به نظرم میرسد این روشی منطقی و هوشمندانه و در عین حال بسیار ساده و کاربردی برای اینکار است.