در ادامه مبحث برنامه نویسی فارسی در  ویژوال فاکس پرو حال به موضوع   شخصی سازی کنترل‌ها در ویژوال  فاکس پرو بیشتر میپردازیم.

 در این مقاله سعی میکنم هم گوشه ای از ساختن کلاس در ویژوال  فاکس پرو را تشریح کنم و هم کنترل های Grid  و PageFrame را طبق نیازهای خودمان و مشکلات  فارسی شخصی سازی کنیم.

ابتدا نگاهی به کلاس ها در ویژوال  فاکس پرو داریم. ما میتوانیم با استفاده از اشیاء پایه ،  اشیاء جدیدی (ساده یا ترکیبی از چند شئ دیگر)با  مشخصات مدنظر  خودمون بسازیم و مانند دیگر اشیاء از آنها در فرم هایمان استفاده  کنیم.مزیت این کار علاوه بر کاهش کد نویسی در فرم ها این است که اگر  شما تغییری را در کلاس اعمال کنید این تغییر را در تمام اشیاء که از آن  کلاس ساخته اید مشاهده میکنید زیرا آنها یک نمونه از کلاس شما هستند  بنابراین کسانی که میگویند خوب چرا کلاس بسازیم؟(یک شئ با خصوصیات  موردنظر میسازیم و آن را در فرمهای مختلف کپی میکنیم) این جواب قانع  کننده است.

این استفاده برای ما که فارسی زبان هستیم اهمیتی دو چندان پیدا میکند.  زیرا براساس نیاز زبان فارسی به راست به چپ بودن بایستی کنترل هایمان  نیز این خاصیت را داشته باشند.بعنوان مثال شما نیاز دارید که کنترل های Label و TextBox  شما RighttoLeft بوده و شاید بخواهید از  فونت مشخصی برای آنها استفاده کنید.

قبل از ساخت کلاسی برای اشیاء بالا نکته ای که  در این چند سال تجربه کرده ام را بیان میکنم. به نظر من بایستی یک کلاس  پایه برای همه اشیاء که نیاز دارید بسازید حال برای پروژه های مختلف یک  نمونه از آن را بنابرآن پروژه تغییر داده و از آن استفاده کنید.شاید در  ابتدا امری وقت گیر بنظر آید اما در عمل صرفه جویی زمان را بشدت احساس  خواهید کرد.

برای ساخت کلاس در سمت راست قسمت کلاس ها در  پنجره مدیریت پروژه گزینه New را انتخاب  کنید(یا این مسیر را دنبال کنید
File->New->class
).در پنجره باز شده نام کلاس و شئ پایه را مشخص  کنید همچنین اگر از قبل کلاسی دارید که میخواهید شئ جدید را به آن  اضافه کنید از قسمت Store in آن را  انتخاب کنید و یا اگر میخواهید کلاس جدیدی بسازید نام و آدرس آن را  مشخص کرده و تائید کنید.

بسته به شئ پایه ای که انتخاب کرده اید پنجره  ای همانند ویرایشگر فرم باز شده با این تفاوت که در اینجا فقط میتوانید  مشخصات شئ مذکور را تغییر دهید و ذخیره کنید.حال برای استفاده از آن   یک فرم را ایجاد کنید. در نوار ابزار فرم با کلیلک بر روی View Classes و انتخاب گزینه Add کلاس خود را انتخاب کنید.با این کار  کنترل های شخصی سازی شما به جای کنترل های اصل نمایش داده میشوند و  میتوانید آنها را بروی فرم بکشید و همانند دیگر اشیاء با آنها کار  کنید.جهت برگشت اشیاء پایه نیز میتوانید از منوی مذکور گزینه Standard را انتخاب کنید. حالا بر میگردیم  به موضوع اصلی که در مقاله قبلی قول آن را به شما داده بودم.

شخصی سازی کنترل PageFrame :

