В едно елементарно приложение ще използвате Visual Basic само за създаване на event процедури и прости функции. Но в сложни приложения, ще се наложи да използвате пълната мощ на този език. В следващите раздели се описват основните правила за писането на Visual Basic код в Access.
Standard Modules and Class Modules
Вие съхранявате Вашия Visual Basic код в модули (modules) в базата от данни. Модулите дават възможността да организирате своите процедури.
Една база от данни може да съдържа два типа модули:
-
Стандартни модули използват се за съхраняване на код, които да може да се стартира от произволно място на приложението. Може да се извикват общи процедури от стандартен модул от изрази, макроси, event процедури или от процедури от други стандартни модули.
-
За създаването на нов стандартен модул, може да се чукне бутон New от Modules tab в Database прозореца, или пък чрез командата Insert | Module.
-
-
Клас (група) модули (Class modules) това са модули, специфични за един потребителски обект. Sub и Function процедурите които дефинирате като class module стават методи на обекта. Характеристики които се дефинират с операторите Property Get, Property Let и Property Set стават характеристики на потребителския обект.
За създаването на нов class module се изпълнява Class Module от Insert командата. Съхранените class modules се появяват в Modules tab на Database прозореца.
Всяка форма или отчет в базата от данни могат да съдържат form module или report module. Те също са class modules, но не могат да се съхраняват отделени от формата или отчета на който принадлежат.
-
Form и report module са част от формата или отчета. Ако копирате една форма в друга база от данни, нейните модули се копират заедно с нея, ако се изтрие форма - изтриват се и нейните модули.
What’s In a Module?
Module може да съдържа:
-
Обявявания (Declarations) Съдържа оператори дефиниращи променливи, константи и външни процедури. Раздела на обявяванията на module е отделно от процедурите, и обявяванията се прилагат за всички процедури в module. Вътре в процедурите също могат да се обявяват променливи и константи, при което те се използват само вътре в процедурата.
-
Event procedures Това са Sub процедури които са свързани със специфичен обект и се стартират в отговор на събитие. Тези процедури винаги се съхраняват заедно с формата или отчета във form или report module.
-
General procedures Това са процедури, които не са директно свързани с обекти или събития. Те могат да присъстват в standard module или class module. Тези процедури могат да бъдат Sub процедури (процедури, които не връщат стойност) или Function процедури (процедури, които връщат стойност).
-
-
Event Procedures
Когато Access разпознае събитие, което е настъпило във форма, отчет или контрол, той автоматично стартира event процедурата специфицирана за този обект или събитие.
Ако желаете да да стартирате код в отговор на специфично събитие, то трябва да се добави Ваш код към event процедурата за това събитие.
See Also For information on the Access event model, see Chapter 6, “Responding to Events.” For more information on all events, search the Help index for “events.”
Когато създавате event процедура (както е описано по-напред в тази глава), Access автоматично създава шаблон за това събитие и го добавя към module на формата или отчета. Името на новата процедура е комбинация от думите “Form” (или “Report”), знак за подчертаване ( _ ), и името на event. Например, ако желаете формата да стартирате even процедура когато чукнете (click) в нея, използвайте процедура с име Form_Click.
Event процедурите за контрол използва същите правила за именуване. Например, ако желаете команден бутон с име MyButton да стартира процедура след натискането му, използвайте процедурата MyButton_Click. Ако името на контрола съдържа други символи освен букви и цифри, например интервал, Access заменя тези символи с знак за подчертаване.
Important If you want to change the names of your controls, it’s a good idea to do so before you start writing event procedures for them. If you change the name of a control after attaching a procedure to it, you also must change the name of the procedure to match the control’s new name. Otherwise, Visual Basic can’t match the control to the procedure. When a procedure name doesn’t match a control name, Access makes it a general procedure. You can find general procedures in the Module window by clicking (General) in the Object box, and then clicking the procedure name in the Procedure box.
General Procedures
Access стартира event процедури в отговор на специфични събития във форма, отчет или контрол. General процедурите, за разлика от event процедурите се стартират само когато изрично се посочи това. Функцията например е от този тип.
Кога се използват general процедури? Една причина за това е да създадете функция за автоматизиране на често изпълнявани задачи. Например, може да създадете функция която се стартира чрез бутон от потребителска ивица с бутони или да използвате тази функция в израз.
See Also For information on customizing your menus and toolbars, see Chapter 1, “Creating an Application.” For information on using functions in expressions, search the Help index for “expressions.”
General процедурите могат да се създават или в class module или в standard module. Ако желаете процедурата да е достъпна от произволно място на приложението, то тя се съхранява към standard module, ако ли пък е специфична за една единствена форма - то тя се разполага в module за формата.
Creating and Calling Procedures
Този раздел представя синтаксиса който използвате за създаване и извикване на процедури в приложението си. Процедурите могат да бъдат Sub или Function процедури.
-
Sub извършват операции, но те не могат да върнат стойност и не могат да се използват в израз. Тези процедури могат да приемат аргументи. Event процедурата е Sub когато тя е присвоена на форма или отчет. Когато Access разпознае събитие във форма, отчет или контрол, той автоматично стартира event процедурата за този обект и събитие.
-
Function процедурите връщат стойност, която е резултат от пресмятания. Те могат да бъдат използвани в изрази. Могат да приемат аргументи.
-
Sub Procedures
Синтаксиса на Sub процедура е:
[Private|Public] [Static] Sub procedurename [(arguments)]
statements
End Sub
Statements са Visual Basic оператори, формиращи кода, който желаете да се изпълни при стартирането на процедурата. Arguments са имената на аргументите, разделени със запетая ако са повече от един. Всеки аргумент изглежда като обявяване на променлива и участва като променлива в процедурата. Синтаксиса за всеки аргумент е:
[Optional] [ByVal] variablename [( )] [As type]
Type може да бъде всеки от основните типове данни: Byte, Integer, Long, Single, Double, Currency, Decimal, String, Boolean, Date, Object, or Variant. Ако не се посочи тип на данните, се възприема тип Variant като универсален. Скобите след variablename задават, че аргумента е масив.
По подразбиране аргументите се предават към процедурата “по позоваване” (by reference), което води до промяна на стойностите на променливите в извикваната процедура. За предаване на аргументите по стойност, следва да се използва ключовата дума ByVal.
See Also For information on the Optional keyword, see “Using a Variable Number of Arguments” later in this chapter. For information on the Static and Private keywords, search the Help index for “Sub statement.” For information on passing arguments by value or by reference, see “Argument Data Types” in Chapter 4, “Working with Variables, Data Types, and Constants.”
Когато извиквате Sub процедура, трябва да посочите аргументите, които желаете процедурата да използва. Например, следващата Sub процедура възпроизвежда звук (beep) толкова пъти, колкото сте посочили в intBeeps аргумента.
Sub MultiBeep(intBeeps As Integer)
Dim intX As Integer, lngY As Long
For intX = 1 To intBeeps
Beep
For lngY = 1 To 100000 ' Short delay between beeps.
Next lngY
Next intX
End Sub
Следващият оператор извиква MultiBeep Sub процедурата, със стойност на аргумента intBeeps - 3, възпроизвеждайки трикратно звук.
MultiBeep 3
Не трябва да задавате аргумента в скоби когато извиквате Sub процедура, така както се прави когато го декларирате, с изключение на случаите когато използвате Call оператор за извикване на процедура, в който случай скобите са задължителни.
Note To make your code more readable, you can pass arguments to Sub or Function procedures by name. For example, the following call to the MultiBeep Sub procedure passes the intBeeps argument by name:
MultiBeep intBeeps:=3
When you pass multiple arguments by name, you can include them in any order you want. For more information on passing arguments by name, search the Help index for “named arguments.”
Function Procedures
Синтаксиса за Function процедура е:
[Private|Public] [Static] Function procedurename [(arguments)] [As type]
statements
End Function
See Also For information on the Static and Private keywords, search the Help index for “Function statement.”
Аргументите за Function процедура са същите както за Sub процедура, като различията са само следните:
-
Аргументите се поставят в скоби и когато се декларира и когато се извиква Function процедура.
-
Function процедурите, по подобие на променливите имат тип на данните определящ типа на връщаната стойност.
-
Връщаната стойност се присвоява на procedurename. Тази стойност може да се използва в изрази.
-
Например, може да напишете Function процедура, която пресмята третата страна (хипотенузата) на правилен триъгълник, като зададете другите две страни.
Function Hyp (dblA As Double, dblB As Double) As Double
Hyp = Sqr(dblA ^ 2 + dblB ^ 2)
End Function
Извикването на Function процедура е като извикването на всяка една от вградените функции в Visual Basic. Например:
dblResult = Hyp(dblWidth, dblHeight)
Tip If you aren’t interested in the result of a Function procedure, you can call it without including parentheses or assigning it to a variable, as you would a Sub procedure. For example, you can use the following code to call a function called DisplayForm and ignore its return value:
DisplayForm strMessage
Using a Variable Number of Arguments
Може да декларирате опционни аргументи в дефиницията на процедура посредством ключовата дума Optional. Опционен аргумент е този, които може и да не бъде предаден всеки път, когато се извиква процедурата. Декларирането на опционните аргументи е след декларирането на задължителните в списъка на аргументите. Те могат да бъдат от произволен тип.
Ако сте включили опционен аргумент в декларацията на процедурата, то трябва да се укаже и какво трябва да се случи, когато не дадете аргумент. Ако Вие не направите това, то Access определя, че аргумента е със стойност “нула”, в случаите когато той е от числов тип; ако пък е от тип стринг - опционния аргумент се задава като стринг с нулева дължина ("").
В следващият пример, ако стойността за опционния аргумент не е зададена, този аргумент приема стойност по подразбиране 100.
Sub DisplayError(strText As String, Optional intNumber As Integer = 100)
If intNumber = 100 Then
MsgBox strText
Else
MsgBox intNumber & ": " & strText
End If
End Sub
Процедурата може да бъде извикана с един от следните оператори.
DisplayError "Invalid Entry"
DisplayError "Invalid Entry", 250
Note If an optional argument is of type Variant, then you can use the IsMissing function to determine whether an optional argument was included when the procedure was called. The IsMissing function only works with arguments of type Variant.
За написването на процедура, която приема произволен брой аргументи, използвайте ключовата дума ParamArray за предаване на масив от аргументи от тип на данните Variant. С ключовата дума ParamArray, може да се напише функция подобна на Sum, която пресмята сумата на произволен брой аргументи.
Function Sum(ParamArray varNumbers() As Variant) As Double
Dim dblTotal As Double, var As Variant
For Each var In varNumbers
dblTotal = dblTotal + var
Next var
Sum = dblTotal
End Function
Функцията Sum може да бъде извикана със следващият оператор.
dblSum = Sum(1, 3, 5, 7, 8)
Calling Procedures from Other Modules
Ако не се укаже нещо друго, general процедурите, които се създават са от тип public, на основание на което те могат да се активизират от произволно място от приложението.
Tip If you know you will use a procedure only within its module, you should declare it with the Private keyword to avoid confusion and to speed up compilation of your code. Event procedures are always declared with the Private keyword, because they normally apply only to the form or report in which they are stored. For information on procedures declared with the Private keyword, search the Help index for “Private statement.”
Когато се извика процедура, която не е от текущия модул, Access претърсва останалите модули и стартира първата процедура която срещне с името, което сте посочили. Ако името на процедурата не е уникално за базата от данни, то може да се посочи името на модула, в който е съхранена тя. Например, за стартиране на процедурата DisplayMsg намираща се в нетекущия модул, може да се използва следния оператор:
Utility.DisplayMsg
Процедура от class модул се извиква по подобен начин. Просто се посочва името на class модула, следвано от името на процедурата. Например, за стартиране на процедурата AddValues от class модула Class1 и отпечатване на резултата в Debug прозореца, използвайте следния код:
Debug.Print Class1.AddValues
Понеже модулите към форма или отчет са също class модули, те се извикват по същият начин. За извикване на процедура от модул на форма или отчет, посочете името на модула и след това името на процедурата. Името на модул от форма или отчет включва определението Form_ or Report_ следвано от името на формата или отчета. Например, за стартиране на Sub процедурата DisplayRecords съхранена заедно с Orders формата, използвайте оператора:
Form_Orders.DisplayRecords
Като алтернативен подход, процедура може да се активизира от class модул, от модул на форма или отчет посредством позоваване на pbject променлива. Например, следващия код отваря формата Orders, а след това стартира процедурата DisplayRecords.
Dim frmOrders As New Form_Orders ' Declare an object variable.
frmOrders.Visible = True ' Open and display the Orders form.
frmOrders.DisplayRecords ' Call the form's procedure.
.
.
.
Set frmOrders = Nothing ' Close the new instance of the Orders form.
Чрез съхраняване на процедурата DisplayRecords в модула на Orders формата и правейки я от тип public като резултат създавате потребителски метод на Orders формата.
Sub DisplayRecords
' This procedure can be called from another form
' to cause the Orders form to update itself.
.
.
.
End Sub
Using Variables
Често се налага временно да се съхраняват стойности за извършване на различни операции, по време на изпълнение на програмен код, без да е необходимо да се съхраняват те в таблица.
Visual Basic използва променливи (variables) за съхраняване на стойности. Подобно на полетата от таблицата променливите имат имена, което се ползва за обръщане към тях, както и характеристика на типа на данните, които се съхраняват в тях. Преди да се използва една променлива, добре е (но не е задължително) тя да бъде декларирана чрез Dim оператора.
Например, в следващата процедура dtmAny, dtmYear и dtmMonth са променливи от тип Date.
Function DueDate(dtmAny As Date)
Dim dtmYear As Date, dtmMonth As Date
dtmYear = Year(dtmAny)
dtmMonth = Month(dtmAny) + 1
DueDate = DateSerial(dtmYear, dtmMonth, 1)
End Function
See Also For information on declaring and using variables, see Chapter 4, “Working with Variables, Data Types, and Constants.”
Naming Conventions
Когато пишете Visual Basic код, се налага да обявявате и именувате много елементи (Sub и Function процедури, променливи и константи и т.н.). Всички тези елементи трябва:
-
Да започват с буква.
-
Да съдържат само букви, цифри и знак за подчертаване ( _ ); знаци за пунктуация и интервали не са разрешени.
-
Да не съдържат повече от 255 символа.
-
Да не съдържат ключови думи.
-
Ключова дума е дума, която Visual Basic използва като част от своя език. Това включва оператори (като If и Loop), функции (като Len и Abs), методи (като Close и FindFirst), и др.
Controlling Execution
Visual Basic притежава оператори, с които може да се контролира изпълнението на кода.
За тази цел могат да се ползват следните оператори:
-
If...Then
-
If...Then...Else
-
Select Case
-
За многократно изпълнение на част от кода могат да се ползват:
-
Do...Loop
-
For...Next
-
While...Wend
-
За обвързване на час от код към обект или обекти в приложение могат да се ползват:
-
For Each...Next
-
While...End While
-
See Also For information on using these statements, search the Help index for any keyword in the statement.
Using the DoCmd Object to Perform Macro Actions
Много от действията които задавате в едно приложение нямат съответстваща команда в езика Visual Basic. За изпълнение на еквивалент на действие на макрос, използвайте методите на DoCmd обекта. Неговият синтаксис е:
[Application.]DoCmd.method [arguments]
Заместете method с името на действието на макрос. Колко аргумента ще зададете, зависи от особеностите на макрос-действието, което желаете да стартирате. Списъка на аргументите е в последователността, в която се появяват те в Macro прозореца, а може да се ползват и именувани аргументи. Посочването на Application е опционно; просто можете да започнете програмния ред с DoCmd.
Например, метод Close, кореспондиращ с Close действието приема два аргумента, определящи типа и името на обект от базата от данни, който желаете да затворите. Следва да се използва запетая за отделяне на аргументите, когато те са повече от един.
DoCmd.Close acForm, "Add Products"
See Also For information on intrinsic constants, see Chapter 4, “Working with Variables, Data Types, and Constants,” or search the Help index for “intrinsic constants.”
Някои от методите на DoCmd обекта приемат опционни аргументи. Ако в такива случаи не се посочат стойности за тях, Access използва за тях стойности по подразбиране. Например, ако не се посочат стойности за такива аргументи при Close метода, то се затваря активния (който и да е той) обект от базата от данни.
DoCmd.Close
Ако се пропусне опционен аргумент, но се посочи аргумент следващ прескочения, то трябва да се включи запетая заради пропуснатия аргумент. Например синтаксиса за MoveSize метода е:
DoCmd.MoveSize [right] [, down] [, width] [, height]
Следващият оператор използва подразбиращите се (текущите стойности за аргументите right и down arguments, а се посочват стойности само за аргументите width и height.
DoCmd.MoveSize , , 5000, 3000
Можете да използвате методите на обекта DoCmd за задаване на макрос-действия, задавайки RunMacro (което стартира съществуващ макрос). Но някои макрос-действия нямат еквивалентри действия. В противовес на това, Visual Basic предлага някои вградени оператори и функции.
Action
|
Visual Basic equivalent
|
|
AddMenu
|
No equivalent (but you can now create custom menus by using the command bars object model in Visual Basic)
|
MsgBox
|
MsgBox statement or function
|
RunApp
|
Shell function
|
RunCode
|
Function procedure call
|
SendKeys
|
SendKeys statement
|
SetValue
|
Assignment statement
|
StopAllMacros
|
Stop or End statements
|
StopMacro
|
Exit Sub or Exit Function statements
| -
See Also For information on methods of the DoCmd object, search the Help index for “DoCmd object.”
Using the RunCommand Method to Perform
Menu Commands
Понякога, може да желаете във приложението Ви да се изпълни команда он меню на Access или създадена от Вас ивица с бутони. В такива случаи използвайте RunCommand метода. Синтаксиса му е
RunCommand command
Тук Command е константа, кореспондираща с Access командата, която желаете да стартирате. Например следващият код заставя Access да изведе Options диалоговата кутия (което е равностойно на изпълнение в директен режим на командата Tools|Options):
RunCommand acCmdOptions
See Also To determine the constant for the command you want to run, search the Help index for “RunCommand method.”
Getting Help
Както и в другите прозорци на Access, може да получите помощ по всеки един от следните начини:
-
Ако е стартиран Office Assistant, чукнете върху него, напишете въпроса си и след това натиснете Search. Ако ли пък не е стартиран, чукнете Office Assistant бутона за да го стартирате. Обърнете внимание, че когато работите в Module прозореца са достъпни само съвети по програмиране.
-
Изпълнете Contents And Index (от Help командата) и след това потърсете описанието, което Ви трябва.
-
Когато редактирате код в Module прозореца, позиционирайте мигащият маркер на вградена функция, метод или ключова дума и натиснете F1. Това ще изведе помощна информация, подобно на показаната на следващата илюстрация.
-
-
Използвайте List Properties/Methods, List Constants, Quick Info, и Parameter Info командите (от Edit менюто) за да получите помощ или информация за елементите на кода, който сте въвели в Module прозореца.
-
See Also For more information on these commands, see “Writing and Editing Code” earlier in this chapter.
-
Note When you ran Setup to install Access or Microsoft Office Professional, you may not have installed all the available Help files on your system. For example, if you clicked Typical during Setup, you don’t have all the Visual Basic Help files. To add additional components to your Access installation, run Access or Microsoft Office Setup again, click Custom, and select the components you want to add.
Accessing Relevant Information on the Internet
Друга възможност за помощна информация е Internet.
Можете да получите достъп до Microsoft Web sites директно от Access. В Help менюто, изберете Microsoft on the Web, след това чукнете върху съществуващите там сайтове. Тези сайтове се обновяват редовно и там може да се намери много повече информация, отколкото тази от самия продукт или книгите към него.
Следващата таблица съдържа списък на Microsoft Web сайтове.
Microsoft Web site
|
Internet address
|
Description
|
|
Access page of the Microsoft Office Web site
|
http://www.microsoft.com/access/
|
Offers free add-ins and tools, sample applications, instructional articles, and case studies of real world applications.
|
Microsoft Developer Network Online
|
http://www.microsoft.com/msdn/
|
Offers articles and technical information for developers who use any Microsoft development tool.
|
Access Developer Forum
|
http://www.microsoft.com/accessdev/
|
Offers technical articles, sample applications, programming tips, information on developer events and training, and case studies of real-world applications.
|
Microsoft Knowledge Base
|
http://www.microsoft.com/kb/
|
Offers articles that contain detailed how-to information, answers to technical-support questions, bug lists, and fix lists.
|
Access page of the Microsoft Support Online Web site
|
http://www.microsoft.com/MSAccessSupport/
|
Offers featured articles and samples, troubleshooting tips,
and answers to frequently
asked questions.
|
Access Newsgroups
|
http://www.microsoft.com MSAccessSupport
/default-news.htm
|
Offers a list of peer-to-peer newsgroups for discussion about Access.
|
Building Applications with Access 97
|
http://www.microsoft.com/accessdev/docs/bapp97
/bapp97.htm
|
(This book) Offers an online version of Building Applications with Access 97 that contains updated content.
|
Сподели с приятели: |