Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Khai báo function
#1
Chào anh chị, mình có txtngaythang

Mình lập 1 function như sau:
 Public function kiemtra(txtngay as string,  thoat as integer)
 if mid(txtngay,4,2) >  12 or mid(txtngay,4,2) < 0 then
 msgbox "Sai định dạng tháng"
 thoat = true
 end function

Sau đó trong sự kiện before update của txtngaythang mình gọi fucntion như sau:
 If not isnull(me.txtngaythang) then
 call kiemtra(me.txtngaythang,cancel)
 end if

Mình muốn hỏi qui trình mình làm đã đúng chưa, có vấn đề gì với cách khai báo function, cách gọi function hay không. Anh chị nào biết có thể hướng dẫn giúp mình.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#2
Cách làm vậy là đúng rồi đó bạn.
Có thể gọi thẳng hàm, không cần dùng "Call".
Đã dùng hàm kiểm tra ngày tháng thì đưa cái việc check Isnull vô trong hàm luôn, khỏi phải If...then.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn mrsiro
#3
Ngoài cách khai báo txtngay as string trong function thì còn cách khai báo là as control. 2 cách khai báo này khác nhau như thế nào vậy bạn. Đôi lúc mình gặp vài function trên mạng có kèm thêm byval hoặc byref đằng trước nữa. Không biết có tác dụng gì.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#4
(18-04-18, 05:16 PM)mrsiro Đã viết: Ngoài cách khai báo txtngay as string trong function thì còn cách khai báo là as control. 2 cách khai báo này khác nhau như thế nào vậy bạn. Đôi lúc mình gặp vài function trên mạng có kèm thêm byval hoặc byref đằng trước nữa. Không biết có tác dụng gì.

1. Việc khai báo biến kiểu gì làm tham số (đối số) cho hàm là tùy thuộc vào hàm của bạn muốn làm gì, trả về cái gì, cần cung cấp nhưng tham số nào làm đầu vào. Nếu cần đối số là 1 form thì khai báo (frm as Form) v.v..
Ví dụ: bạn xem hàm bên dưới. Khai báo ctl as Control

Mã PHP:
Public Function HandleFocus(ByRef ctl As controlByVal blnFocus As Boolean)

   If blnFocus True Then
       ctl
.BackColor RGB(200237248) 
       ctl
.BorderWidth 1
   Else
       ctl
.BackColor RGB(255255255)
       ctl.BorderWidth 1
   End 
If

End Function 

=> Hàm HandleFocus() sẽ thay đổi màu nền của control mà nó focus. Nếu control đó là Textbox thì nó sẽ đổi màu nền textbox và Border sẽ là 1 point. Control đó có thể là: Label, Rectangle…


2. ByRef và ByVal:
- Khi bạn truyền biến tham số của hàm theo ByRef thì trong quá trình thực thi hàm, giá trị của biến truyền vài cũng bị thay đổi theo. Nếu truyền theo ByVal thì dù hàm hay Sub xử lý kiểu gì thì giá trị biến truyền vào ban đầu cũng không bị thay đổi. Nôm na giống như vậy: 
   + ByRef: bạn giao cho người ta cái số đỏ để đi làm giấy tờ gì đó nếu bị hư, rách thì rách luôn cái sổ đỏ. 
   + Còn đối với ByVal: bạn chỉ giao cho họ bản copy số đỏ, họ muốn làm gì thì làm nhưng cuối cùng cuốn sổ đỏ của bạn vẫn còn nguyên.
Một ví dụ cho đễ hiểu:
- Tạo 1 form với một nút lệnh, khi bấm sẽ chạy code sau:
Mã PHP:
Dim x As Integer

x
=10

MsgBox GapDoi
(x)

MsgBox x 

- Tạo hàm GapDoi(): Gấp đôi giá trị biến X 
Mã PHP:
Public Function GapDoi (ByRef x As Integer) As Integer

2

GapDoi 
x

End 
Function 