هر PageFrame خود  از چند Page تشکیل شده است که هر صفحه  تنظیمات مهمی مانند فونت و FontCharset  هستند که برای ما اهمیت زیادی دارد.پس ما نیاز داریم تا یک شئ بر اساس Page را شخصی سازی کنیم و PageFrame را مقید کنیم تا صفحاتش را از  کلاس ما بسازد. برای این کار در ابتدا یک شئ شخصی شده از Page میسازیم و آن را ذخیره میکنیم.بعنوان  مثال من تغییرات زیر را اعمال میکنم:

FontName="Tornado  Tahoma"
 FontSize=10
 FontCharSet=178
 Picture="PageBack.bmp"

و  ذخیره میکنم.حال بایستی شئ پدر یا Parent را  ساخت و مشخص کرد که برای ساخت صفحات از صفحه شخصی سازی شده ما استفاده  کند.پس یک کلاس از شئ پایه PageFrame  میسازیم.این شئ دارای دو خاصیت بنام های MemberClass و MemberClassLibrary می  باشد.این خصوصیات را در شئ Grid هم مشاهده  خواهید کرد.توسط MemberClassLibrary  میتوانید کلاسی را که حاوی شئ صفحه شخصی سازی شده ماست را انتخاب کنید  و توسط MemberClass هم شئ مورد نظر را از  کلاس انتخاب شده انتخاب کنید.به این ترتیب هر صفحه جدیدی که ساخته  میشود بر اساس آن خواهد بود.

توجه کنید که قبل از تغییر این  خصوصیات اگر شئ PageFrame حاوی صفحاتی است  آنها را پک کنید و بعد تغییرات را اعمال کنید در غیر اینصورت تغییرات  در صفحات موجود از قبل اعمال نخواهد شد.

به اینترتیب شما یک PageFram شخصی سازی شده مطابق نیازهای خود  خواهید دارید.
 در صورتیکه شما خاصیت RightToLeft کنترل PageFrame را .T.  تنظیم کنید دو مشکل بوجود می آید:

  • حرکت بین صفحات بر خلاف جهت آنها

  • کار نکردن خاصیت TabOrientation در صورت اختصاص دادن  مقداری غیر از صفر سرصفحه ها ناپدید میشوند.

راه حل هر دو مورد تنظیم خاصیت  RightTLeft به .F. است و اما در  انتها شما باید صفحاتتان را برعکس بچینید یعنی صفحه شماره یک آخرین  صفحه شما و آخرین صفحه اولین آن باشد و همچنین برای فعال کردن اولین  صفحه(اخرین صفحه از نظر شماره) این کد را در واقعه Init  کلاس شئ PageFrame قرار  دهید :

This.ActivePage=This.PageCount

شخصی سازی کنترل Grid :

در مورد Grid هم معماری کار همانند PageFrame است که در بالا مشاهده کردید.  یعنی خود کنترل Grid از شئ فرزند دیگری به  اسم Column و خود Column  از دو شئ دیگر Header و TextBox (البته این را میتوانید با اشیاء دیگر مانند Combo Box یا List Box  یا ... عوض کنید اما Header جزء جدا نشدنی  است) تشکیل شده است . بنابراین ما بایستی یک پیمایش پایین به بالا را  در جهت شخصی سازی آنها طی کنیم.

حال اگر دست به کار شوید تا  کلاسی بر اساس شئ Header و یا Column بسازید متوجه میشوید که چنین  کنترلهایی در لیست موجود نیستند.بله درست است شما این اشیاء را بصورت  ویژوال نمیتوانید طراحی کنید بلکه بایستی با استفاده از دستور Define Class در یک فایل prg این کلاس ها را بسازید.فقط شئ Grid را میتوانید بصورت ویژوال تغییر دهید.همچنین میتوانید این  تعاریف را در فایلهای جدا و یا همگی را در یک فایل prg انجام دهید.در کد زیر همانطور که مشاهده میکنید سه شئ Column ، Header  و TextBox را تعریف کرده‌ام(توجه کنید که شئ TextBoxرا میشود بصورت ویژوال طراحی کرد اما  برای راحتی کار اینجا بیان شده است) و در فایل MyGrid.prg ذخیره کرده‌ام:

