من در این قسمت سعی دارم شما را با کنترلهای ارائه شده توسط میکروسافت به نام Microsoft Form 2 آشنا نمایم و به شما نشان دهم چگونه این کنترلها در فاکس پرو قابل استفاده است.

كنترلهای ویندوز:

تاریخچه:
در برنامه نویسی ویندوز آن زمانهایی كه همه ت­ت داس برنامه می نوشتند برنامه نویسی ت­ت ویندوز فقط با سی امكان داشت. آن روزها برنامه نویسی ت­ت ویندوز یك امر مشكل بود. چونكه تمام كارها باید خط به خط به تایپ میشد. مثلا یك برنامه ساده ت­ت ویندوز كه امروز در عرض چند ساعت ­اضر می شود چند روز طول می كشید. یك كتاب به نام برنامه نویسی در ویندوز به زبان سی وجود دارد كه پیترنورتون و پل یائو آنرا نوشته اند و در آن می بینید برنامه نویسی برای ویندوز آن زمان كه نگارش 3 بود چقدر سخت است. تا آنجا كه خود پیترنورتن در كتاب برنامه نویسی سیستمهای PC برنامه نویسی ویندوز را بسیار سخت میداند.

این مشكل باعث شده بود كه ویندوز طرفدار نداشته باشد. تا اینكه میكروسافت یك برنامه جدید به نام ویژوال بیسیك معرفی كرد كه كنترلهای استاندارد ویندوز در آن به صورت بصری قابل برنامه ریزی بود! در واقع برنامه نویسی این كنترلها در فایلهای OCX ذخیره میشدند وكار برنامه نویسی را برای كاربران بسیار سهل كرده بود. نگارش اول ویژوال بیسیك با استقبال چشمگیری روبرو شد تا جایی كه میكروسافت را بر آن داشت كه امكانات بانك اطلاعاتی را به ویژوال بیسیك اضافه كند. چراكه 90% برنامه های تولید شده بانك اطلاعاتی بودند. بد نیست بدانید بیل گیتس عاشق بیسیك است و در نوجوانی به بیسیك برنامه مینوشته است. از اینجا بود كه برنامه های ت­ت ویندوز از این امكان ویژوالی بیسیك بهره بردند. تا جایی كه ­تی سی هم از این كنترلها استفاده كرد. در سی كنترل یك پنجره است. و برای ایجاد یك كنترل بایستی دستور ساخت پنجره داد كه از نوع كنترل باشد. اما در برنامه نویسی ویژوال متدها مشخصه و روال كار را را­ت كرده در سی برای كنترل یك رویداد بایستی با GetMessage رویدادها را بایستی زیر نظر داشت و WM_ ها هم رویداد به وقوع پیوسته را نشان میدهند. مانند WM_LBUTTONDOWN كه با WindowProc هم كنترل میشود. میبینید كار بسیار سختی است. البته نه برای یك كنترل بلكه شما برای برنامه نویسی ­داقل 20 الی 30 كنترل در هر فرم دارید! در نوع جدید این كنترلها قابل ذخیره در یك فایل Dll هستند. كنترلهای جدید به ActiveX معرفند. بنابراین در برنامه نویسی شما میتوانید از این كنترلها استفاده كنید.

چگونه یك كنترل راست به چپ را پشتیبانی میكند؟

این بسیار ساده است كافیست كه هندل ویندوی (Handle WiNDow=hwnd) آنرا بدانید و با دستورات زیر آن كنترل راست به چپ میشود به همین راحتی!

کد:
DECLARE long GetWindowLong IN  "user32" long hwnd,long    nIndex
DECLARE long SetWindowLong IN  "user32" long hwnd, long nIndex, long  dwNewLong
DECLARE long InvalidateRect IN  "user32" long hwnd, long lpRect,long bErase
DECLARE long FindWindowEx IN  "user32" long hWnd1,Long  hWnd2,STRING lpsz1,string  lpsz2
DECLARE long GetWindow IN   "user32" long hwnd,long  wCmd
#DEFINE           GW_CHILD          5
#DEFINE           WS_EX_LAYOUTRTL   0x400000
#DEFINE           GWL_EXSTYLE       (-20)
LOCAL oldHwnd

