در ادامه مبحث نحوه تنظیم ویندوز جهت پشتیبانی از RTL حال به موضوع  برنامه نویسی فارسی در ویژوال  فاکس پرو بیشتر میپردازیم.

بعد از تنظیم ویندوز اولین  نکته ای که ذهن یک برنامه نویس فارسی زبان را مشغول میکند نحوه چینش  منوهاست.

به این ترتیب که منوها را چگونه بصورت راست به چپ مرتب کنیم؟

بر اساس معماری زبان برنامه نویسی ویژوال  فاکس پرو شما به دو صورت میتوانید برنامه های خود را آغاز کنید.با  استفاده از پنجره اصلی ویژوال  فاکس پرو (screen_) و  یا توسط یک فرم از نوع Top Level  به همین ترتیب مرتب کردن منوها در این دو فرم تفاوت دارد.

  • Screen_ :  در این حالت با استفاده از دستور زیر منوها از راست به چپ تنظیم  میشوند البته توجه کنید که اگر تنظیمات ویندوز انجام نشده باشند به  محض اجرای این خط از برنامه خطایی رخ میدهد و منوها از چپ به  راست نمایش داده میشوند.

SET  SYSMENU TO rtljust

همچنین جهت نمایش منوها از چپ به  راست نیز از این دستور استفاده میشود :

SET  SYSMENU TO ltrjust

  • Top Level  Form: در این مورد کار کمی پیچیده تر  میشود . بایستی قطعه کد زیر در متد فرمی که حاوی منوهاست اجرا شود  این کد راه حل خود مایکروسافت  جهت حل این مشکل است.

*--  Define extended Windows styles
#DEFINE  GWL_EXSTYLE -20
#DEFINE WS_EX_LAYOUTRTL 0x400000
#DEFINE WS_EX_NOINHERITLAYOUT  0x100000
*-- Define the Get window long API
DECLARE INTEGER  GetWindowLong IN user32 INTEGER hWnd, INTEGER nIndex
*-- Define the Set window long API
DECLARE INTEGER  SetWindowLong IN user32 INTEGER hWnd, INTEGER nIndex, INTEGER dwNewLong
*-- Get this form's current style.
OldLong = GetWindowLong(ThisForm.HWnd,  GWL_EXSTYLE)
*-- Set the window extended style RTL  non-inheritable.
SetWindowLong(ThisForm.HWnd,GWL_EXSTYLE,BITOR(OldLong,WS_EX_LAYOUTRTL,WS_EX_NOINHERITLAYOUT))

همانطور که از توضیحات مشخص است  در واقع توسط دو تابع API پنجره را  کاملا برعکس میکنیم. از این کد میتوانید برای راست به چپ کردن هر  شئ که دارای یک خاصیت Hwnd (هندل شئ) باشد مانند کنترل درخت (Tree View) استفاده کنید.

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

راه حل این موضوع استفاده از  کنترل Microsoft Toolbar Control است. این  کنترل در فایل MSCOMCTL.OCX موجود است و بایستی در ساخت فایل نصاب (Setup)  حتما انتخاب شود.حتی با استفاده از این کنترل مشکل راست به چپ به آسانی  قابل حل است.

جهت استفاده از آن در محیط  ویرایش فرم با انتخاب دکمه ActiveX Control  از لیست باز شده Microsoft Toolbar Control   را انتخاب کنید و یک نام مناسب به آن اختصاص دهید. همچنین جهت استفاده  از تصاویر نیز کنترل Microsoft ImageListCtrl را انتخاب کنید و نام مناسبی به آن اختصاص داده و تصاویر مورد  نظر را انتخاب کنید.

حال جهت ساخت انواع دکمه ها روی  کنترل راست کلیک کنید و از منوی باز شده گزینه Toolbar Properties را انتخاب کنبد از پنجره باز شده صفحه Buttons را انتخاب کنید.هر دکمه ساخته شده  دارای یک شماره (Index) است که از آن جهت  تغییر مشخصات آن و یا تشخیص انتخاب شدن آن استفاده میکنیم.

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

ThisForm.toolbar1.ImageList=ThisForm.imagelist1
ThisForm.toolbar1.Buttons.Item(1).Image="ImageKey"

توسط  دستور اول شئ تصویر کنترل جعبه ابزار را مشخص میکنیم و در خط بعد برای  دکمه با شماره یک تصویر مشخص میکنیم بوسیله مشخص کردن نام کلیدی که در  کنترل ImageListCtrl برای هر تصویر  مشخص کرده اید.برای مشکل راست به چپ هم نیز میتوانید در متد Resize فرم کد زیر را با توجه به اندازه  دکمه های شما بر حسب پیکسل قرار دهید.

ThisForm.toolbar1.Buttons.Item(FirstButtonIndex).Width=this.Width-WidthOfButtons

نکته  بعدی موضوع راست به چپ برای کنترل هاست که اگر تنظیم ویندوز را  بدرستی انجام داده باشید کافی است تا خاصیت  RighttoLeft آنها را برابر .T. قرار  دهید البته بازهم برای بعضی کنترل ها مانند Grid  استثنا وجود دارد(ستونها به هم میریزند و تا  بحال که نسخه 9 ویژوال  فاکس پرو منتشر شده است مشکل آن حل نشده  است).همچنین کنترل های List , Combo , EditBox علاوه بر این تنظیم بایستی خاصیت Alignment آنها نیز Right انتخاب شود.

مسئله بعد نوشتن فارسی در Text Box و Edit Box  هاست.در حالت عادی کاربر باید برای نوشتن فارسی زبان صفحه کلید را خود  عوض کند و اگر باز خواست انگلیسی بنویسد دوباره آنرا تغییر دهد.ما  میتوانیم با استفاده از توابع API این امکان  را به برنامه بدهیم .بعنوان مثال برای یک Text Box  در متد Load آن کد زیر را وارد کنید.

Declare  Integer ActivateKeyboardLayout In win32api Integer,Integer
DECLARE LONG LoadKeyboardLayout IN WIN32API STRING pwszKLID,INTEGER  Flags

حال جهت فارسی کردن کیبورد  دستورات زیر را در متد GotFocus بنویسید.

ActivateKeyboardLayout(1025,0)
lnRetCode = LoadKeyboardLayout('00000429', 1 )

در نهایت جهت برگرداندن به  انگلیسی کد زیر را در متد LostFocus  بنویسید.

ActivateKeyboardLayout(1033,8)
lnRetCode = LoadKeyboardLayout('00000409', 1 )


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


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