Define Class bcolumn As Column

Alignment=1
HeaderClass="myheader"
HeaderClassLibrary="mygrid.prg"
FontCharSet=178
FontName="Tornado  Tahoma"
Add Object  "text1" As "mytext"
Sparse=.T.

Enddefine

Define  Class myheader As Header

Alignment=2
FontCharSet=178
FontName="Tornado  Tahoma"

Enddefine

Define  Class mytext As TextBox

FontCharSet=178
FontName="Tornado  Tahoma"
Procedure  KeyPress
Lparameters  nKeyCode, nShiftAltCtrl
If  (nKeyCode=9 Or nKeyCode=13)

Nodefault
If  This.Parent.Parent.ActiveColumn
>1

This.Parent.Parent.Columns(This.Parent.Parent.ActiveColumn-1).SetFocus

Else

This.Parent.Parent.Columns(This.Parent.Parent.ColumnCount).SetFocus

Endif

Endif
If  nKeyCode=15

Nodefault
If  This.Parent.Parent.ActiveColumn
<This.Parent.Parent.ColumnCount

This.Parent.Parent.Columns(This.Parent.Parent.ActiveColumn+1).SetFocus

Else

This.Parent.Parent.Columns(1).SetFocus

Endif

Endif
Endproc

Enddefine

در  نهایت هم یک کلاس از شئ Grid ساخته با  مشخصات زیر و آن را نیز ذخیره میکنیم :

FontName="Tornado  Tahoma"
 FontSize=10
 FontCharSet=178
 DeleteMark=.F.
 HighLightStyle=2
 SplitBar=.F.
 Procedure Init
 This.DoScroll
(7)
 Enproc
 Procedure Resize
 This.DoScroll
(7)
 Enproc
 

حال  ما یک grid شخصی سازی شده داریم.البته متوجه  شده اید که این کنترل هم با تنظیم خاصیت RightToLeft به .T. مشکل دارد و به  هم میریزد بنابراین بایستی آن را .F. تنظیم  کنید. با این تنظیم مشکل دیگری پیش می آید و آن حرکت بر عکس در Grid توسط کلید های مکان نما و دیگری در  صورت داشتن Scroll آن در سمت چپ قرار  میگیرد.برای برطرف کردن مشکل دوم دستوری را  در وقایع Init و Resize  گرید اضافه کرده ام.این دستور باعث میشود تا اسکرول به سمت راست  برود.مشکل اول نیز در تعریف کنترل TextBox  حل میشود.توجه کنید که این تنظیمات برای مثال آورده شده اند و شما  میتوانید به هر صورت که خواستید آن ها را تغییر دهید.همانطور که به کد  بالا توجه دارید به توضیحات آن میپردازم :

در مورد Column ما تنها مشخصات فونت را تغییر دادیم و کلاسی را که جهت  ساخت Header بایستی استفاده میشد را مشخص  کردیم.نکته اصلی اضافه کردن یک textBox شخصی  سازی شده است که آن را با دستور Add Object  اضافه کردیم و مهمترین کار تغییر خاصیت Sparse  به .T. میباشد که در غیر اینصورت کنترل شما  کار نخواهد کرد.

در مورد Header کار خاصی انجام ندادیم و همه چیز واضح است.

اما در مورد TextBox علاوه بر تنظیمات معمولی مشاهده میکنید که تکه کدی برای  واقعه KeyPress نوشته شده است که حرکت صیحیح  راست به چپ را در Grid ممکن میسازد.تحلیل آن  را بعهده شما میگذارم.

در خاتمه امیدوارم که این مقاله  برای شما مفید باشد.همچنین منتظر نظرات و  پیشنهادات شما در مورد مقالات هستم.سعی میکنم در مقاله بعدی در  مورد چاپ و پیش نمایش و مشکلات فارسی مطالبی را آماده کنم.


منبع : بخش مقالات وب سایت برنامه های بی ِنیاز
تاریخ نگارش مقاله : 1385/12/12