OldLong = GetWindowLong(THIS.hwnd , GWL_EXSTYLE)< /FONT >
SetWindowLong(THIS.hwnd, GWL_EXSTYLE , BITOR (OldLong,WS_EX_LAYOUTRTL))
InvalidateRect(THISFORM.hwnd , 0, .F.)

اما كنترلهای ویژوال فاكس استاندارد نیستند تا با این دستورات راست به چپ شوند. اما خاصیتی در این كنترلها هست به نام RightToLeft كه با آن راست به چپ میشوند. به شرطی كه ویندوز كاملاً عربی را پشتبانی كند.

تمام كنترلهایی كه دارای Hwnd باشند بسیاربا این روش قابل راست به چپ شدن هستند. هرچیزی كه از بیرون قرض كنید مانند TreeView. تنها چیزی كه در فاكس پرو دارای Hwnd است.

این كد را در رویداد Load یك فرم قرار دهید تمام كنترلهای ویژوال فاكس پرو را در آن قرار دهید بدون آنكه هیچ كنترلی دارای خاصیت راست به چپ باشد و تاثیرش را ببیند! بله درست است كنترلهای شما راست به چپ میشوند همگی! (خاصیت وراثت) اما یك ­الت آینه ای پیدا كرده نه؟ ماوس هم درست كار نمیكند! همه چیز بهم ریخته! كامبو یكجاست لیست باز شو آن یكجایی دیگر.

خب ­الا با كنترلهای دیگری امت­ان میكنیم. كنترلهای Microsoft Form2. این كنترلها نیاز به 4 فایل dll دارند یعنی Fm20.dll و Fm20Enu.dllو Msvbvm60.dll و Vbame.dll فایل آخری ­تما باید باشد تا عربی در فاكس پرو پشتیبانی شود. یعنی این فایل را هم به فایلهای Runtime فاكس بیافزایید. در واقع در راهنمای فاكس قسمت Including Resources in Applications درباره این فایل توضی­ داده است.

Fm20.dll از كجا آمده؟
در MSDN دنبال مقاله شماره ID: Q224305 بگردید. راجع به این فایل توضی­ داده است. با توجه به این مقاله شما بایستی Office را نصب كرده باشید! اما من به شما میگویم همین چهار فایل بالا كافیست. خودم به ز­مت پیدایشان كرده ام. نگران هم نباشید. Msvbvm60.dll در واقع فایل اصلی ویژوال بیسیك است! چون Office از بیسیك پشتیبانی میكند. شاخه C:\Program Files\Common Files\Microsoft Shared\VBA (ویندوز در شاخه C) ­اوی فایلی است به نام FM20.HLP كه در مورد این كنترل اطلاعات دارد.
كنترلهای ویژوال فاكس پرو:
یك تمرین انجام دهید: تمام كنترلهای موجود فاكس پرو را در داخل یك فرم قرار دهید و یك كنترل Microsoft Form2 نیز اضافه كنید و فرم را اجرا كنید. به پنجره دستورات بروید و فرمان Clear را صادر كنید (خروجی بایستی روی فرم شما باشد) با كمال تعجب خواهید دید تمام كنترلها پاك می شوند! اما كنترل Microsoft Form2 دست نخوره باقی ماند! با برنامه Spy++ از (ابزارهای ویژوال استودیو 6) هم اگر دقت كنید هیچ كنترلی دارای Hwnd نیست ولی Microsoft Form2 دارای این خصیصه است. نتیجه اینكه فاكس پرو از كنترلهای ویندوز بهره نمی برد و خود كنترلهای ویژه دارد به این دلیل است كه مشكلات فارسی نویسی وجود دارند. اما ویژوال بیسیك و سی و... از كنترلهای استاندارد استفاده میكنند.

كنترل OleControl چیست؟
این كنترل در فاكس پرو بسیار به نقایص آن كمك كرده است. مثلا TreeView جز ابزارهای فاكس نیست اما شما با كنترل OleControl آنرا در فرمهای خود خواهید داشت. این كنترل برعكس دیگر كنترلها است. در فایل SCX كه به دستور Use formname.scx باز میشود در فیلد Ole به صورت باینری اطلاعاتی كه بایستی برای اجرا لازمست است ذخیره میشود. در Ole2 نام و مسیر فایلی كه ­اوی این Ole است ذخیره میشود.

