Xem mẫu
- CÁC KHÁI NI M
S ki n là gì?
S ki n (event) là m t hành ng xác nh x y ra trên ho c v i m t i tư ng nào
ó. MS Access có th áp l i nhi u s ki n: nh n chu t, thay id li u, m ho c
óng form, ... S ki n thư ng là k t qu t o ra b i m t hành ng c a ngư i s
d ng.
Th t c là gì?
Th t c (procedure) là m t ơn v code c a VB. M t th t c bao g m m t dãy các
l nh (statement) ho c các phương th c (method) th c thi m t hành ng ho c
tính toán m t giá tr .
Th t cs ki n là gì?
Th t c s ki n (event procedure) là m t th t c t ng th c thi áp l i m t s
ki n ư c kh i xư ng t m t hành ng c a ngư i dùng ho c t code c a chương
trình.
VD: Th t c s ki n sau ây s th c thi m t l nh m câu thông báo chào
khi form ư c m ra:
Private Sub Form_Load()
MsgBox "Xin chào các b n."
End Sub
M TS S KI N THƯ NG G P VÀ CÁCH ĐI U KHI N S
KI N
Các s ki n x y ra v i i tư ng Form:
1. S ki n Open:
S ki n x y ra khi form ư c m , nhưng trư c khi record u tiên ư c hi n th .
(Ghi chú: i tư ng Report cũng có s ki n Open, trong report s k n Open x y ra
trư c khi report ư c preview ho c ư c in)
- T khi g i form cho n khi form xu t hi n l n u trên màn hình, m t lo t các s
ki n x y ra, trong ó s ki n Open là s ki n ư c x y ra u tiên. Các s ki n này
và th i i m x y ra c a nó ư c th hi n b ng chu i sau:
Open --> Load --> Resize --> Activate --> Current
Thu c tính g n v i s ki n Open có tên là OnOpen. (Các b n lưu ý: v i nh ng thu c
tính b t u b ng On có nghĩa là s ki n ó ang di n ti n,Before là trư c khi s
ki n x y ra, After là sau khi s ki n x y ra).
Th t c s ki n g n v i s ki n này là Form_Open. S ki n có m t tham s có tên là
Cancel ki u Integer (th c ch t nó ch nh n hai giá tr True và False). Tham s này
các b n có th nh l i giá tr cho nó.
N u nh là True, s ki n s b hoãn, nghĩa là s ki n s không hoàn t t, nhưng
không x y ra l i. M c nhiên là False.
VD: B n mu n r ng khi form A m ra thì form B s m ra n u ngư i s d ng ng ý,
b n có th code cho th t c s ki n như sau:
Private Sub Form_Open(Cancel As Integer)
If MsgBox("Ban co muon form B mo ra dong th oi luon khong?", vbYesNo) =
vbYes Then
DoCmd.OpenForm "form B"
Else
Cancel = True
End If
End Sub
Ghi chú: B t kỳ m t th t c s ki n nào nó thông s là Cancel, thì s
ki n tương ng u có th cho ngưng không cho hoàn t t. Trong trư ng
h p b n s d ng m t macro ho c m t phương th c c a DoCmd thì n u hoãn
m t s ki n, s có m t error tr v . tránh xu t hi n l i thì n dùng
macro, b n có th t trư c macro ó m t macro SetWarnings và gán cho
thu c tính WarningOn là No, dùng DoCmd trong code thì trư c ó b n t
câu On Error Resume Next.
2. S ki n Load:
S ki n Load x y ra b i tác ng c a ngư i dùng như:
-B t um t ng d ng.
- M m t form b ng cách nh p vào Open trên c a s Database.
- Th c thi m t hành ng OpenForm trong macro.
- G i form b ng DoCmd.OpenForm trong th t c.
- Thu c tính s ki n tương ng có tên là OnLoad.
Th t c s ki n tương ng có tên là Form_Load, không có tham s .
Khi i u khi n s ki n này, b n có th th c hi n nh ng công vi c sau:
Thi t l p các giá tr m c nh cho các control ho c th hi n các giá tr tính toán tùy
thu c vào d li u có trên form.
VD: Trong public module b n có m t bi n language. N u bi n này là "V" thì b n cho
hi n th các caption c a các Label là ti ng Vi t, "E" thì hi n th là ti ng Anh. Bi n này
s tùy thu c vào vi c ngư i ta ch n trong m t th t c nào ó trư c khi form b n
ư c g i vào.
Trư c tiên, khi thi t k form, các label, b n t các t "ính l t" tương ng
property Tag c a nó.
Sau ó b n thi t k th t c Form_Load như sau:
Private Sub Form_Load ()
Dim ctl As Control
For Each ctl In Detail.Controls ' or FormHeader.Controls,
FormFooter.Controls
If TypeOf ctl Is Label Then
x = ctl.Caption
ctl.Caption = ctl.Tag
ctl.Tag = x
End If
Next
End Sub
3. S ki n Resize:
S ki n x y ra khi form ư c g i và b t c khi nào kích thư c c a form thay i.
Thu c tính s ki n tương ng có tên là OnResize.
Th t c s ki n tương ng có tên là Form_Resize. Th t c này không có tham s .
Khi i u khi n s ki n này, b n có th :
- Di chuy n ho c nh l i kích thư c c a m t control.
- - Tính toán l i các bi n.
- Reset l i các thu c tính có liên quan n kích thư c c a form.
VD: Khi có s thay i kích thư c c a form s cho hoàn t t nh ng c p nh t màn hình
còn ang treo ho c nh ng tính toán chưa th c hi n xong trên các control b ng
phương th c Repaint.
Private Sub Form_Resize()
Me.Repaint
End Sub
4. S ki n Activate:
S ki n x y ra khi m t form (cũng úng v i report) nh n m t focus (cái này không
dám d ch ra ti ng vi t, b i d ch ra thì h ng ai hi u, còn nguyên thì ai cũng hi u !!!
) và tr thành c a s ho t ng.
Thu c tính s ki n tương ng có tên là OnActivate.
Th t c s ki n tương ng có tên là Form_Activate. Th t c không có tham s .
VD: Bây gi b n có thi t k m t cái toolbar ch dành riêng cho form A. Như v y n u
form A ư c kích ho t thì m i hi n toolbar này (ví d toolbar này có tên là
FormA_Toolbar).
Private Sub Form_Activate()
DoCmd.ShowToolbar "FormA_Toolbar", acToolbarYes
End Sub
5. S ki n Current:
S ki n x y ra khi m t focus ư c di chuy n n m t record, làm cho nó tr thành
record hi n hành, ho c khi form ư c "làm tươi mát" (refresh) ho c ư c gán l i
source (requery).
Thu c tính s ki n tương ng có tên là OnCurrent.
Th t c s ki n tương ng có tên là Form_Current. Th t c này không có tham s .
- VD: B n có m t form hi n th m t s thông tin c a m t table, trong ó có 3 textbox
ng v i 3 field(t m là text1, text2, text3) và m t checkbox cũng ng v i m t field
Yes/No(check1).
Yêu c u t ra là n u check1 b ng True thì không cho thay i n i dung trong 3
textbox.
Private Sub Form_Current ()
text1.Locked = check1
text3.Locked = check1
text3.Locked = check1
End Sub
6. S ki n UnLoad:
S ki n Unload x y ra khi:
- Ngư i s d ng nh n nút Close trên c a s Form.
- Ngư i s d ng g i menu File - Close.
- G i m t macro Close m t c a s có thu c tính Form.
- G i m t l nh DoCmd.Close v i ki u c a s là acForm.
- Đóng Windows trong khi ng d ng Access ang ch y.
Unload là s ki n u tiên c a chu i s ki n sau:
Unload --> DeActivate --> Close
Thu c tính s ki n tương ng là OnUnload.
Th t c s ki n tương ng là Form_Unload. Th t c này có m t thu c tính Cancel.
Như bài trư c, b n ã bi t n u Cancel = True thì có nghĩa gì r i ph i không?
VD: Gi s trong Form b n có m t bi n tên là danglam ki u Boolean. N u bi n là
True thì có nghĩa b n ang nh p li u và ang có thay id li u. B n mu n r ng khi
óng form, nó s h i lưu thay i không, n u có thì trư c khi óng, b n cho lưu.
(Code dư i ây ch là dàn ý, b n ph i tùy bi n cho phù h p v i ng d ng mà b n
thi t k ).
Private Sub Form_Unload (Cancel As Integer)
If danglam Then
If MsgBox ("Du lieu da co thay doi. Co muon luu truoc khi dong khong?",
- vbYesNo) = vbYes then
DoCmd.SaveRecord
Else
DoCmd.Undo
End If
End Sub
7. S ki n DeActivate:
S ki n x y ra khi b n r i focus ra kh i form (ho c report). Nó cũng x y ra sau khi
form (report) ư c Unload.
Thu c tính s ki n tương ng có tên OnDeactivate.
Th t c s ki n tương ng có tên Form_Deactivate. Không có tham s .
VD: Ti p theo ví d c a m c 4 phía trên (bài trư c), khi chuy n focus ra kh i form A,
b n cho n tool box i.
Private Sub Form_Deactivate()
DoCmd.ShowToolbar "FormA_Toolbar", acToolbarNo
End Sub
8. S ki n Close:
S ki n x y ra khi form ã th c s ư c óng l i nhưng chưa r i h i màn hình. V cơ
b n xem như nó ã ư c óng l i, nhưng n u b n có "lưu luy n" gì v i ngư i dùng,
b n có th g i m t thông i p gì ó ây i lo i như ... xem ví d bên dư i.
Tên thu c tính s ki n tương ng là OnClose.
Tên th t c s ki n là Form_Close. Không có tham s .
VD: G i m t thông i p "lưu luy n"
Private Sub Form_Close ()
- MsgBox "See you soon."
End Sub
9. S ki n BeforeInsert:
S ki n này x y ra khi ngư i s d ng gõ vào ký t u tiên trong record m i, nhưng
trư c khi record y th c s ư c t o.
S ki n này b t u m t dãy s ki n sau ây:
BeforeInsert --> BeforeUpdate --> AfterUpdate --> AfterInsert
Thu c tính s ki n có tên là BeforeInsert.
Th t c s ki n có tên là Form_BeforeInsert. Có m t tham s quen thu c là Cancel.
VD: Gi s b n là ngư i r t c n th n. B n mu n r ng khi m t ngư i s d ng gõ m t
ký t b t kỳ vào record m i, b n s lưu ý h li n, s r ng h vô tình nh n phím mà
thôi. B n có th code nh nhàng như sau:
Private Sub Form_BeforeInsert(Cancel As Integer)
If MsgBox("Them record moi ha ban?", vbOKCancel) = vbCancel Then
MsgBox "Lan sau nho can than khi su dung ban phim nghen !!!"
Cancel = True
End If
End Sub
10. S ki n BeforeUpdate:
S ki n x y ra khi có m t s thay id li u trong m t control thu c form ho c khi
record ư c c p nh t (update).
Đúng ra ây ang li t kê các s ki n c a Form, nhưng s ki n này cũng nh hư ng
n m t control, v y có nên nói luôn ây không ta? Thôi chơi luôn há?
Đ i v i form, s ki n này s x y ra khi b n d i focus t record hi n hành sang m t
record khác nhưng chưa d i th t s , ho c b n ã g i l nh Save Record trong menu
Records, ho c b n g i macro SaveRecord ho c b n dùng l nh DoCmd.RunCommand
acCmdSaveRecord.
Đ i v i control, s ki n này s x y ra khi b n d i focus t control ó sang m t
- control khác mà control hi n hành b n có thay id li u.
S ki n BeforeUpdate c a form x y ra sau s ki n BeforeUpdate c a control. B n
nên chú ý i u này vi c i u khi n b ng th t c s ki n cho phù h p.
Thu c tính s ki n có tên là BeforeUpdate.
Th t c s ki n có tên là:
Form_BeforeUpdate i v i form
controlname_BeforeUpdate i v i m t control
C hai u có tham s quen thu c Cancel. V i form, khi Cancel = True, nó s không
cho b n r i kh i record ó, tr khi b n nh n ESC h y thay i (ho c m t macro
hay l nh tương ng) hay nh p li u cho chính xác v i yêu c u.
Đ i v i control, khi Cancel = True, nó s không cho b n r i kh i control ó tr khi
b n cũng nh n ESC h y b thay i (ho c nh p d li u phù h p).
VD: Gi s b n nh p d li u i m thi 3 môn h c A, B, C cho các thí sinh. Trong ó
n u kh i c a thí sinh là 1 thì môn A nhân h s 3, kh i c a thí sinh là 2 thì môn B
nhân h s 3, kh i c a thí sinh là 3 thì môn C nhân h s 3.
Đi m trung bình là t ng i m 3 môn sau khi ã nhân v i h s chia cho 5. Các i m
ch ư ct 0 n 10. Đi m trung bình s tính ngay sau khi 3 môn ư c nh p. Đi m
t ng môn s ki m sau khi nh p xong i m môn ó.
Gi s các control c a b n là: mahs, hotenhs, khoi, monA, monB, monC, dtb
Bây gi b n s "ch " 2 cái th t c BeforeUpdate cho form và cho các control i m
như sau:
Làm m t cái cho i m môn A, i m môn B và môn C tương t :
Private Sub monA_BeforeUpdate (Cancel As Integer)
If monA < 0 Or monA > 10 Then
MsgBox "Diem mon chi tu 0 den 10 thoi."
Cancel = True
End If
End Sub
Làm cho form:
Private Sub Form_BeforeUpdate (Cancel As Integer)
- dim diem as double ' Lay theo kieu chuan, dung Single cung duoc tuy ban
diem = IIf(khoi = 1, monA*3, IIf(khoi = 2, monB*3, monC*3))/5
dtb=diem
End Sub
nguon tai.lieu . vn