فصل ۱۰ — Common Dialog Control
با استفاده از فراخوانیهای API، که در فصل ۲۰ بیشتر بررسی میشوند، میتوانید به Dialogهای استاندارد Microsoft برای بازکردن فایل، ذخیرهٔ فایل، چاپ و انتخاب رنگ دسترسی پیدا کنید. همان Dialogهایی که در برنامههای استاندارد Microsoft میبینید را میتوان در برنامهٔ خودتان به کار برد.
با API Call مناسب مشخص میکنید کدام Dialog نمایش داده شود و میتوانید پارامترهای مختلف را طوری تنظیم کنید که ظاهر و رفتار آن با هدف برنامه سازگار باشد. سپس میتوانید انتخابهای کاربر را نیز دریافت و بر اساس آنها عمل کنید. برای مثال، وقتی کاربر فایلی را برای بازکردن انتخاب میکند، نام فایل و مسیر آن را به دست میآورید و کد لازم را اجرا میکنید.
نکتهٔ مهم این است که اینها فقط Dialogهایی برای فراهمکردن یک رابط استاندارد به کاربر هستند. همچنان باید کدی بنویسید که انتخاب یا Event کاربر را پردازش کند؛ هیچ چیز بهطور خودکار انجام نمیشود. اگر Save Dialog را نمایش دهید و کاربر نام فایل را بنویسد و OK بزند، تا زمانی که کد دریافت نام فایل و ذخیرهٔ داده را ننوشته باشید، اتفاق دیگری رخ نمیدهد.
Microsoft در اینجا بخش رابط مشترک را در اختیارتان میگذارد تا مجبور نباشید آن را از نو بسازید، اما انتخاب گزینههای Dialog و تفسیر انتخاب کاربر همچنان وظیفهٔ برنامهٔ شماست.
در تمام مثالهای بعدی به یک Form همراه با یک Button برای فراخوانی Procedureها نیاز دارید. از Create، گزینهٔ Form Design را انتخاب و از Controls یک Command Button روی فرم بکشید. Wizard را با Cancel ببندید. در مثالها فرض میشود نام Button برابر Command0 است.
Dialog بازکردن فایل (Open File)
ابتدا وارد Module فرم شوید: روی فرم راستکلیک، Build Event را انتخاب و سپس Code Builder را باز کنید. در بخش Definitions بالای Module کد زیر را وارد کنید:
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
این کد API Function با نام GetOpenFileName را Declare میکند و نوع دادهٔ جدیدی با نام OPENFILENAME میسازد. این Type متغیرهای لازم برای کنترل Open File را نگه میدارد.
سپس Subroutine زیر را اضافه کنید تا API Call، Open File Dialog را نمایش دهد و انتخاب کاربر را برگرداند:
Private Sub ShowFileDialog()
Dim MyFile As OPENFILENAME
Dim ReturnValue As Long
Dim strFilter As String
MyFile.lStructSize = Len(MyFile)
MyFile.hwndOwner = Me.hwnd
strFilter = "Text Files (*.txt)" & Chr(0) & "*.TXT" & Chr(0)
MyFile.lpstrFilter = strFilter
MyFile.nFilterIndex = 1
MyFile.lpstrFile = String(257, 0)
MyFile.nMaxFile = Len(MyFile.lpstrFile) - 1
MyFile.lpstrFileTitle = MyFile.lpstrFile
MyFile.nMaxFileTitle = MyFile.nMaxFile
MyFile.lpstrInitialDir = "C:\"
MyFile.lpstrTitle = "Select a File"
MyFile.flags = 0
ReturnValue = GetOpenFileName(MyFile)
If ReturnValue = 0 Then
MsgBox "Cancel Button was pressed"
Else
MsgBox MyFile.lpstrFile
End If
End Sub
این Procedure متغیر MyFile را از نوع OPENFILENAME ایجاد میکند، یک متغیر برای Return Value و رشتهای برای File Filter میسازد و سپس Propertyهای لازم مانند Flags، Initial Directory و Title را مقداردهی میکند. Dialog با GetOpenFileName(MyFile) فراخوانی میشود. ReturnValue نشان میدهد آیا فایلی انتخاب شده است یا نه و در صورت انتخاب، نام فایل در MyFile.lpstrFile قرار میگیرد.
توجه کنید Handle فرم یعنی hwnd در MyFile.hwndOwner قرار میگیرد؛ به همین علت API Call باید از یک Form یا Report اجرا شود.
Filter بهآسانی قابل تغییر است. در مثال فقط فایلهای متنی نمایش داده میشوند؛ در یک برنامهٔ واقعی میتوانید نوع فایلهای مناسب برای Import یا پردازش را محدود کنید. Starting Folder و Title Dialog نیز در همین Procedure مشخص شدهاند. اگر Return Value صفر باشد کاربر Cancel را زده و در غیر این صورت انتخاب در MyFile.lpstrFile قرار دارد.
اکنون Subroutine را از Button فراخوانی کنید:
Private Sub Command0_Click()
ShowFileDialog
End Sub
Dialog فقط فایل را انتخاب میکند. برای بازکردن و پردازش واقعی فایل باید کد دیگری بنویسید.
Save File As Dialog
Dialog ذخیره تقریباً دقیقاً همانند Open Dialog کار میکند. کافی است عنوان MyFile.lpstrTitle را به عبارتی مانند Select a file to Save to تغییر دهید. پارامترها به همان شیوه مقداردهی میشوند و کاربر میتواند فایل موجودی را انتخاب یا نام فایل جدیدی را وارد کند. نام انتخابشده در MyFile.lpstrFile قرار میگیرد و پس از آن کد شما باید داده را در آن فایل ذخیره کند.
Color Dialog
Color Dialog به کاربر اجازه میدهد رنگی را از Palette انتخاب یا یک رنگ سفارشی ایجاد کند.
شکل ۱۰-۱ — Color Dialog
وارد Module فرم شوید و کد Declaration زیر را اضافه کنید:
Private Declare Function ChooseColor _
Lib "comdlg32.dll" Alias "ChooseColorA" _
(pChoosecolor As COLORSTRUC) As Long
Private Type COLORSTRUC
lStructSize As Long
hwnd As Long
hInstance As Long
rgbResult As Long
lpCustColors As String
Flags As Long
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
این کد API با نام ChooseColor را Declare و Type با نام COLORSTRUC را برای نگهداری پارامترهای Dialog ایجاد میکند. سپس Procedure زیر را بنویسید:
Private Sub ShowColorDialog()
Dim x As Long, CSel As COLORSTRUC, CustColor(16) As Long
CSel.lStructSize = Len(CSel)
CSel.hwnd = Me.hwnd
CSel.Flags = &H80
CSel.lpCustColors = String$(16 * 4, 0)
x = ChooseColor(CSel)
If x = 0 Then
MsgBox "The user pressed Cancel"
Else
MsgBox CSel.rgbResult
End If
End Sub
Handle فرم در CSel.hwnd قرار میگیرد. API Call مقدار بازگشتی را در x میگذارد: صفر یعنی Cancel و مقدار غیرصفر یعنی رنگ انتخاب شده است. مقدار رنگ در CSel.rgbResult قرار دارد.
رنگ به شکل RGB برمیگردد و میتوان آن را مستقیماً در Propertyهای رنگ فرم استفاده کرد:
Me.Detail.BackColor = 47456
این مقدار BackColor را به رنگ انتخابشده در Dialog تغییر میدهد.
Print Dialog
نمایش Print Dialog بسیار ساده است و حتی برای خود چاپ لازم نیست کد جداگانهای بنویسید:
DoCmd.RunCommand acCmdPrintSelection
این دستور Print Dialog استاندارد را نمایش میدهد و کاربر میتواند محدودهٔ چاپ و Printer را انتخاب کند. دستور را میتوان از هر نقطهٔ کد اجرا کرد. متأسفانه RunCommand برای همهٔ Dialogها قابل استفاده نیست، به همین دلیل Open، Save As و Color در مثالهای قبل با API ساخته شدند. مزیت API این است که اطلاعات انتخاب کاربر نیز قابل دریافت است؛ چیزی که RunCommand در این شکل فراهم نمیکند.
فصل ۱۱ — کار با Ribbon
در Office 2007 تغییر مهمی در رابط کاربری رخ داد: ساختار منوی Ribbon جایگزین ساختار منوی قبلی شد. این تغییر احتمالاً بیشترین اثر را بر کاربر داشت، چون روش حرکت در منوهای هر برنامهٔ Office را تعریف میکند.
اگر از Access 2010/2007 استفاده کرده باشید، با Ribbon روبهرو شدهاید و همهٔ Functionهای منو را به روشی متفاوت و گاهی گیجکننده در دسترس دارید. خوشبختانه VBA Editor ساختار منوی قدیمی و آشنای خود را حفظ کرده است.
برخی توسعهدهندگان Access VBA Add-inهایی ساختهاند که منوی کلاسیک Access را شبیهسازی میکنند. Ribbon روش کاملاً تازهای برای برنامهنویسی User Interface ایجاد کرده است. در Access 2003 و نسخههای قبل میتوانستید با Macro غیر-VBA برای Form ساختار منو بسازید. این امکان برای سازگاری عقبرو هنوز وجود دارد، اما آن منو اکنون زیر گزینهٔ Add Ins نمایش داده میشود و باقی Ribbon دستنخورده میماند.
در Access سفارشیسازی Ribbon کمی دشوارتر از Excel و Word است، زیرا Access فایلها را در قالب XML ذخیره نمیکند. Access 2010 از Backstage View در تب File امکان Customize کردن Ribbon را دارد، اما از دید برنامهنویسی بهتر است مستقیماً با Source XML کار کنید.
Ribbon با XML تعریف میشود. چون XML را نمیتوان مستقیماً داخل فایل Access قرار داد، باید System Tableای با نام USysRibbons ایجاد کنید. این Table میتواند تعریف چندین Menu و Ribbon را نگهداری کند تا روی Formها و Reportهای مختلف یا بهعنوان Ribbon پیشفرض Database استفاده شوند.
هنگام بازشدن فایل Access، اگر USysRibbons وجود داشته باشد، Access XML مربوط به Ribbon انتخابشده را میخواند و ساختار سفارشی را اعمال میکند. برای تعیین Ribbon پیشفرض کل Database به File > Options > Current Database بروید و در Ribbon and Toolbar Options از فهرست Ribbon Name یکی از نامهای موجود در USysRibbons را انتخاب کنید.
ساختار سفارشی در Runtime میتواند با VBA تا حدی کنترل شود و همچنین میتوانید از Controlهای از پیش تعریفشدهٔ Ribbon استفاده کنید. این موضوع برای کاربر تازهکار ترسناک به نظر میرسد، اما Microsoft ابزارهایی برای سادهترکردن آن ارائه کرده است. منبع اصلی کتاب به صفحهٔ MSDN و فهرست بیش از ۱۷۰۰ Control ID در Office اشاره میکند.
ایجاد Ribbon سفارشی
ابتدا داخل Database باز، System Tableای با نام USysRibbons بسازید. از Create روی Table Design کلیک کنید و دو Field ایجاد کنید:
RibbonName: نوع Text برای نام Ribbon سفارشی.
RibbonXML: نوع Memo برای XML.
شکل ۱۱-۱ — پنجرهٔ طراحی Table برای USysRibbons
Table را با نام USysRibbons ذخیره کنید؛ Primary Key لازم نیست. چون System Table است در Navigation Pane دیده نمیشود مگر نمایش System Objects را فعال کنید. روی بالای Navigation Pane راستکلیک، Navigation Options را باز و Show System Objects را فعال کنید.
Table را باز کنید و در RibbonName نامی مانند MyRibbon وارد کنید. در RibbonXML کد XML Ribbon قرار میگیرد. نمونهٔ زیر Ribbon را کاملاً حذف میکند؛ File Tab همچنان دیده میشود چون بخشی از Backstage View است، نه Ribbon:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
</ribbon>
</customUI>
URL موجود در Namespace یک URL استاندارد نمونههای Microsoft است. پس از واردکردن تعریف Ribbon، Table و سپس Database را کاملاً ببندید و دوباره باز کنید تا System Table خوانده شود.
یک Blank Form بسازید، آن را در Design View باز کنید، Properties فرم را نمایش دهید و Selection Type را Form قرار دهید. در Property با نام Ribbon Name مقدار MyRibbon را انتخاب کنید. فرم را Save و در Form View باز کنید؛ اکنون فقط File/Backstage دیده میشود. Navigation Pane همچنان وجود دارد و فصل ۲۴ روش حذف آن را توضیح میدهد.
با بستن فرم، Ribbon پیشفرض بازمیگردد. برای تبدیل Ribbon سفارشی به Ribbon پیشفرض برنامه، از Access Options > Current Database > Ribbon and Toolbar Options، مقدار Ribbon Name را انتخاب کنید و Database را ببندید و دوباره باز کنید.
در این روش دو مشکل مهم دیده میشود. نخست اینکه چگونه خطاهای XML را ببینیم. در File > Options > Client Settings و بخش General گزینهٔ Show Add-in User Interface Errors را فعال کنید تا خطاهای XML هنگام Load نمایش داده شوند.
مشکل دوم ویرایش XML طولانی داخل Field جدول است. میتوانید Formای متصل به USysRibbons بسازید و Text Box بزرگی برای RibbonXML قرار دهید. راه بهتر، ابزار Microsoft Office 2007 Custom UI Editor است که کتاب به نسخهٔ قابل دانلود آن اشاره میکند. این ابزار اساساً برای فایلهای XML در Excel/Word ساخته شده، اما میتوانید XML Ribbon Access را در آن طراحی، Validate و Callbackها را تولید کنید و سپس XML را در Field جدول Paste کنید. محدودیتی برای تعداد Ribbonهای سفارشی در USysRibbons وجود ندارد.
استفاده از Custom UI Editor
پس از نصب، برنامهٔ Custom UI Editor for Microsoft Office را اجرا کنید.
شکل ۱۱-۲ — صفحهٔ آغازین Custom UI Editor for Microsoft Office
رابط برنامه ساده است و مزیت مهم آن Error Checking داخلی XML است؛ با آیکن Validate میتوانید XML را بررسی و محل خطاها را ببینید.
Microsoft در این ابزار نمونهٔ Ribbon برای Excel ارائه کرده است. ابتدا یک فایل XML استاندارد Excel 2007/2010 باز کنید و از Insert > Sample XML > Excel – A Custom Tab نمونه را اضافه کنید. هرچند نمونه برای Excel است، در Access نیز با چند تغییر کار میکند و ساختار Ribbon را روشن میسازد.
در نمونه لازم است در پارامتر insertAfterMso مقدار TabHome به TabHomeAccess و GroupFont به GroupFontAccess تغییر کند. XML را در RibbonXML کپی کنید و Database را ببندید و دوباره باز کنید، زیرا تغییرات Table تا Reload شدن Database اعمال نمیشوند.
شکل ۱۱-۳ — صفحهٔ XML برای یک Ribbon سفارشی
وقتی فرم دارای Ribbon Name مربوط را باز کنید، Menu Item تازهای با نام Contoso ظاهر میشود.
شکل ۱۱-۴ — Ribbon سفارشی Contoso
دو Group نخست کپی دقیق Groupهای موجود Ribbon هستند: Clipboard و Font. این بخش نشان میدهد چگونه میتوان Functionality موجود Ribbon را در Ribbon سفارشی دوباره استفاده کرد. Group سوم Custom است و سه Button با نامهای ConBold، ConItalic و ConUnderline دارد. اگر روی آنها کلیک کنید، Access خطایی دربارهٔ نبودن Macro/Callback میدهد، زیرا Procedureهای مشخصشده در onAction هنوز وجود ندارند.
XML نمونه:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="customTab" label="Contoso" insertAfterMso="TabHomeAccess">
<group idMso="GroupClipboard" />
<group idMso="GroupFontAccess" />
<group id="customGroup" label="Contoso Tools">
<button id="customButton1" label="ConBold"
size="large" onAction="conBoldSub" imageMso="Bold" />
<button id="customButton2" label="ConItalic"
size="large" onAction="conItalicSub" imageMso="Italic" />
<button id="customButton3" label="ConUnderline"
size="large" onAction="conUnderlineSub" imageMso="Underline" />
</group>
<group idMso="GroupEnterDataAlignment" />
<group idMso="GroupEnterDataNumber" />
<group idMso="GroupQuickFormatting" />
</tab>
</tabs>
</ribbon>
</customUI>
XML به بزرگی و کوچکی حروف حساس است؛ Case نادرست باعث میشود Ribbon کار نکند. Root با customUI آغاز و داخل آن ribbon و tabs تعریف میشوند. هر tab یک Menu Item، و هر group مجموعهای از Controlها را تعریف میکند. Buttonها نیز ID، Label، Size، Image و Callback دارند. تگهای پایانی محدودهٔ هر Element را میبندند. نویسنده اشاره میکند سه Group پایانی نمونه نامهایی دارند که در Ribbon Model وجود ندارند و بنابراین نادیده گرفته میشوند.
ساخت کد برای Buttonهای سفارشی
Buttonهای Custom تا زمانی که Callbackهای onAction را نسازید فقط خطا تولید میکنند. برای کارکرد Callback، در VBE از Tools > References، Reference مربوط به Microsoft Office 12.0 Object Library را فعال کنید.
Custom UI Editor با گزینهٔ Generate Callbacks Skeleton Code لازم را میسازد. Module جدیدی در همان Database ایجاد کنید و کد تولیدشده را در آن Paste کنید.
شکل ۱۱-۵ — VBA Editor همراه Skeleton Callback Code
حتی Skeleton خالی خطای نبود Callback را برطرف میکند. برای Button نخست میتوانید کد زیر را قرار دهید:
'Callback for customButton1 onAction
Sub conBoldSub(control As IRibbonControl)
Screen.ActiveControl.FontBold = True
End Sub
این کد Control فعال روی Form، یعنی Control دارای Focus، را Bold میکند. با همین مکانیزم میتوان اعمال پیچیدهتری ساخت.
Callback میتواند Return Value نیز برگرداند تا مثلاً Label یک Group بهصورت Programmatic تغییر کند. در XML، تعریف Group را از Label ثابت:
<group id="customGroup" label="Contoso Tools">
به Callback تبدیل کنید:
<group id="customGroup" getLabel="MyLabel">
و در Module بنویسید:
Sub MyLabel(control As IRibbonControl, ReturnValue As Variant)
ReturnValue = "My new title"
End Sub
پارامتر ReturnValue رشتهٔ جدید را به عنوان Group برمیگرداند. محدودیت آن این است که Callback هنگام Load شدن Form فراخوانی میشود؛ بنابراین میتوانید عنوان را مثلاً بر اساس روز هفته تعیین کنید، اما برای تغییر دوباره باید Form Reload شود.
تصاویر Ribbon
کتاب به مجموعهٔ آیکنهای Office در Office2007IconsGallery اشاره میکند. نام Image با پارامتر imageMso تعیین میشود. برای مثال بهجای imageMso="Bold" میتوان از:
imageMso="HappyFace"
استفاده کرد.
استفاده از VBA همراه Ribbon
از دید برنامهنویسی VBA، امکانات Dynamic Ribbon محدودند. با VBA میتوانید بفهمید Control مشخص Enabled یا Visible است یا فشرده شده، Label و Screentip/Supertip آن را بخوانید، Image آن را دریافت کنید یا خود Control را Execute کنید. بعضی تغییرها مانند عنوان Group فقط هنگام Load فایل اعمال میشوند.
Access 2010 بیش از ۱۷۰۰ Ribbon Control دارد و هرکدام نامی دارند. این نام برای شناسایی Control در Collection استفاده میشود. یک مثال ساده:
MsgBox Application.CommandBars.GetEnabledMso("FileSave")
این کد از هر Module قابل اجراست و برای Control با نام FileSave مقدار True برمیگرداند اگر Enabled باشد. نامها Case-sensitive هستند و filesave بهجای FileSave خطا میدهد.
برای یافتن نام Controlها، روی Ribbon راستکلیک و Customize Quick Action Toolbar را انتخاب کنید.
شکل ۱۱-۶ — صفحهٔ Customize Quick Action Toolbar
در Choose Commands From میتوانید فهرست Controlهای Tabها و Groupهای مختلف را ببینید. با نگهداشتن ماوس روی Control، نام آن در انتهای Tooltip داخل پرانتز نمایش داده میشود. فهرست هم Group و هم Control را نشان میدهد؛ Controlها Icon دارند اما Groupها ندارند. استفاده از Methodهای Mso روی نام Group خطا میدهد. برای مثال:
MsgBox Application.CommandBars.GetEnabledMso("GroupFontAccess")
خطا ایجاد میکند، اما جایگزینی FontSize بهعنوان یک Control واقعی درست کار میکند. Controlهای Custom ساختهشده نیز در این فهرست نام عمومی CustomControl دارند و با همین API قابل تفکیک نیستند.
Methodهای مهم برای Controlهای موجود Access:
| Method | کاربرد |
ExecuteMso | Control را همانند کلیک کاربر اجرا میکند. |
GetEnabledMso | Enabled بودن را به صورت True/False برمیگرداند. |
GetImageMso | Image را در متغیر IPictureDisplay برمیگرداند؛ Width و Height نیز لازماند. |
GetLabelMso | Label Control را برمیگرداند. |
GetPressedMso | برای Check Box و Toggle Button، فشردهبودن Control را برمیگرداند. |
GetScreentipMso | رشتهٔ Screentip را برمیگرداند. |
GetSupertipMso | Supertip توضیحیتر را برمیگرداند. |
ReleaseFocus | Focus را از Command Bar Object آزاد میکند. |
GetVisibleMso | Visible بودن Control با ID مشخص را به صورت True/False برمیگرداند. |
پارامترهای Callback نیز برای دریافت عمل کاربر به کار میروند؛ مانند وضعیت Check Box یا متن Edit Box.
ادامهٔ کار با Ribbon — Check Box
در Custom UI Editor، پیش از پایان Tab، Group زیر را به XML اضافه کنید:
<group id="Group1" label="My Control">
<checkBox id="Checkbox1"
label="Checkbox sample"
onAction="MyCheckbox" />
</group>
کل XML اکنون شامل Groupهای قبلی و Group تازهٔ My Control خواهد بود. فقط یک Root با نام customUI میتواند در فایل XML وجود داشته باشد؛ Root دوم خطا ایجاد میکند.
XML را در RibbonXML جدول USysRibbons قرار دهید، Database را ببندید و دوباره Load کنید. Form دارای Ribbon سفارشی را باز و Contoso را انتخاب کنید. در انتهای Ribbon، My Control همراه Check Box دیده میشود.
شکل ۱۱-۷ — صفحهٔ Access با Ribbon Control جدید
برای ساخت Callback از Generate Callbacks استفاده کنید. Check Box پارامتری به نام pressed دارد. Callback را در Module VBA قرار دهید:
Sub MyCheckbox(control As IRibbonControl, pressed As Boolean)
MsgBox pressed
End Sub
با فعالکردن Check Box پیام True و با غیرفعالکردن آن False نمایش داده میشود. در همین Procedure میتوانید منطق واقعی برنامه را اجرا کنید.
Edit Box در Ribbon
برای دریافت ورودی متنی کاربر، Edit Box را به XML اضافه کنید:
<editBox id="Editbox1"
label="Editbox sample"
onChange="MyChange"/>
برای Edit Box رویداد onAction وجود ندارد و از onChange استفاده میشود. Generate Callbacks به تشخیص نام صحیح Event و پارامترهای لازم کمک میکند. اگر بهجای onChange، onAction بنویسید خطا خواهید گرفت.
پس از قرار دادن XML در USysRibbons و Reload کردن Database، Text Box کنار Check Box ظاهر میشود. Callback آن:
Sub MyChange(control As IRibbonControl, text As String)
MsgBox text
End Sub
پارامتر text مقداری را که کاربر تایپ کرده نگه میدارد. با واردکردن متن و فشار ENTER، همان متن در Message Box نمایش داده میشود.
Combo Box سفارشی در Ribbon
برای افزودن Drop-down پیچیدهتر، XML زیر را پس از Edit Box قرار دهید:
<comboBox
id="MyCombo"
label="My Combo"
onChange="OnChange"
getItemCount="GetItemCount"
getItemLabel="GetItemLabel" />
Combo Box علاوه بر onChange به getItemCount و getItemLabel نیاز دارد تا تعداد و Label آیتمها را تعریف کند. پس از Reload، Drop-down دیده میشود اما تا Callbackها ساخته نشوند خالی است.
با Generate Callbacks سه Callback را ایجاد کنید و در بخش Declarations یک Array چهارعنصری بسازید:
Dim ComboArray(3)
سپس کد:
Sub GetItemCount(control As IRibbonControl, ByRef returnedVal)
returnedVal = 4
End Sub
Sub GetItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
ComboArray(0) = "Option1"
ComboArray(1) = "Option2"
ComboArray(2) = "Option3"
ComboArray(3) = "Option4"
returnedVal = ComboArray(index)
End Sub
Sub OnChange(control As IRibbonControl, text As String)
MsgBox text
End Sub
GetItemCount تعداد چهار آیتم را برمیگرداند. GetItemLabel Array را با چهار Label پر و بر اساس Index، Label لازم را تحویل میدهد. OnChange متن انتخابشده را نمایش میدهد.
پس از Save کردن Code باید Database را ببندید و دوباره Load کنید، زیرا GetItemCount و GetItemLabel هنگام Load فایل فراخوانی میشوند. بنابراین فهرست Combo در این روش در همان زمان تعریف میشود و طی کار برنامه بهطور Dynamic قابل تغییر نیست؛ نویسنده این را یک محدودیت میداند.
شکل ۱۱-۸ — Ribbon در Access همراه Drop-down سفارشی
Check Box، Edit Box، Combo Box و Buttonها راههای سادهای برای تعامل Ribbon سفارشی با کاربر و اجرای کد در پاسخ به آن تعامل فراهم میکنند. دستکاری Ribbon در Access 2010 پیچیده است، اما مشاهدهٔ نتیجهٔ نهایی میتواند بسیار رضایتبخش باشد.