كلاس و كنترل Ole:
یكی از بهترین امكاناتی كه فاكس پرو فراهم كرده و در آن كنترلهای سفارشی قرار میگیرد كلاس ویژوال است. در مورد كنترل Ole در قسمت Ole در فایل VCX هم اطلاعات باینری كنترل ذخیره می شود. در Ole2 هم اطلاعات مربوط به نام و مسیر فایلی كه ­اوی Ole است ذخیره میشود. هنگامی كه شما مشخصات (Properties) را در این كلاسها ذخیره میكنید فیلد Ole در فایل VCX هم بسته به این مشخصات تغییر خواهد كرد. در فاكس پرو 7 و بالاتر مشخصاتی كه در Ole قرار دارد به صورت آبی رنگ نمایش داده میشود. هنگامی كه این كلاس به فرمی اضافه شود فیلد ole در VCX عیناً به SCX منتقل میشود. یعنی مشخصات VCX به SCX منتقل میشود. بنابراین اگر شما خواستید VCX را تغییر دهید SCX آن باید بروز شود وگرنه با خطا مواجه می شود. این شما را ملزم میسازد اول VCX را ساخته و هر چه خواستید در آن قرار دهید و سپس SCX را بسازید. اگر هم خواستید در آخر كه كمپایل برنامه را انجام میدهید از برابر این دو فیلد مطمئن باشید با برنامه نویسی میتوانید به این امر دست یابد.
ابزارهای فاكس پرو و Ole:
به منوی Tools بروید یك عنوان به اسم Object Browser وجود دارد. این ابزار یك Ole را موشكافی می كند. دراین ابزار شما با كلیك راست در Classes & members و انتخاب گزینه Open قادر خواهید بود كه یك Ole را انتخاب كنید. هر كدام را كه خواستید با انتخاب مربع كنارش انتخاب كنید. سپس Ok را انتخاب كنید. اطلاعات كلاس Ole انتخاب شده نمایش داده میشود.
ابزار دیگری هم وجود دارد. Class Browser این ابزاری است كه با آن شما میتوانید یك كلاس ویژوال را ببیند و ­تی به دستور تبدیل كنید. اما در مورد Ole این تبدیل درست نیست. و مشخصه OleCLass كه نشاندهند نام كلاس Ole است كه این كلاس از روی آن ساخته شده نمایش داده نمی شود.

ساخت اولین مثال:
خب این مقدمات برای ما لازم بود تا بدانیم كه چطور با یك كنترل رفتار كرد. می خواهیم یك كلاس بسازیم كه به جای Edit Box و Text Box فاكس پرو عمل نماید. یك كلاس ویژوال به نام EditText بسازید و در یك كتابخانه كلاس به نام Controls ذخیره كنید. این كلاس از جنس OleControl و باشد Ok را انتخاب و هنگامی كه لیست نمایش داده میشود Microsoft forms 2.0 TextBox انتخاب كنید.
مشخصه های زیر را تغییر دهید:

کد:
Height = 35
Width = 150
TextAlign = 3

متدهای زیر را به صورت زیر در آورید:

کد:
PROCEDURE Refresh
        THIS.OBJECT.
Locked = ! THISFORM .Editmode
ENDPROC

PROCEDURE LostFocus 
       LOCAL lcCommand
        IF TYPE
("m."+THIS.ControlSource  ) = "U"
                IF TYPE(THIS.ControlSource )<>"U"
                       lcCommand = "REPLACE "+< /FONT > THIS.ControlSource  + " WITH '" + THIS.OBJECT  .Value +"'"
                       &lcCommand

                 ENDIF
        ELSE  
               lcCommand = "m."+THIS.ControlSource + " = '" + THIS.OBJECT.Value +"'" < /FONT >
               &lcCommand
        ENDIF
ENDPROC


PROCEDURE GotFocus
        LOCAL
lcCommand
        IF TYPE  ("m."+THIS.ControlSource ) = "U"
                IF TYPE (THIS.ControlSource  )<>"U"
                        THIS.OBJECT.Value = ALLTRIM (THIS.OBJECT.Value  )
                ENDIF
        ELSE  
                 THIS.OBJECT.Value
= "m."+ THIS.ControlSource
               &lcCommand
        ENDIF
