Xem mẫu

  1. 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 i d 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 c s 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
  2. 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 u m 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.
  3. - 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.
  4. 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 i d 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 ()
  5. 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 i d 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 i d 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 ó
  6. 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 ư c t 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