مثال زیر چگونگی کنسل کردن چاپ گزارشی را نشان میدهد زمانیکه داده ای وجود ندارد.جعبه پیامی کاربر را آگاه میسازد که چاپی که کنسل شده بود فقط نمایش داده میشود.
The following example shows how to cancel printing a report when it has no data. A message box notifying the user that the printing has been canceled is also displayed.
برای آزمایش این مثال رویه رویداد زیر را به یک گزارش اضافه نمائید.گزارش را زمانیکه حاوی داده ای نیست امتحان بنمائید.
To try this example, add the following event procedure to a report. Try running the report when it contains no data.
Private Sub Report_NoData(Cancel As Integer)
MsgBox "The report has no data." & _chr(13) & "Printing is canceled. " & _chr(13) & "Check the data source for the " & _chr(13) & "the correct criteria (for " & _chr(13) & "report. Make sure you entered " & _chr(13) & "example, a valid range of " & _chr(13) & "dates),." vbOKOnly + vbInformationCancel = TrueEnd Sub
آرگومان Count در رویداد MouseWheel اگر غلطک ماوس به سمت جلو بچرخد یا Roll شود مثبت است و اگر به عقب رول شود عدد Count منفی است
کد زیر تابعی نوشته شده با نام DoMouseWheel که دو آرگومان تعریف کرده یکی گرفتن Form و دیگری lngCount که بین رکوردها جابجا میشود اگر lngCount منفی باشد به رکورد قبلی و اگر مثبت شد به رکورد بعدی میرود با اکشن کامندها.
RunCommand acCmdSaveRecord'Move back a record if Count is negative, otherwise forward.RunCommand IIf(lngCount < 0&, acCmdRecordsGoToPrevious, acCmdRecordsGoToNext)DoMouseWheel = Sgn(lngCount)
[COLOR="Red"][B] End If[/B][/COLOR]
رویداد KeyPress ، تبدیل کاراکتر به Upper Case یا حروف بزرگ :
Private Sub ShipRegion_KeyPress(KeyAscii As Integer)
Dim strCharacter As String
' Convert ANSI value to character string.
strCharacter = Chr(KeyAscii)
' Convert character to upper case, then to ANSI value.
KeyAscii = Asc(UCase(strCharacter))
End Sub
KeyAscii For ArrowKeys :
Left: 20
Down: 18
Right: 19
Up: 17
: TabControl.KeyDown
در رویداد KeyDown تب کنترل میخواهید جابجاشدن در تب ها را با کد انجام دهید هرچند کلید میانبر Ctrl+Tab یا PageDown و PageUp هم این کار را انجام میدهد و احتیاجی به نوشتن کدهای زیر نیست
فرضا با استفاده از کلید ترکیبی Ctrl و Arrow Right یا Arrow Lefr
If (Shift And acCtrlMask) > 0 Then
Select Case KeyCode
Case vbKeyRight
KeyCode =0اگر تب کنترل با نام TabCtl0 ساخته باشید ( می توانید از پراپرتی شیت کنترل در نمای دیزاین Name را تغییر دهید).
اول گرفتن تعداد کل تب پیج های تب کنترل مشخص شده.
TabMax=Tabctl0.Pages.Count
دوم متغیری تعریف می کنید که Value تب کنترل که فوکس گرفته را باضافه یک کند یعنی فرضا اگر روی تب 3 باشید به تب 4 سلکت شود ( Value کار انتخاب تب را انجام میدهد ) .
TabConut=TabCtl0+1
برای سلکت یا انتخاب تب پیج می نویسید
TabCtl0=TabCount
عدد صحیح فقط !!! پیج ایندکس تب اول را ملاحظه کنید از صفر شروع شده ( برای لوپ زدن در تب پیج های باید بگوئید از صفر تا Pages.Count منهای یک )
حال تصور کنید فوکس روی تب اول با ایندکس صفر است شما کلید ترکیبی Ctrl و فلش سمت راست را می فشرید شروع به پیمایش میکند رو به جلو ( چون Value +1 میشود ) و به متغیر TabCount نیز اضافه میشود فرض کنید آخرین عدد پیج ایندکس یا Value برای این کنترل 6 باشد ، وقتی Value را برابر 7 قرار میدهد ( TabConut=TabCtl0+1 ) اروری به شما داده میشود چرا چون ماکزیمم Value در تب 6 است پس برای فرار از این خطا می بایست بگوئید تا زمانی پیش برود که TabCount بزرگتر از TabMax باشد.
در کد زیر اگر TabCount بزرگتر از آخرین Value تب شد Reset یا صفر میشود و به اولین تب پرش میکند و از صفر شروع میکند و هر زمان به آخرین تب رسید و دوباره فلش راست را فشردید به تب اول میرود و ......
If TabCount > TabMax Then
TabCount = 0
End If
TabCtl0 =TabCount
در Case VbKeyLeft باید بدین شکل تصور کنید که اگر Value کوچکتر از صفر شدمقدار TabCount به TabMax تغییر کند و در نتیجه بعد از انتخاب تب صفر زمان فشردن دوباره فلش چپ تب آخر را انتخاب میکند
در VbKeyRight شما Value را باضافه یک میکردید که انتخاب رو به جلو باشد در VbKeyLeft شما منهای یک میکنید تا رو به عقب تب انتخاب شود.
TabConut=TabCtl0-1
اگر بخواهید زمان رسیدن به انتخاب تب آخر همچنان با فشردن کنترل و فلش راست ، تب صفر را انتخاب نکند می توانید بگوئید TabCount=TabMax شود و در VbKeyLeft مقدار متغیر TabCount=0 شود.
ولی همانطور که گفته شد کلیدهای میانبر همین کار را انجام می دهند.
تنها کمی فکر کافیست !!!
"Orange " & """" & " Pear"
You will get the following result:
Orange " Pear
ایجاد 5 Label در فرم :
Private click1 As New ClickLabel
Private click2 As New ClickLabel
Private click3 As New ClickLabel
Private click4 As New ClickLabel
Private click5 As New ClickLabel
Private Sub Form_Load()
Set click1.ClickLabel = Me.Label0
Set click2.ClickLabel = Me.Label1
Set click3.ClickLabel = Me.Label2
Set click4.ClickLabel = Me.Label3
Set click5.ClickLabel = Me.Label4
End Sub
کلاس ماژول به نام ClickLabel
Private withEvents mlabel as Access.Label
Public Property Get ClickLabel() As Access.LabelSet ClickLabel = mLabel End Property Public Property Set ClickLabel(ByVal lblClickLabel As Access.Label) Set mLabel = lblClickLabel mLabel.OnClick = "[Event Procedure]" mLabel.OnMouseUp = "[Event Procedure]" End Property Private Sub mLabel_Click() 'run code here MsgBox "You clicked label " & mLabel.Name If mLabel.ForeColor = vbRed Then mLabel.ForeColor = vbGreen Else mLabel.ForeColor = vbRed End If End Sub Private Sub mLabel_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) MsgBox "You moused up from " & mLabel.Name & "It is associated with record" & mRecordID End Sub
عملکردش چییست؟ بعد از ایجاد 5 لیبل در فرم زمانیکه روی لیبل کلیک کنید پیغامی حاوی نام لیبل را به شما نمایش داده و رنگ آن تغییر میکند البته mRecordID در کدهای بالا اعمال نشده که می توان آنرا هم ساخت و برای هر لیبل ID ساخت.
Set click5.ClickLabel = Me.Label4
click5.RecordID = 5
RecordID = mRecordID
you can only use a Property Let procedure on the left side of a property assignment expression or Let statement.
Private mstrPropertyName As StringProperty Get PropertyName() As StringPropertyName = mstrPropertyNameEnd Property' You would use Let because String is a value data typeProperty Let PropertyName(rData As String)mstrPropertyName = rDataEnd Property
IMPORTANT :
The Set statement is used to make a reference of an object to an object variable. You don't have to use the Set keyword, if you are dealing with primitive and native built-in types such as integer, double, string and so on.
The syntax of Property Set is parallel to the Property Let procedure. The only difference is that the argument is an object data type, and the VBA Set keyword is used for the assignment within the body of the Property Set. The following is an example of hypothetical Property Set procedure that accepts a recordset object and assigns it to a private variable named m_ Products:
PROPERTY SET همراستای PROPERTY LET است و تنها فرقی که دارد این است که دیتا تایپ آرگومان OBJECT است.
Public Property Set Products(Value As ADO.Recordset) If Not Value Is Nothing Then Set m_Products = Value End If End Property
تبدیل Private به Public و تامام
انتقال باتن ها به موقعیت جدید و رو به پائین در فرم
تصور کنید سه کامند باتن ساخته و زیر هم قرار داده اید و بعنوان Menu از آن استفاده می نمائید.
پراپرتی Name باتن ها را به M0 تا M2 تغییر داده اید.
حال در ذهن تصور کنید زمان کلیک کردن روی اولین باتن بنام M0 ، زیر آن به اندازه 3 برابر ارتفاع این باتن به سمت پائین انتقال یابد و بالطبع می بایست پراپرتی Top باتن های M1 و M2 نیز تغییر یابند.
زمان کلیک روی باتن M1 می بایست فاصله ایجاد شده Clear شده و زیر این باتن به اندازه ی 5 برابر ارتفاعش فاصله ایجاد کند بالطبع در موقعیت پراپرتی Top باتن M2 نیز تاثیر گذاراست.
زمان کلیک کردن روی باتن M2 می بایست فاصله ایجاد شده Clear شده و زیر این باتن به اندازه یک برابر ارتفاعش فاصله ایجاد کند و بالطبع چون زیر آن باتنی نیست پس پراپرتی Top هم بی اثر است.
در ضمن چنانچه روی باتن M2 کلیک کرده اید که فاصله ایجادشده زمان کلیک کردن دوباره یا کلیک کردن روی باتن دیگر فاصله Clear شده و در صورت کلیک روی باتن دیگر فاصله ی مربوطه ایجاد شود.
برای Clear یا برگشت باتن ها به همان موقعیت اولیه می بایست در رویداد لود فرمی که باتن ها قرار دارند پراپرتی Top آن ها را در متغیرهایی ذخیره کرد.
زمان کلیک روی M0
M1.Top=M1.Top+3xM1.Heigth
M2.Top=M1.Top+M1.Heigth
زمان کلیک روی M1 ( پاک کردن فاصله ایجاد شده یا به موقعیت اولیه برگرداندن باتن ها )
M0.Top=که چون بالاتر است تغییری ندارد
M1.Top=PrimaryValue ( Store in variable )
یا
پراپرتی Top کنترل M1 باید بشود Top کنترل M0 باضافه یک ارتفاع کنترل M0 و خب باتن ها در اینجا ارتفاعشان یکیست اگر ارتفاع فرق کند کدهای بیشتری احتیاج است
M1.Top=M0.Top+1×M0.Heigth
Top کنترل M0 که تغییری نمیکند چون در بالاترین موقعیت قرار دارد . TOP کنترل M2 یا سومین باتن میشود TOP خود باتن باضافه 5 برابر ارتفاع کنترل .( 5 چیست ؟ در بالاتر گفته شد )
M2.Top=M2.Top+5×M2.Heigth
در صورتیکه ارتفاع کنترل کامند باتن ها یکی باشد شما احتیاجی به کد نویسی بیشتری ندارید و از Top همان کنترل اول و Heigth هر کنترلی که در آن هستید می توانید برای مقاصد خود استفاده بنمائید.
حال اگر روی M1 کلیک کردید و فاصله زیر آن ایجاد شد و دوباره روی همان M1 کلیک کردید می بایست فاصله حذف ( البته تغییر موقعیت باتن های بعدی باید از آن یاد کرد ) و کل باتن ها در موقعیت اولیه خودشان قرار بگیرند یعنی همان پراپرتی Top خودشان را که از قبل داشتند. حال چه کاری باید انجام داد؟؟؟؟
چون اگر دوباره روی همان باتن M1 کلیک کنید موقعیت M2 تغییر خواهد کرد و به همان موقعیتی که در اولین کلیک رفته ، شروع اضافه شدن به پراپرتی TOP خواهد بود یعنی با هر بار کلیک روی باتن M1 باتن M2 به پائین و پائین تر حرکت میکند و این خواسته ی ما چی ؟ نیست.
دقیقا تمام فرآیندهایی که تصور کردم را به همین نحو که گفته شد اجرا کنید تا به پراپرتی ها و عملکردشون مسلط شوید و بدون داشتن سیستم کد درستی را تولید کنید مگر اینکه اشتباه SYNTAX یا نوشتاری یا غلط املائی داشته باشید.
در فرآنید یاد شده در این یادداشت فاصله باتن ها نسبت به هم صفر است اگر بین باتن ها فاصله گذاشته باشید باید آنرا هم در نظر بگیرید ( PADDING ) و به کدتون اضافه کنید.
برای کد نویسی قبل از اینکه از رویدار OnClick هر باتن استفاده کنید باید رویه ی پایلیکی بنویسید که در باتن های 0 تا 2 ( M0 TO M2 ) لوپ بزند و پراپرتی TOP باتن های بعد از باتن فشرده شده را به جلو براند و باتن های قبل از آن به موقعیت قبلی خود بازگردند.
فرض کنید باتن M1 را فشردید اول عدد آن را استخراج می کنید و در متغیری ذخیره می کند فرضا میشود X=1
در تصویر پائین از تابع IIF استفاده شده تا اگر عددی از عدد دیگر بزرگترشد خروجی آن چه خواهدبود فرضا اگر 0<0 باشد N را برمیگرداند و اگر 0<1 باشد که TRUE است Y را.
با تابع REPLACE کاراکترهای بعد ازM را استخراج کردیم یعنی 0 یا 1
می توان تابعی با نام HandleBtnClk نوشت و در آن لوپی ایجادکرد و تصویر اول را در نظر بگیرید
فرض کنید سه باتن با نام های M0 M1 M2 دارید باتن M1 را PRESS می کنید انتظار آن است که M0 و M1 ثابت و در موقعیت خود بمانند و باتن M2 به اندازه پراپرتی TOP خودش و 5 برابر ارتفاع باتن M0 ( در اینجا فرض شده ارتفاع باتن ها یکیست و PADDING همه صفر است و دقیقا باتن به همدیگر چسبیده اند ) به پائین و TOP جدید منتقل شود.
آرایه ای به نام (2) BTN تعریف شده که مقادیر 3 ، 5 و 1 را برای ضرب در ارتفاع یک باتن در خود ذخیره میکند فرضا اگر باتن M1 فشرده شد عدد 5 برگردانده شود و در M0.HEIGTH ضرب شود.
For i=0 To 2
Me("M" & i).Top= Me0.Top+M0.Heigth × iif(i>x,btn(x)+i,i)
Next
در لوپ بالا چنانچه M1 فشرده شود با توجه به تابع IIF در تصویر داریم
x=1, BTN(1)=5
i>x .... 0>1 .... i=0
M0.TOP=M0.TOP+M0.HEIGTH × 0
i>x.....1>1 ....i=1
M1.TOP=M0.TOP+M0.HEIGTH × 1
i>x.....2>1....BTN(1)=5
عدد i را به() BTN اضافه کردیم چون مبدا را از M0.TOP گرفتیم
M2.TOP=M0.TOP+M0.HEIGTH×7
اگر روی باتن M0 کلیک کنید x برابر 0 با تابع Replace ( البته این تابع را باید در تابع Val بگذارید تا عدد برگرداند ) و (0)BTN برابر 3 میشود ( عدد 3 منظور بین باتن M0 و M1 سه تا باتن فاصله بیافتد ، افتااااااد !!! )
i>x .... 0>0 .... i=0
M0.TOP=M0.TOP+M0.HEIGTH × 0
i>x.....1>0 ....BTN(0)=3
عدد i را به() BTN اضافه کردیم چون مبدا را از M0.TOP گرفتیم
M1.TOP=M0.TOP+M0.HEIGTH × (3+1)
i>x.....2>0....BTN(0)=3
M2.TOP=M0.TOP+M0.HEIGTH×(3+2)
فقط مشکل اینجاست که اگر شما برای بار دوم و چندم روی باتن کلیک کنید چون TOP آنها در هر بار کلیک تغییر میکند بقیه باتن ها رو به پائین و پائین تر حرکت یا انتقال داده خواهند شد
اینجاست که می توانید متغیری تعریف کنید که پراپرتی TAG باتن را به یک تغییر دهد و چک کند چنانچه یک بودBTN(x)+i عمل نکند آیا امکانپذیر خواهد بود؟ این یک طرح است و می توان متغیری به نام CLICKED از نوع BOOLEAN حتی تعریف کرد.
Me("M" & x).Tag=1,btn(x)+i,i)
Me("M" & i).Tag=iif(i=x And Me("M" & x).Tag=0,1,0)
Next
AND بین دو مقایسه فقط در صورتیکه دوطرف TRUE باشد TRUE است در غیر اینصورت جواب FALSE است می توانید با زدن CTRL+G و رفتن به پنجره IMMIDIATE WINDOW امتحان نمائید.
فرض کنیم TAG تمام باتن ها صفر است و برای اولین بار روی باتن M1 کلیک کرده ایم.
Me("M" & x).Tag=1,btn(x)+i,i)
Me("M" & i).Tag=iif(i=x And Me("M" & x).Tag=0,1,0)
i=0 , x=1 , M1.TAG=0
i>x , 0>1=FALSE AND M1.TAG=1 =FALSE ANS=FALSE i=0
M0.TOP=M0.TOP+M0.HEIGTH × 0
i=x , 0=1=FALSE AND M1.TAG=0=TRUE ANS=FALSE
M0.TAG=0
-----------------------------------------
i=1 , x=1 , M1.TAG=0
i>x , 1>1=FALSE AND M1.TAG=1=FALSE ANS=FALSE i=0
M1.TOP=M0.TOP+M0.HEIGHT × 1
i=x , 1=1=TRUE AND M1.TAG=0=TRUE ANS=TRUE
M1.TAG=1
----------------------------------------
i=2 , x=1 , M1.TAG=1
i>x , 2>1=TRUE AND M1.TAG=1=TRUE ANS=TRUR BTN(x)=5
M2.TOP=M0.TOP+M0.HEIGHT × (5+2)
i=x , 2=1=FALSE AND M1.TAG=0=FALSE ANS=FALSE
M2.TAG=0
-----------------------------------------
اگر دوباره روی M1 کلیک کنیم چه اتفاقی خواهد افتاد.
داریم
M1.TAG=1
i=0 , x=1 , M1.TAG=1
i>x , 0>1=FALSE AND M1.TAG=1=TRUE ANS=FALSE i=0
M0.TOP=M0.TOP+M0.HEIGHT × 0
i=x , 0=1=FALSE AND M1.TAG=0=FALSE ANS=FALSE
M0.TAG=0
---------------------------------------------
i=1 , x=1 , M1.TAG=1
i>x , 1>1=FALSE AND M1.TAG=1=TRUE ANS=FALSE i=1
M1.TOP=M0.TOP+M0.HEIGHT × 1
i=x , 1=1=TRUE AND M1.TAG=0=FALSE ANS=FALSE
M1.TAG=0
---------------------------------------------
i=2 , x=1 , M1.TAG=0
i>x , 2>1=TRUE AND M1.TAG=1=FALSE ANS=FALSE i=2
M0.TOP=M0.TOP+M0.HEIGHT × 2
i=x , 2=1=FALSE AND M1.TAG=0=TRUE ANS=FALSE
M2.TAG=0
خب طبق تصویری که در ذهن کشیده شد همراه با عملکرد توابع و عملگرهای منطقی بعد از کلیک کردن بار دوم روی باتن M1 پراپرتی TAG تمام کنترل ها به صفر تغییر پیدا نمود.
حال فرض بر این است که اگر یکبار روی باتن M1 کلیک شد و M2 به موقعیت چند برابر HEIGTH کنترل M0 لانچ یا پرتاب شد چنانچه این بار روی باتن M0 کلیک شد چه اتفاقی خواهد افتاد.
در این فرض معلومات تصویر ذهنی ما چنین خواهد بود.
M0.TAG=0
M1.TAG=1
M2.TAG=0
لوپ را ران می کنیم
i=0 , x=0 , M0.TAG=0
i>x , 0>0=FALSE AND M0.TAG=1=FALSE ANS=FALSE i=0
M0.TOP=M0.TOP+M0.HEIGTH × 0
i=x , 0=0=TRUE AND M0.TAG=0=TRUE ANS=TRUE
M0.TAG=1
--------------------------------------------
i=1 , x=0 , M0.TAG=1
i>x , 1>0=TRUE AND M0.TAG=1=TRUE ANS=TRUE BTN(x)=3
M1.TOP=M0.TOP+M0.HEIGTH × (3+1)
i=x , 1=0=FALSE AND M0.TAG=0=FALSE ANS=FALSE
M1.TAG=0
------------------------------------------
i=2 , x=0 , M0.TAG=1
i>x , 2>0=TRUE AND M0.TAG=1=TRUE ANS=TRUE BTN(x)=3
M2.TOP=M0.TOP+M0.HEIGTH × (3+2)
i=x , 2=0=FALSE AND M0.TAG=0=FALSE ANS=FALSE
M2.TAG=0
-------------------------------------------
تابع نوشته شده بالا را میتوان در رویداد کلیک باتن ها گذاشت و از این بازی شیرین که پرتاب باتن های بعدی است ، لذت برد .
expression.Move (Left, Top, Width, Height)
آرگومان LEFT در این متد لازم و ضروری است .
نام ، آرگومان ها و کدی که بدنه یک رویه پراپرتی را تشکیل میدهد ، اعلام می کند که یک مرجع را به یک شئ تنظیم می کند.
نوشتار عبارت Property Set قسمت هایی را دارد :
Optional : انتخابی است ، نشان میدهد که آرگومان می تواند یا نمی تواند توسط
Caller تامین شود.
Public : انتخابی است ، نشان میدهد که رویه Property Set قابل دسترسی است به تمام دیگر رویه ها در تمام ماژول ها (Modules) . اگر در ماژولی که حاوی عبارت Option Private است بکار برده شود رویه در خارج از پروژه ( Project ) موجود نیست.
Private : انتخابی است ، نشان میدهد که رویه Property Set قابل دسترسی است فقط به سایر رویه ها در ماژولی که اعلام می گردد یا بیان میشود.
Static : انتخابی است ، نشان میدهد که متغیرهای لوکال رویه Property Set بین Call ها رزرو شده اند . Static atteibute روی متغیرهایی که خارج از رویه Property Set اعلام سا اظهار شده تاثیری ندارد ، حتی اگر آنها در رویه بکار برده شوند.
Name : اجباریاست و انتخابی نیست !!! نام رویه Property Set
arglist : اجباریست ، لیست متغیرهای رزرو شده که پاس داده میشوند به رویه Property Set وقتی Call یا فراخوانی میشود.آرگومان های چندتایی با کاما جدا می شوند
نوشتاری و قسمت های arglist :
[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]
OPTIONAL : مشخص میکند که آرگومان اجباری نیست اگر استفاده شود تمام آرگومان های بعدی هم باید با OPTIONAL ذکر شوند.
BYVAL : اختیاریست ، نشان میدهد که آرگومان VALUE یا عددی است
BYREF : اختیاریست ، نشان میدهد که آرگومان توسط یک رفرنس PASS داده میشود و BYREF در ویژوال بیسیک DEFAULT است یعنی شما استفاده نکنید BYREF در نظر میگیرد.
PARRAMARRAY : اختیاریست ، بعنوان آخرین آرگومان در ARGLIST استفاده میشود و نشان میدهد که آرگومان نهایی یک آرایه انتخابی از اجزاء VARIANT است کلمه PARAMARRAY به شما این اجازه را میدهد که یک شماره اختیاری از آرگومان ها را فراهم کنید و نمی تواند با BYVAL ، BYREF یا OPTIONAL بکار رود.
VARNAME : اجباریست و نام متغیراست
TYPE : انتخابیست ، DATA TYPE است که بین رویه ها استفاده میشود مثل BYTE BOOLEAN SINGLE DOUBLE STRING
یادداشت :
هر عبارت PROPERTY SET بایستی با یک آرگومان مشخص شود
یک parameter array می تواند برای عبور یا پاس دادن آرایه ای از آرگومان ها استفاد شود . شما نباید تعداد اجزاء در آرایه را بدانید زمانیکه رویه را تعیین می کنید
استفاد کلمه ParamArray برای مشخص کردن کردن یک parameter array . آرایه می بایست بعنوان آرایه ای از دیتا تایپ Variant اعلام شود , و می بایست در آخرین آرگومان در رویه مشخص گردد.
مثال زیر نمایش میدهد که چگونه یک رویه با parameter array تعیین می گردد .
Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)
Dim intI As Integer
Debug.Print strName; " Scores"
' Use UBound function to determine upper limit of array. For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub
ومثال زیر هم مشخص میکند که چطور رویه را call یا فراخوانی بنمائید.
AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16
AnyNumberArgs "Kelly", "High", "Low", "Average", "High"
کلمه ParamArray اجازه میدهد به شما که تعداد داینامیک یا پو یایی از آرگومانها را قبول یا پذیرش کنید
کلمه ParamArray اختصار parameter array است
بجای بکارگیری تعدادزیادی از پارامترهای انتخابی استفاده از parameter array می تواند کمک خوبی باشد.
می تواند در انتهای یک رویه یا تابع استفاده شود.
با ByValue و ByRef نمی تواند همراه باشد!
باید با دیتا تایپ Variant اعلام و اظهار گردد
پایه آن Zero است یعنی از صفر شروع میشود intl در مثال بالا
Parameter array می تواند حاوی دیتا تایپ های مختلفی باشد
array of array
Public Sub Procedure_Five(ByVal iConstant As Integer, _ParamArray aArgumentsArray() As Variant)Dim icount As IntegerDim vArg As VariantFor icount = 0 To UBound(aArgumentsArray(0))vArg = aArgumentsArray(0)(icount)Debug.Print vArgNext icountEnd SubPublic Sub RunThis_Five()Call Procedure_Five(100, Array("one","two"))End Sub
Public Function MySUM(ParamArray args()) For Each arg In args MySUM = MySUM + arg Next arg End Function
در کد زیر از paramarray استفاده شده اگر پارامترهای داخل آن Null نباشد جواب یا برگشتی تابع خواهد بود
Public Property Get NewEmployee() As Variant
NewEmployee = employee
End Property
Public Property Set NewEmployee(ByVal vNewValue As Employee)
employee = vNewValue
End Property
Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3
' Returns the current color of the pen as a string.
Property Get PenColor() As String
Select Case CurrentColor
Case RED
PenColor = "Red"
Case GREEN
PenColor = "Green"
Case BLUE
PenColor = "Blue"
End Select
End Property
' The following code gets the color of the pen
' calling the Property Get procedure.
ColorName = PenColor
کلاسی با نام AppForm ایجاد شده برای اینکه یکسری خاصیت ها در فرم تنظیم شود
when the user goes to a new control it will run the code and dropdown if it's a combo box
کمبو باکس سه قسمت دارد تکست باکس لیست باکس و دراپ داون
زمانیکه کاربر به کنترل جدیدی میرود کد کار خواهد کرد و اگر کمبو باکس باشد DropDown میشود ( البته طبق گفته ی بالا در کنترل ها لوپ زده و گفته اگر ControlType کنترل acComboBox باشه DropDown انجام شود ) که در رویداد GotFocus هر کنترلی که کمبو باکس است می توانید به یک رویه کلی در همون آبجکت فرم ارجاع دهید.
Sub ControlName_GotFocus
Screen.PreviousControl.Name
در کد زیر اگر کنترل تکست باکس یا کمبو باکس باشد و کنترل سورس آن خالی نباشد پراپرتی به False تنظیم میشود ( منظور پراپرتی Dirty ) ترتیب هم نزولی میشود.
زمانیکه رکوردی ذخیره میشود مایکروسافت اکسس پراپرتی Dirty را به False تنظیم میکند.زمانیکه کاربری تغییراتی را به رکوردی ایجاد میکند پراپرتی به True تنظیم می شود.
در رویه زیر در رویداد Current فرم نوشته شده ، کنترل هایی که در خاصیت یا پراپرتی Tag آنها حرف R قید شده باشد روئت نشوند
البته این کار فقط در نمای دیزاین امکانپذیر است یعنی باز کردن فرم در این نما اگر فایل به accde تبدیل شود چون به دیزاین دسترسی نیست عملیات انجام نخواهدشد !!!
در فرمی یک باتن تعبیه و کدهای زیر در آن نوشته شده قبلش یکسری Variable ها مثل frm باید تعریف شود سپس این کد فرمی بنام form2 را باز کرده و باتنی به تب با نام Page4 اضافه میکند البته فرم 2 را باید با OpenForm در نمای دیزاین باز نمائید.
در FORM2 یک TAB CONTROL قرار داده و نام یکی از تب ها را PAGE4
Private Sub Detail1_Print(Cancel As Integer, PrintCount As Integer)
Dim lngMaxHeight As Long
Dim i As Integer
lngMaxHeight = Me.Itm0.Height
For i = 1 To 3
If lngaMaxHeight < Me.Itm0.Height + Me("rptPREE" & i).Height Then
lngMaxHeight = Me.Itm0.Height + Me("rptPREE" & i).Height
End If
Next
Me.Line (Me.Width, 0)-(Me.Width, lngMaxHeight)
For i = 0 To 24
Me.Line (Me("Itm" & i).Left, 0)-(Me("Itm" & i).Left, lngMaxHeight)
Next
End Sub
Me.Line (Me("Itm" & i).Left, 0)-Step(10.5*1440, lngMaxHeight)
این پراپرتی فقط در قسمت هایی از فرم کاربرد دارد و عمل میکند
دیتیل ، هدر و فوتر و اثرش روی تمام کنترل های روی فرم غیر از Page Break است
.DisplayWhen=0
0 نمایش در حالت فرم ویو و زمانیکه پرینت میشود که دیفالت است.
1 در حالت فرم ویو پنهان است و فقط زمان چاپ مشاهده میشود.
2 در حالت فرم ویو نمایان شده ولی در چاپ مشاهده نمیشود.
کد زیر که از فروم خارجی سال 2008 استخراج شده را تست و کاربردش در نظرات را قید نمائید ( فقط ورود اعداد در تکست باکس مجاز باشد ... Input Mask را تنظیم نمائید )
Private Sub Text1_Change()
Text1 = Format(Text1, "#,###")Text1.SelStart = Len(Text1.Text)End Sub
فرمت های مرسوم برای تایپ Number و Currency
که می تواند یک تا چهار Section داشته باشد و با سمی کالن از هم جدا میشوند. هر قسمت شامل فرمت خاص برای نوعی از عدد است.
قسمت اول برای اعداد مثبت
قسمت دوم برای اعداد منفی
قسمت سوم برای مقادیر صفر
قسمت چهارم برای مقادیر Null
استفاده از سنبل های زیر برای هر نوع داده در Custom Formats :
Space : فضاهای خالی را بعنوان کارکتر واقعی نشان میدهد
"ABC" : نمایش داخل کوتیشن
! : چپ چین کردن
* : پر کردن فضای موجود با کاراکتر بعدی
\ : نمایش کاراکتر بعدی بعنوان کاراکتر واقعی .شما می توانید همچنین کاراکترهای واقعی را با قراردادن علائم کوتیشن اطراف آنها مشاهده نمائید.
[ Color ] : دیتای فرمت شده را رنگی نمایش میدهد ، رنگ بین براکت باشد!!! رنگ های موجود
Black , Blue , Green , Cyan , Red , Magneta , Yellow , White
تابع زیر در رویداد LostFocus تکست باکس Unbound به نام TaxRefund در صورتیکه مقداربعداز خروج از تکست باکس که ذخیره میشود عددی باشد ( با تابع IsNumeric چک می کند ) با فرمت Currency و اگر نباشد با فرمت Capital یا حروف بزرگ نمایش میدهد.( علامت بزرگتر)
Function FormatValue() As Integer
Dim varEnteredValue As Variant
varEnteredValue = Forms!Survey!TaxRefund.Value
If IsNumeric(varEnteredValue) = True Then
Forms!Survey!TaxRefund.Format = "Currency"
Else
Forms!Survey!TaxRefund.Format = ">"
End If
End Function
\ : مانند محصور کردن کاراکتر با علامت دابل کوتیشن است
< : تمام تکست UpperCase میشود ( حروف بزرگ )
> : تمام تکست LowerCase میشود ( حروف کوچک )
Custom Formats برای فیلدهای نوع تکست می تواند تا دو سکشن داشته باشد.هر سکشن حاوی فرمت خاصی برای داده متفاوت در یک فیلد می باشد.( دو سکشن با سمی کالن از هم جدا میشوند )
سکشن اول برای فیلدهای حاوی تکست
سکشن دوم برای فیلدهایی با رشته های Zero-Length و Null Values ( نمایش تکست مورد نظر در صورتیکه فیلد دارای طول صفر باشد یا Null )
For example, if you have a text boxcontrol in which you want the word "None" to appear when there is no string in the field, you could type the custom format @;"None" as the control's Format propert setting. The @ symbol in the first section causes the text from the field to be displayed and the second section causes the word "None" to appear when there is a zero-length string or Null value in the field.
پراپرتی ControlSource یا به فیلدی از جدول یا کوئری باند میشود یا حاوی عبارتی است که در کنترل تکست باکس تایپ می نمائید ولی چنانچه Expression باشد دیتا ذخیره نمیشود مگر اینکه کنترل سورس به فیلدی از جدول یا کوئری متصل باشد که در صورت تغییر و از دست دادن فوکس دیتای جدید جایگزین خواهد شد.
برای Reports این پراپرتی فقط در Group Level یا گروه بندی کاربرد دارد
فرم و گزارشات بعنوان یک پنجره در دیتا بیس عمل می کنند.منبع اولیه داده برای یک فرم یا گزارش توسط پراپرتی RecordSource خودش به جدول یا کوئری یا عبارت SQL تنظیم و سپس پراپرتی کنترل سورس به یک فیلد یا عبارتی تنظیم میشود.
اگر پراپرتی ControlSource به عبارتی تنظیم شود مقدارنمایش داده شده فقط خواندنیست یا Read-Only و در دیتابیس ذخیره نمیشود.
کد زیر زمانی استفاده میشود که شما بخواهید با حلقه ای کاراکترهای متنتون را تک به تک به تکست های دیگری که ساخته اید ببرید .
فرضا عبارت ABC1233D در تکست باکسی با نام Text1 تایپ میشود این عبارت حاوی چند کاراکتر است ؟ .... 8 کاراکتر !!!
me("C" & i).controlSource=Mid(Me.Text1,i,1)
فرضا 11 کنترل تکست باکس ایجاد یا Create می کنید و پراپرتی Name آنرا به C1 تا C11 تغییر می دهید.
Me منظور فرمیست که در آن کار می کنید
در کد زیر توسط تابع Mid کاراکترها یک به یک در تابع Asc قرار داده شده ، چنانچه جواب تابع Asc غیر کد های اسکی 48 تا 57 ( کد اسکی اعداد ) باشد در NumericString ذخیره میشود .
کدی که از فروم های خارجی استخراج شده
Function NumericString(strInput As String) As String 'Returns a string containing only the numeric characters of the input string Dim i As Integer Dim intAsc As Integer NumericString = "" i = 1 While i <= Len(strInput) intAsc = Asc(Mid(strInput, i, 1)) If (intAsc >= 48 And intAsc <= 57) Then 'character is Numeric NumericString = NumericString + Mid(strInput, i, 1) End If i = i + 1 Wend End Function
=NumericString("ABH234D") will return "ABHD"ASCII control characters non printable :
ASCII code 00 = NULL ( Null character )ASCII code 01 = SOH ( Start of Header )
ASCII code 02 = STX ( Start of Text )
ASCII code 08 = BS ( Backspace )
ASCII code 27 = ESC ( Escape )
ASCII code 28 = FS ( File separator )
ASCII code 127 = DEL ( Delete )
تنظیم خاصیت Cycle فرم به Current Record
چون Enter هم تاثیر دارد می توانید در تنظیمات خود اکسس Next Field را انتخاب کنید ( Move After Enter قسمت Client Setting ) در هر صورت کلید هایی هم وجود دارد که می توانند به رکورد بعد پرش کنند و رفتن به رکورد بعد یعنی ذخیره رکوردی که در آن بودید
تصویر زیر هم زمانیکه نمی خواهیم پیغام های اکشن کوئری ها و حذف یا تغییر دریافت کنید استفاده میشود با برداشتن تیک ها ... Client Setting و قسمت Confirm
پراپرتی Cycle در فرم فقط رفتار کلید Tab در فرم را کنترل می کند.اگر سابفرم در Tab Order باشه بعد از اینکه این کنترل فوکس دریافت می کندتنظیم این پراپرتی برای سابفرم تعیین می کند زمان فشردن کلید Tab چه اتفاقی می افتد!!!
برای انتقال فوکس به خارج سابفرم کلید ترکیبی Ctrl+Tab را بفشارید
زمانیکه Cycle را به CurrentRecord یا عدد یک تنظیم می کنیم رفتار Tab Key اینطور نوشته شده که بعد از آخرین کنترل فوکس به اولین کنترل در Tab Order می رود.ولی باز هم کلیدهایی وجود دارد که می تواند شما را به رکورد بعدی ببرد ... فوکس در Toggle Button به خودش میرود نه اجزا داخلیش
TextBox.TabStop
برای مشخص شدن جابجایی فوکس به یک کنترل استفاده میشود
و از نوع Boolean است ، Yes Or No
اگر به No تنظیم شود یا 0 باشد انتقال فوکس به کنترل با فشردن کلید Tab میسر نخواهدشد.
زمان ساختن کنترلی در فرم مایکروسافت اکسس بصورت خودکار موقعیتی را در Tab Order فرم اختصاص میدهد.هر کنترل جدید در آخر آن قرار می گیرد.اگر بخواهید از در دسترس بودن یک کنترل در فرم جلوگیری کنید خاصیت TabStop کنترل را به No تنظیم نمائید.یعنی کلید Tab در آن کار نمی کند.
در حالت Form View کنترل های غیر فعال و یا پنهان شده در Tab Order باقی می مانند اما زمان جابجایی در کنترل ها با فشردن کلید Tab از آن پرش می کند حتی اگر پراپرتی TabStop آن Yes شده باشد.
تا زمانیکه پراپرتی Enabled کنترل به Yes تنظیم شده می توان با کلیک یا استفاده از کلیدهای دسترسی روی آن انتخاب شود ، صرفنظر از تنظیم پراپرتی TabStop آن . بطور مثال شما می توانید پراپرتی کامند باتن را برای جلوگیری از انتخاب توسط کاربر به No تغییر دهید.هرچند آنها می توانند روی آن باتن کلیک کرده و آنرا انتخاب نمایند.
SelLength :
این پراپرتی تعداد کاراکترهای انتخابی در قسمت تکست باکس یک کمبو باکس را معین می نماید ، از نوع Integer و رنج آن از صفر تا تعداد کاراکترها است ( در قسمت تکست باکس کمبو !!! )
حتما فراموش نشود برای تنظیم یا برگشتی این پراپرتی کنترل باید فوکس داشته باشد پس در کدتون حتما متد SetFocus را بکار ببرید ( Onchange Event ) .
تنظیم این پراپرتی به عددی کمتر از صفر باعث بروز خطا می شود.
SelStart :
این پراپرتی نمایانگر شروع نقطه تکست انتخابی یا موقعیت نقطه درج در صورت عدم انتخاب است
Integer است و در رنج صفر تا تعداد کل کاراکترها است البته در قسمت تکست باکس کمبو باکس ) پس اینجا فهمیدید که کمبو باکس قسمت هایی دارد شامل تکست باکس ، دراپ باکس و لیست باکس )
مثل پراپرتی بالا حتما فوکس شود از متد SetFocus استفاده کنید
تغییر پراپرتی SelStart انتخاب را کنسل می کند ( همون در جا زدن که قبلا هم گفته شد ) یک نقطه درج در تکست قرار داده و پراپرتی را به صفر تنظیم میکند
فرضا رشته ای دارید که طولانی است و میخواهید با گرفتن ورودی با جعبه InputBox رشته دیگری را در آن بیابید و بعد از یافتن آنرا مشخص کند با SelLength ( مشخص کردن موقعیت رشته سرچ شده با Instr که عدد صحیحی را بر می گرداند که آنرا در SelStart می گذاریم )
--------------------------------
Me.Text1.SetFocus
Me.Text1.SelLength=0
Me.Text1.SelStart=Len(Me.Text1)
اگر در تکست باکس کمبو باکس قصد سرچ در لیست باکس آنرا را دارید با Me.Filter ، از خاصیت Text آبجکت TextBox بهره ببرید گفته شد زمانیکه فوکس از کنترل خارج شود یا بعبارتی فوکس از دست بدهد خاصیت Value آن تکست باکس مقدار پیدا میکند.
فرضا تکست باکسی دارید که دارای Vertical Scroll است با نوشتن کد زیر در رویداد Enter ، نقطه شروع می شود نقطه پایان آخرین کاراکتر درج شده ... بعبارتی کرسر به آخرین کاراکتر درج شده میرود .
Event : Enter
Me.Text1.SelStart=Me.Text1.SelLength
پراپرتی که متنی از یک عبارت رشته ای انتخابی را برمی گرداند.
اگر متنی انتخاب نشود این پراپرتی حاوی مقدار Null است.این پراپرتی از یک عبارت رشته ای که حاوی متن انتخابی است استفاده می کند. چنانچه زمان انتخاب متن این پراپرتی تنظیم شود متن انتخابی با تنظیم SelText جدید جایگزین میشود.
حتما باید با SetFocud کنترل فوکس بگیرد فراموش نشود!!!
در رویداد MouseDown کنترل تکست باکس کد زیر را بنویسید ، متنی بنویسید و Mouse را به سمت پائین فشار دهید در نظرات بنویسید چه اتفاقی رخ میدهد.
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
اضافه کردن آیتم جدید به لیست مقادیر داخل کنترل ComboBox مد نظر
نوشتاری :
expression.AddItem (Item, Index)
در آرگومان اول ( Item ) رشته ای که می خواهید نمایش دهید را قرار می دهید و آرگومان دوم ( Index ) شماره ردیفی ( از صفر شروع میشود ) است که می خواهید رشته نمایش داده شود آرگومان دوم Optional یا انتخابیست و اگر عددی انتخاب نشود رشته به انتهای لیست کنترل کمبو باکس اضافه خواهد شد.
تابع زیر آیتمی را به ابتدای لیست کنترل کمبوباس اضافه می نماید و در اولین ردیف ( صفراندیسی است برابر با اولین ردیف در لیست )
Function AddItemToBeginning(ctrlComboBox As ComboBox,ByVal strItem As String)
ctrlComboBox.AddItem Item:=strItem, Index:=0
End Function
تابع بالا را در Class Module کپی کنید و در کامند باتنی که در فرم حاوی کمبو باکس تعبیه کردید عبارت زیر را بنویسید
AddItemToBeginning(Combo1,"1234")
توضیحاتی که باید توجه شود :
خاصیت RowSourceType کنترل مشخص شده باید به Value List تنظیم شود.اگر Table/Query باشد به جدول اضافه نخواهدشد.
این متد فقط برای کنترل های ListBox و ComboBox در فرم معتبر است
اعداد آیتم در لیست از صفر شروع می شود اگر مقدار آرگومان آیتم با شماره آیتم موجود مرتبط نباشد خطا اتفاق می افتد
برای لیست های چند ستونی از Semicolons برای جداسازی رشته ها برای هر ستون استفاده بنمائید برای مثال "1010;red;large" برای سه ستون . اگر آرگومان آیتم حاوی رشته های زیادی باشد نسبت به تعداد ستونها ( ; استفاده کرده اید ) بقیه رشته ها اضافه نمی شوند ، اضافه شدن از سمت چپ انجام میگیرد
برای حذف آیتم از لیست مقادیر از متد RemoveItem استفاده بنمائید.
expression.Selected(lrow)
از این پراپرتی زمانی استفاده میشود که بخواهید انتخابی از کمبو باکس داشته باشید و از صفر شروع می شود
مثال زیر : انتخاب پنجمین مورد یا ( Row ) در لیست
Me!Combobox.Selected(4) = True
استفاده از خاصیت Selected در ویژوال بیسیک برای تعیین اینکه آیتمی در کمبو باکس انتخاب شده باشد
زمانیکه کنترل فوکس دارد پراپرتی یا خاصیت Text حاوی دیتای جاری در کنترل TextBox است ؛ خاصیت Value حاوی دیتایی است که آخرین بار ذخیره شده .. زمان انتقال فوکس به کنترل دیگر داده کنترل به روز رسانی یا Update ، و پراپرتی Value به مقدار یا Value جدید تنظیم می شود.
تا زمانیکه کنترل دوباره فوکس نگیرد خاصیت Text در دسترس نیست
اگر از کامند SaveRecord از طریق Docmd استفاده کنید و فوکس نگیرد یا فوکس انتقال نشود دو خاصیت Text و Value مشابه هم تنظیم خواهندشد.
زمانیکه شما جداول را از فرم ها و کوئری و سایر آبجکتها جدا یا Split کرده باشید برای لینک زدن به جداول در دیتابیسی حاوی جداول که پسورد گذاشته اید از کد زیر استفاده نمائید.
با OpenDatabase ، دیتابیس دارای پسورد را باز می کنید و سپس با TransferDatabase هم لینک به جداول دیتابیس حاوی جداول
strLinkedTablesArray آرایه ای حاوی جداولیست که میخواهید بصورت لینک شده در دیتابیسی که می خواهید Share کنید ایجاد شود
Set db = CurrentDbSet dblink = DBEngine.OpenDatabase(strDbFile, False, False, ";PWD=" & strP)
For Each strTable In strLinkedTablesArray DoCmd.TransferDatabase acLink, "Microsoft Access", dblink.name, acTable, _ strTable, strTableNext
کد بالا مطمئن تر از استفاده از TableDef.Connect است
برای استفاده در Tabledef.Connet
strConnect = "MS Access;PWD=" & strPassword & _ ";DATABASE=" & strDbFile"
باز کردن دیتا بیس اکسس :
Dim wsAccess As Workspace
Set wsAccess=Dbengine(0)
'Open a Microsoft Access database -shared -read-only
Set dbAccess = wsAccess.OpenDatabase("C:\Temp\db1.accdb", False, True)