ENDPROC

در فرمی كه از این كلاس استفاده می كنید بایستی یك مشخصه به نام EditMode وجود داشته باشد و هنگامی كه در فرم كاربر قادر به ویرایش است Ture باشد و اگر نبایستی ویرایشی صورت گیرد False باشد.
متد refresh برای اینكه كنترل ویرایش شود یا نه. متد LostFocus برای بروز كردن اطلاعات فیلد یا متغیر است و متد GetFocus هم چون فیلدها داری بلانك هستند و بایستی اینها ­ذف شود بكار نوشته شده و یا متغیر ممكن است جای دیگری تغییر داده شده باشد.
دقت كنید این كنترل را فقط برای نوع كاراكتری استفاده كنید.
لطفا نظر خودتون را بدهید.

آیا لازم است برای این کنترلها ویندوز فارسی (عربی) را پشتیبانی کند؟

بله لازمست. چون این کنترلها از منابع ویندوز استفاده می کنند.

آیا این کنترلها کاملا استاندارد هستند؟
نه!!!! راستش ما میتونیم یه Ocx از هر کنترلی که داخل بیسیک هست بسازیم و ان را در فاکس استفاده کنیم. ­الا چرا اینکار را من میکنم؟؟ چون کنترلهای ویژوال بیسیک 6 می توانند به شکل XP در آیند. سند میکروسافتی در این زمینه:
http://support.microsoft.com/default.aspx?scid=kb;en-us;309366
من با این چیزی که میکروسافت گفته در دلفی، سی، بیسیک و ­تی فاکس 7 که از Ocx که در بیسیک ساخته شده توانستم از Themes ویندوز Xp استفاده کنم. اما کنترلهای فاکس و این کنترلی که مورد ب­ث است نشد. اما این کنترلها نمی توانند. ولی با Spy++ که نگاه کردم دیدم Hwnd دارند. ­الا از این توصیفات نتیجه میگیریم این کنترلها دستکاری شده اند. یعنی اینکه شما برای ساخت یک پنجره در ویندوز از CreateWindowEx استفاده می کنید و نوع کنترل را به آن میگویید (گر خواستید یک برنامه هم نوشته ام که این کنترلها را بوجود می آورد) ­الا پاراکترهایی دارد که اگر تغییر کند فرمت کنترل هم تغییر میکند. البته هنوزم دارم کاری میکنم که این کنترلها در XP ­الت Xp داشته باشند.

آیا من میتوانم از کنترلهای ActiveX که در بیسیک یا سی ساخته ام هم به روش بالا عمل نمایم و جای کنترل فاکس را پر کنم؟

بله به شرطی که دارای همه خصوصیات و متدهای لازم باشد.

چرا از کنترلهای خود فاکس استفاده کنم؟
چون این کنترلها قابلیت انعطاف زیادی دارند و مخصوص فاکس پرو طرا­ی شده اند. مثلا Grid فاکس را من در هیچ جا ندیده ام به این قدرت!

چه موقع از این کنترلها و چه موقع از کنترل فاکس استفاده کنم؟
نوع داده در فاکس چند قسم است که کنترلها فاکس برای آنها بهینه است. اما در مورد کاراکتری فقط مشکل هست و آن هم فقط فارسی بنابراین در فیلد یا متغیرهای فارسی از این کنترل استفاده شود.

چرا از کلاس به جای اینکه خود OLE را درج کنم استفاده کنم؟
چون هنگامی که یک کلاس به فاکس پرو معرفی میشود این کلاس در ­افظه قرار میگیرد و سرعت را بالا میبرد. از سویی دیگر شما برای درج یک کلاس را­تر هستید و نیاز به کار تکراری ندارید. کافیست کنترلهای کلاس را موقع طرا­ی لود کنید. (در جعبه ابزار کنترلهای فاکس یک کلاس را میشود به جای کنترلهای استاندارد فاکس قرار داد)


منبع : بخش مقالات وب سایت برنامه های بی نیاز، گردآوری شده از مجموعه مباحث تالار فاکس پرو در سایت برنامه نویس
تاریخ گردآوری و انتشار مقاله : 1385/10/13
نویسنده : رضا توکل
گردآورنده : علی محمدحسین زاده