علی محمد‌ حسین‌ زاده پنجشنبه 4 اردیبهشت 1393 11:12 قبل از ظهر نظرات ()

من در این قسمت سعی دارم شما را با کنترلهای ارائه شده توسط میکروسافت به نام 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
نویسنده : رضا توکل
گردآورنده : علی محمدحسین زاده