برای جمع ساعات ذخیره شده در جدول اکسس می طلبد که از Vba استفاده کنید . یک تابع public بنویسید .
نحوه کار بدین صورت است که اول می بایست تک به تک مقادیر h و m و s را بگیرید و با هم جمع بزنید اول از ثانیه شروع بکنید و به اضای هر 60 ثانیه یک عدد به دقیقه اضافه کنید و زمان جمع دقایق می بایست به اضای هر 60 دقیقه یک عدد به ساعت اضافه شود
8:30:15
10:12:30
9:20
در یک کوئری فرضا اختلاف بین دو Time را ذخیره می کنید بنام difftime و یک کوئری دیگر می سازید و عبارت زیر را کپی می کنید البته در تابع زیر تایپ می بایست فرمت date\time باشد وگرنه ارور میدهد یا می بایست date را از تابع حذف کنید.
x : Sum(Total(difftime))
s=15+30=45
m=30+12+20=62
h=8+10+9=27
خارج قسمت با \ بدست می آید فرضا در 60\195 عدد 3 به Minute اضافه میشود و باقیمانده با Mod که طبق عبارت فوق عدد 15 بدست می آید و همان ثانیه است.
45\60=0
195\60=3
45 Mod 60=45
195 Mod 60=15
Use Nz Function
Public Function TotalHours(tm) as date
اگر tm از نوع تکست باشد باید تک تک h ، s و m را با mid Function بگیرید !!! یا تبدیل به فرمت date\time کنید
Dim h,m,s,mm,ss as integer
h=Hour(tm)
m=Minute(tm)
s=Second(tm)
ss=iif(nz(s)\60=0,nz(s),nz(s) mod 60)
If nz(s)\60>0 Then m=m+s\60
mm=iif(nz(m)\60=0,nz(m),nz(m) mod 60)
If nz(m)\60>0 Then h=h+m\60
TotalHours=format$(.....,"Short time")
Exit Function
Second (#10:42:58 PM#)Result: 58Second (#10:14:13 AM#)Result: 13Second (#22/11/2003 10:01:04 PM#)Result: 4
vba/access/concepts/date-time/calculate-elapsed-time
I am writing VBA on Microsoft access
Do anyone know how can i set a value of a form's field by using VBA?
For example, I am writing the VBA code on form A and want to set value to a field in form B (because I haven't learnt how to pass value between forms)
Or
How can i write VBA to open a new form with value set to a particular field?
یا چگونه می توانم Vba بنویسم تا فرم جدیدی را باز کند با مقداردادن به یک فیلد بخصوصی ؟
کسی می تواند کمک کند؟ برای ۴ ساعت داشتم این کار را انجام میدادم و هنوز راه حلی نمی توانم پیدا کنم
متچکرم خیلی زیاد
جواب بزرگوارانی چون ایشان را اینطور داده اند
با هر دو فرمی که باز است این را امتحان کن
زمانیکه در جدول سینگلی که فیلد AutoNumber دارد رکوردی را حذف میکنید دیگر شماره های پشت سر هم را ندارید و می بایست چاره ای بیاندیشید یک راه این است که جدول را در نمای دیزاین باز کنید فیلد AutoNumber را حذف کنید جدول را ببندید و Compact Database را از Option بزنید و دوباره فیلد را به جدول اضافه کنید. برای جداولی که بهم ربط دارند در پیوندها توصیه آفیس را اجرا کنید با عنوان Reset AutoNumber.
Add This Code on Form Close Event whether you add new record or delete, it will recreate the Primary Keys from 1 to Last record.This code will not disturb other columns of table.
alter-table-statement-microsoft-access-sql
Sql : (AutoNumber Field Value )
CurrentDB.Execute "ALTER TABLE yourTable ALTER COLUMN myID COUNTER(1,1)"
متغیرهایی تعریف شده که زمان ارجاع به آن راحت باشید و مقادیری را به آن تخصیص بدهید با Private Type و مشخص کردن نام و دیتا تایپ آن.
Private Type CUSTOM_MSGBOX lTimeout As Long
lExitButton As Long
lInterval As Long
strPrompt As String
End Type
ClassName = Space(256)
' Make sure we spotted a messagebox (dialog)
Private hHook As Long
Public hwndMsgBox As Long
Public lTimerHandle As Long
Public hAppInstance As Long
این یک نمونه کار است هر زمان که توابع API را مطالعه کردید می توانید با چیدمان درست کدها به مقاصد خود دست یابید البته هوک کردن مشکل است اگر خطایی اتفاق بیافتد سیستم هنگ خواهد کرد به WSCRIP.SHELL و POPUT هم می توان مراجعه کرد .
CREATEOBJECT("WSCRIPT.SHELL")
OBJECT.POPUP
Wscript Popup Method vbsedit
Echo Method vbsedit
Wscript.Shell + Shell.Application Objects shell.html
فرضا ساختن مرجع آبجکت یا شئ به یک فولدر با متد NAMESPACE از آبجکت SHELL.APPLICATION
FolderItems.Count property :
Contains the number of items in the collection.
ssfWINDOWS = 36
Dim objShell,objFolder As Object
Set objShell =CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(ssfWINDOWS)
Set objFolderItems = objFolder.Items
nCount = objFolderItems.Count
اگر کسی کدی داره درباره این موضوع در نظرات کپی کنه تا دیگران هم استفاده کنند برای اینکار از توابع Windows استفاده شده و روش Hook کردن پنجره Msgbox و ارسال پیغام با SendMessageA است.برای ویندوز 32 بیت و 64 روش اظهار تابع فرق میکند.
اگر در نظر سنجی شرکت کنید و موافقت خودتون را در نظرات اعلام کنید به زودی کد خط به خط در اینجا از سایت های خارجی استخراج ودر معرض عموم قرار خواهد گرفت.
MsgBox ( prompt [, buttons ] [, title ] [, helpfile ] [, context ]
Hooks-Win32 application
SetWindowsHookEx :
Installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread
UnhookWindowsHookEx :
Removes a hook procedure installed in a hook chain by the SetWindowsHookEx function
CallNextHookEx :
Passes the hook information to the next hook procedure in the current hook chain. A hook procedure can call this function either before or after processing the hook information.
CallWndProc :
An application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function before calling the window procedure to process a message sent to the thread
IDOK1
IDCANCEL2
IDYES6
IDNO7
Hookproc(nCode,wparam,lparam)
CbtProc https://
با تابع بالا پیغامی را به پنجره دیالوگ باکس میدهید که Title یا تکست کنترل مورد نظر تنظیم شود
در ویندوز 64 بیت نحوه اظهار کردن یک PtrSafe قبل از Function آمده و در بعضی از آرگومانها بجای تایپ Long از LongPtr استفاده شده.
Private Declare PtrSafe Function MessageBoxL Lib "user32" Alias "MessageBoxW" ( _ ByVal hWnd As LongPtr, ByVal lpText As LongPtr, ByVal lpCaption As LongPtr, _ ByVal wType As Long) As Long Private
'Declaration API functions of User32.DLL. for Office 32 or 64-bit
#If VBA7 Then
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function MessageBoxW Lib "user32" (ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
#Else
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long #End If
توابع ویندوزی برای مسیج باکس :
lpText
The message to be displayed. If the string consists of more than one line, you can separate the lines using a carriage return and/or linefeed character between each line.
lpCaption
The dialog box title. If this parameter is NULL, the default title is Error.
#If VBA7 Then
Private Declare PtrSafe Function MessageBoxA Lib "user32" ( _ ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
#Else
Private Declare Function MessageBoxA Lib "user32" ( _ ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long #End If
wType
To indicate the buttons displayed in the message box, specify one of the following
برای مشخص کردن اینکه کدام باتن ها در پنجره Message Box نشان داده شوند از اعداد هگزاگون رزور شده استفاده می کنیم که هر کدام معرف باتنی است.
MB_OK=&H0
MB_OKCANCEL=&H1
MB_YESNO=&H4
MB_YESNOCANCEL=3
To display an icon in the message box, specify one of the following values.
Private Const GWL_HINSTANCE As Integer = (-6)
Private Const HCBT_ACTIVATE As Integer = 5
Private Const WH_CBT As Integer = 5
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const HC_ACTION =0
Private Shared hHook As Integer
The system calls a WH_CBT hook procedure before activating, creating, destroying, minimizing, maximizing, moving, or sizing a window; before completing a system command; before removing a mouse or keyboard event from the system message queue; before setting the input focus;
hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgboxProc,GetModuleHandle(vbNullString),GetCurrentThreadId
Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, _
ByVal ncode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias _
"GetModuleHandleA" (ByVal lpModuleName As String) As LongPtr
Private Declare PtrSafe Function SendDlgItemMessageA Lib "user32" Alias (ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClassNameA Lib "user32" Alias (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPtr
If lngCode < HC_ACTION Then
NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
'called correctly.
برای لود کردن آیکون هم باید به پنجره پیامی فرستاد و از توابع ویندوزی استفاده نمود که به آن اشاره میشود.فقط Bitmap اگر PNG باشد باید تبدیل شود که به کدهای خیلی زیاد و پیچیده اس احتیاج است و از بحث اکسس خارج .
WM_SETICON message
wParam
ICON_BIG=1
ICON_SMALL=0
lParam
handle to the new large or small icon. If this parameter is NULL, the icon indicated by wParamis removed.
Public Const WM_SETICON = &H80 Public Const ICON_SMALL = 0 Public Const ICON_BIG = 1
'// LoadImage() image types
Public Const IMAGE_BITMAP = 0
Public Const IMAGE_ICON = 1
Public Const IMAGE_CURSOR = 2
Public Const IMAGE_ENHMETAFILE = 3 '// LoadImage() flags
Public Const LR_DEFAULTCOLOR = &H0
Public Const LR_MONOCHROME = &H1
Public Const LR_COLOR = &H2
Public Const LR_COPYRETURNORG = &H4
Public Const LR_COPYDELETEORG = &H8
Public Const LR_LOADFROMFILE = &H10
Public Const LR_LOADTRANSPARENT = &H20
Public Const LR_DEFAULTSIZE = &H40
Public Const LR_LOADMAP3DCOLORS = &H1000
Public Const LR_CREATEDIBHeader = &H2000
Public Const LR_COPYFROMRESOURCE = &H4000
Public Const LR_SHARED = &H8000
hIcon = LoadImage(0&, IconPath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE) If hIcon<>0 Then
SendMessageA(hWnd, WM_SETICON, 0, ByVal hIcon)
در سیستم آفیس 32 بیت البته
Private Declare Function LoadImageA Lib "user32 (ByVal hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags As Long) As Long
------------------------------
مثالی دیگر از MSGBOXHOOKPROC :
SetDlgItemTextA function
Sets the title or text of a control in a dialog box.
SetDlgItemTextA( HWND hDlg, int nIDDlgItem, LPCSTR lpString)
Dim mFlags As VbMsgBoxStyle
Public Function MsgBoxHookProc(ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = HCBT_ACTIVATE Then
SetWindowText wParam, mTitle
SetDlgItemText wParam, IDPROMPT,mPrompt
Select Case mFlags
Case vbAbortRetryIgnore
SetDlgItemText wParam, IDABORT, But1 SetDlgItemText wParam, IDRETRY, But2
SetDlgItemText wParam, IDIGNORE,But3
Case vbYesNoCancel
SetDlgItemText wParam, IDYES, But1
SetDlgItemText wParam, IDNO, But2 SetDlgItemText wParam, IDCANCEL,But3
Case vbOKOnly
SetDlgItemText wParam, IDOK, But1
Case vbRetryCancel
SetDlgItemText wParam, IDRETRY, But1
SetDlgItemText wParam, IDCANCEL,But2
Case vbYesNo
SetDlgItemText wParam, IDYES, But1 SetDlgItemText wParam, IDNO, But2
Case vbOKCancel
SetDlgItemText wParam, IDOK, But1 SetDlgItemText wParam, IDCANCEL, But2
End Select
UnhookWindowsHookEx hHook
End If
MsgBoxHookProc = False
End Function
Public Function
------------------------------
مثالی دیگر با استفاده از توابع API
You need to use Windows Hooking API
You must create a CBT hook
Run a Message Box with CBT hook
Catch a HCBT_ACTIVATE message in the Hook procedure
Set new captions for the buttons using the SetDlgItemText function
(example below changes “Yes” and “No” captions to smiles: “:-)” and “:-(” )
Release the CBT hook
Public Sub MsgBoxSmile()
' Set Hook
hHook=SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc,0, GetCurrentThreadId)
'Run MessageBox
MsgBox "Smiling Message Box", vbYesNo, "Message Box Hooking"
End Sub
Private Function MsgBoxHookProc(ByVal lMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
SetDlgItemText wParam, IDYES, ":-)"
SetDlgItemText wParam, IDNO, ":-("
در مثال یاد شده MsgBoxSmile را در رویداد یک باتن بگذارید اگر مشکلی پیش نیاید و پنجره MSGBOX را HOOK نماید ( گفته است که این پنجره شامل دوکلید YES و NO باشد) TEXT داخل این دو باتن تغییر خواهد کرد
البته روش هوک کردن کار درستی نیست بخاطر اینکه زمان کار با کلیدها مسیج های زیادی رد و بدل میشود و چنانچه HWND پنجره درست بدست نیاید کار بیهوده ای خواهد بود و ممکن است سیستم هنگ و در پیش برد برنامه خللی وارد بنماید که مایکروسافت آفیس چنین پیشنهادی را نخواهد داد و عنوان می کنند که اگر کسی راغب است یک فرم بعنوان CUSTOM MESSAGE BOX بسازد و در آنها باتن هایی تعبیه نماید در نتیجه OFFICE هیچوقت پیشنهاد HOOKING را ارائه نخواهد داد....
Private WithEvents Win As WebBrowser
Sub SetWin()
Dim WinShell 'As New Shell32.Shell
Set WinShell = CreateObject("Shell.Application")
Set Win = WinShell.Windows(1)
End Sub
Private Sub Win_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean)
End Sub
کد زیر دیالوگ باکسی برای گرفتن یک فایل باز می کند
Private Sub lblBrowse_Click()
'declare file dialog with late binding ->
Dim fDialog As Object, strPath As String
Set fDialog = Application.FileDialog(3) 'msoFilePicker
'set parameters ->
Me.wbContent.ControlSource = ""
'initializing the file dialog ->
With fDialog
.AllowMultiSelect = False
.Filters.Clear '
.title = "Please select a file..."
'display the dialog box. If the .Show method returns True
'the user picked a file. If the .Show method returns False
'the user clicked Cancel.
If .show = True Then
strPath = .SelectedItems(1)
Debug.Print "SELECTED_FILE: " & strPath
'set source property to the string containing the full path ->
Me.wbContent.ControlSource = strPath
Me.wbContent.Requery
Else
End If
End With
البته جواب نمیدهد خودتان را خسته نکنید ممکن است برای بعضی در WebBrowser نمایش داده شود.
Me.wbContent.ControlSource = "='" & strPath & "'"
WebBrowserControl.ControlSource Property :
روی چک باکس یا Toggle Button عمل نمیکند ( ControlSource )
استفاده از پراپرتی ControlSource برای نمایش داده در کنترل
نمایش و ویرایش داده متصل به یک جدول کوئری یا عبارت Sql یا نمایش نتیجه یک عبارت .( فرضا حاصلضرب دو تکست باکس یا فیلد از جدول یاکوئری)
You can use the ControlSource property to specify what data appears in a control. You can display and edit data bound to a field in a table, query, or SQL statement. You can also display the result of an expression. Read/write String.
Navigate2 Method --->> internet-explorer
NavigateComplete2 event --->> internet-explorer
expression.DocumentComplete (pDisp, URL)
pDisp ( Required,Object)
A pointer to the IDispatch interface of the window or frame in which the document is loaded.
URL (Required,Variant)
Contains the URL of the loaded document.
Return value : Nothing
ByVal pDisp As Object
ByVal Url As Variant
Private Sub object_DocumentComplete( _ ByVal pDisp As Object, _ ByVal URL As Variant)
Set wb = WebBrowser0.Object
wb.Silent = True
With wb
.Navigate2 "about:blank"
Do Until .ReadyState = 4 '=READYSTATE_COMPLETE
'This is a somewhat inefficient way to wait, but loading a blank page should only take a couple of milliseconds
DoEvents
Loop
.Document.Open
.Document.Write "<!DOCTYPE html><HTML><HEAD><TITLE>My title</TITLE></HEAD><BODY scroll=""auto"" style=""margin: 0px; padding: 0px;"">" & _
"<embed src=""" & fileLocation & """ width=""100%"" height=""100%"" />" & _
"</BODY></HTML>"
.Document.Close
End With
With Me.WebBrowser0.Object.Document.Open
.Write "<html><head></head><body><p>Some content.</p></body></html>"
.Close
End With
Opening A Blank Page
Me.WebBrowser0.ControlSource = "about:blank"
Me.WebBrowser0.Object.Document.parentWindow.execScript ("alert('Your Access Database " & Application.CurrentProject.Name & " rocks!');")
Me.WebBrowser0.Object.Document.body...
<!DOCTYPE html> <!-- saved from url=(0016)http://localhost --> <html> <head>
بخوانید و لذت ببرید
جمع آوری از سایت های مختلف
OnLoad :
WebBrowser1.Navigate ("http://www.vbcity.com/forums/active.asp";) 'Replace with URL
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Next
Public WithEvents hDoc As MSHTML.HTMLDocument
Hdoc_ContextMenu=False
می توانید طبق لینک بالا لوپ را باکدهای HtmlDocument انجام بدهید ؟ در نظرات کد و نتیجه آن را مرقوم بفرمائید.
Dim HTML As HTMLDocument
Set HTML = WebBrowser1.Document HTML.All.Item("UNTextbox").Value = "UserName"
HTML.All.Item("PWTextbox").Value = "Password"
HTML.All.Item("LoginButton").Click
ورود داده به باکس UserName :
Me.WebBrowser1.Navigate="Url" ' if be true
Me.WebBrowser1.Document.All("UserName").Value = "tester"
For Each ele In WebBrowser1.document.getelementsbytagname("a")
If ele.innertext = "Log Out" Then
Private WithEvents m_body As MSHTML.HTMLBody
MsgBox "You clicked the page's body", vbInformationPrivate Function m_body_onclick() As Boolean
End Function
Web Browsing Objects htm
WebBrowser.GoForward Method webbrowser
WebBrowser.GoBack Method webbrowser
Me.WebBrowser1.Document.Window.ScrollTo(0, 300)
WebBrowser1.Document.body.Scroll = "no"
CommandStateChange : برای فعال یا غیرفعال کردن دکمه های Forward و Back در مرورگر استفاده می شود . شکل کلی فراخوانی این event بصورت زیر است :
Re: Disable webbrowser
Private Sub WebBrowser1_BeforeNavigate2(ByVa pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
If Me.Visible Then Cancel = True
<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
<a href="mailto:test@example.com">mailto:test@example.com</a>
Support HTML in Rich Text Control :
<div>,<font>,<strong>,<em>,<u>,<ol>,<ul>,<li>,<blockquote>
<font>: face, size, color, style(with BACKGROUND-COLOR only)
<div>: align, dir
You can't select 11pt, because Access Richtext (actually HTML) doesn't store point sizes, but a fixed set of <font size=1> to <font size=7>.
strText = "<div><font face=Arial size=2>" & strText & "</font></div>"
The following table shows supported rich text formatting options:
Font name
Font Size
Bold
Italic
Underline
Align Left
Center
Align Right
Numbering
Bullets
Font Color
Text Hilight Color
Decrease Indent Or Increase
Left-To-Right
Right-To-Left
<h1>The span element</h1>
<p>My mother has
Private Sub cmdYellow_Click() Me.txtColored = MakeYellow(Me.txtEnter) End Sub
Public Function MakeYellow(TextToColor As String) As String
'Sets background shading yellow MakeYellow = "<div><font style='BACKGROUND-COLOR:#FFFF00'>" & TextToColor & "</font></div>"
End Function
<div align=justify>Your <strong>Rich Text</strong> goes here.</div>
<ol></ol>
<ul></ul>
<blockquote></blockquote>
Sub forEachExit()Dim element As VariantDim animals(0 To 5) As String'We have created an array that can hold 6 elementsanimals(0) = "Dog"animals(1) = "Cat"animals(4) = "Snake"animals(2) = "Bird"animals(3) = "Buffalo"'Here we fill each element of the arrayanimals(5) = "Duck-billed Platypus"For Each element In animals'print each element to the immediate window'iterates over the animals collectionDebug.Print elementEnd SubIf element = "Buffalo" Then Exit For'if, at any point, the element becomes equalNext
The output to the immediate window will be (we exited the loop before all items could be printed):
Dog Cat Bird Buffalo |
Dim MyArray() As String
ReDim Preserve MyArray(2)
Public Function HadleOpenForms()
Dim arr() As String
Redim Preserve arr(Forms.Count)
If forms.Count Then
For i=0 To Forms.Count-1
' quotation-marks-in-string-expressions
Arr(i)="" & Forms(i).Name & ""
x=x & iif(x="",",","") & Arr(i)
Next
Debug.Print x
Else
Exit Function
End If
End Function
تابع بالا را تست کنید چنانچه باید اصلاح شود در نظرات این یادداشت قید کنید و اگر درست است زمانیکه فرم هایتان بصورت Tabbed Document باز است اجرا و نتیجه را در نظرات کپی کنید ( در پنجره immidate window محیط vba اکسس اگر تابع درست عمل کند و خطا ندهد ، چاپ میشود)
dim intx as integerdim intCount as integerintCount = Forms.count-1for intX= intCount to 0 step -1docmd.close acform,forms(intX).namenext
Arr=Array("...","....","....")
CountOpenFrms = Application.Forms.Count
SysCmd شامل Action و دوتا آرگومان است کد زیر
مقدار عددی را برمی گرداند که مشخص میکند Object
باز است یا بسته و یا .....
ObjState = SysCmd(acSysCmdGetObjectState, _
Application.CurrentObjectType, _
Application.CurrentObjectName)
vba/api/access.acsyscmdaction
Sub ActiveObjects()
Dim frm As Form, ctl As Control
' Return Form object pointing to active form.
Set frm = Screen.ActiveForm
MsgBox frm.Name & " is the active form."
' Return Control object pointing to active control.
Set ctl = Screen.ActiveControl
MsgBox ctl.Name & " is the active control " _ & "on this form."
End Sub
در کد بالا با مسیج باکس نام فرم فعال و نام کنترل فعال را نمایش میدهد.
علائم بالا برای SendKeys اسپشیال و ویژه یا بعبارتی رزروشده هستند ، و باید داخل کروشه باشند و داخل براکت محصور می شوند
SendKeys "^{Tab}"
اجرای باتنی در سابفرم بدون کلیک روی آن
Public Function New_Main() As Form Set New_Main = New Form_frmMain End Function Sub Test() Dim mm As Form Set mm = New_Main Debug.Print mm.Controls.Count With mm.Form("frmSub") Debug.Print .Controls.Count Debug.Print .Controls("CommandButton1").Enabled .Form.CommandButton1_Click End With End Sub
برای Windowse 64 Bit قبل از فانکشن PtrSafe قرار دهید و Long هم به LongPtr
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As LongPrivate Declare Function CloseClipboard Lib "user32" () As LongSub ClearClipboard3()OpenClipboard (0&)EmptyClipboardCloseClipboardEnd Sub
GetData از DataObject Library :
hCap = capCreateCaptureWindow("Take a Camera Shot", WS_CHILD Or WS_VISIBLE, 0, 0, PicWebCam.Width, PicWebCam.Height, PicWebCam.hWnd, 0)
If hCap <> 0 Then
Call SendMessage(hCap, WM_CAP_DRIVER_CONNECT, 0, 0)
Call SendMessage(hCap, WM_CAP_SET_PREVIEWRATE, 66, 0&)
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End If
|
For Each Ctl In Me.Controls
If Ctl.ControlType=(acTextBox Or acComboBox) Then
'DO SomeThing
Next
'If Ctl.ControlType=acTextBox Or Ctl.ControlType=acComboBox
لوپ در کنترلهای یک سابفرم :
در خط اول در کنترل های فرم می گردد چنانچه TypeName آن SubForm بود میرود به Form آن و تمام کنترل ها را در پنجره immidiate window محیط Vba نمایش میدهد ( Ctrl+G)
For Each ctl In frm.Controls
If TypeName(ctl) = "SubForm" Then
Debug.Print ctl.Name & " is a SubForm"
For Each ctlSub in ctl.Form.Controls
Debug.Print ctlSub.Name
Next
End If
Next
حال در جواب سوال بعد از ایجاد لوپ
Ctl.BackColor = IIf(Ctl.Name = Screen.ActiveControl.Name, 8454143, 16777215)
البته در کنترل تب ، تب هایی وجود دارد و هر تب فقط یک پیج دارد رفرنس به تب خاص و پیج حاوی کنترل ها ( فرضا نام تب کنترل TabCtl0 باشد.)
iTabPage=0 پیج ایندکس تب اول صفر است
For Each Ctl In TabCtl0.Pages(iTabPage).Controls
'iTabPage=iif(iTabPage>15,0,iTabPage=iTabPage+1)
For i=0 To TabCtl0.Pages.Count -1 لوپ در پیج ها
ControlType Property :
acBoundObjectFrame | Bound object frame |
acCheckBox | Check box |
acComboBox | Combo box |
acCommandButton | Command button |
acCustomControl | ActiveX (custom) control |
acImage | Image |
acLabel | Label |
acLine | Line |
acListBox | List box |
acObjectFrame | Unbound object frame or chart |
acOptionButton | Option button |
acOptionGroup | Option group |
acPage | Page |
acPageBreak | Page break |
acRectangle | Rectangle |
acSubform | Subform/subreport |
acTabCtl | Tab |
acTextBox | Text box |
acToggleButton | Toggle button |
TypeName(Ctl)
Ctl.ControlType
If TypeOf Ctl is .....
مثال زیر چگونگی کنسل کردن چاپ گزارشی را نشان میدهد زمانیکه داده ای وجود ندارد.جعبه پیامی کاربر را آگاه میسازد که چاپی که کنسل شده بود فقط نمایش داده میشود.
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