علی محمد‌ حسین‌ زاده چهارشنبه 3 اردیبهشت 1393 06:06 بعد از ظهر نظرات ()
در ادامه مبحث نحوه تنظیم ویندوز جهت پشتیبانی از RTL حال به موضوع  برنامه نویسی فارسی در ویژوال  فاکس پرو بیشتر میپردازیم.

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

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

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

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

Set Sysmenu To RTLJUSTIFY

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

Set Sysmenu To LTRJUSTIFY

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

*--  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