=> Khi thực thi sẽ hiện ra 2 Message Box thông báo như hình dưới: 
[Hình: 41541758791_99c33ed1fe_n.jpg]   
Giải thích: Bạn chú ý hàm Function GapDoi (ByRef x As Integer) dùng ByRef biến x. Giá trị biến x ban đầu truyền vô =10. Msgbox đầu sẽ hiển thị giá trị trả về của hàm GapDoi (x) là = 20. Msgbox sau hiện thị giá trị biến x và cũng là 20. Kết quả biến x sau cùng đã đổi thành 20.

=> Khi bạn thay đổi ByRef thành ByVal của hàm Function GapDoi (ByVal x As Integer), kết quả sẽ trả về 2 messge box như bên dưới.
[Hình: 27671682698_c428ae2e70_n.jpg]
Giải thích: bạn thấy MsgBox thứ 2 hiển thị giá trị biến x vẫn là 10 (như giá trị truyền vô ban đầu) dù có bị xử lý qua hàm GapDoi(x).
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , tranthanhan1962 , mrsiro
#5
Public Function checkdate(txtdate As String) As String
If Not IsNull(txtdate) Then
If Left(txtdate, 2) > Left(DateSerial(Right(txtdate, 4), Mid(txtdate, 4, 2) + 1, 0), 2) Then
checkdate = DateSerial(Right(txtdate, 4), Mid(txtdate, 4, 2) + 1, 0)
Else
checkdate = txtdate
End If
End If
End Function

Chào bạn, thật sự mình vẫn chưa hiểu lắm về byval và byref, nếu có thể thì hàm sau theo bạn có cần khai báo byval không. Đây là hàm mình sẽ đưa vào sự kiện afterupdate của 1 textbox nào đấy, có tác dụng nếu nhập ngày lớn hơn ngày cuối của tháng ví dụ nhập "33/04/2018" thì tự động trả về "30/04/2018"
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#6
- Mặc định không khai báo gì hết thì hàm (Sub) sẽ là byRef.
- Hàm của bạn ko cần dùng ByVal vì bạn đâu cần sử dụng lại cái giá trị nhập vào textbox ban đầu.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#7
Nếu sử dụng byref thì giá trị của biến thay đổi mỗi khi gọi hàm, vậy ví dụ nếu mình gọi hàm vào sự kiện lostfocus của 1 txtbox chẳng hạn, thì mỗi khi rời txtbox đó là biến thay đổi giá trị đúng không.

private function test(txt as number)
txt = 2
test = txt
end function

Sự kiện lost focus của txtbox:

me.txtbox = test(txtbox)

Vậy lúc này sau khi rời txtbox thì giá trị của txtbox là bao nhiêu, ví dụ nếu mình nhập vào 10 rồi thoát khỏi txtbox. Giá trị của txtbox là 10 hay là 2.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#8
- Không có khai báo kiểu dữ liệu Number chung chung mà phải là integer, double...gì đó.
- Bạn cần phân biệt biến và giá trị nhập vào textbox. Trong ví dụ của bạn: hàm test() với tham số txt (biến) được đưa từ bên ngoài vào để xử lý nhưng sau đó sẽ tự set biến txt thành 2 (txt=2) bất kể tham số txt lúc đầu đưa vào là gì và kết quả luôn =2. Sau đó lấy giá trị trả về của hàm test() gán cho textbox (on lost focus) <=> textbox luôn có giá trị = 2.
Ví dụ của bạn nó không thể hiện được tính thay đổi của biến.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Function check các biến chưa đóng mrsiro 0 101 13-10-18, 05:44 PM
Bài mới nhất: mrsiro
  [Hỏi] Function keydown và keypress mrsiro 0 262 17-05-18, 10:26 AM
Bài mới nhất: mrsiro
  [Hỏi] Function bẩy lỗi mrsiro 4 447 05-05-18, 01:09 AM
Bài mới nhất: ongke0711
  Kẻ khung cell Excel với Access khai báo muộn Minh Tiên 2 390 02-04-18, 08:09 PM
Bài mới nhất: Minh Tiên
  Hỏi về Function và Property Get Che_Guevara 2 1,108 14-10-16, 03:46 PM
Bài mới nhất: Che_Guevara

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line