-
Khai báo function
mrsiro > 18-04-18, 10:59 AM
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. -
RE: Khai báo function
ongke0711 > 18-04-18, 02:51 PM
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. -
RE: Khai báo function
mrsiro > 18-04-18, 05:16 PM
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ì. -
RE: Khai báo function
ongke0711 > 18-04-18, 11:40 PM
(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 control, ByVal blnFocus As Boolean)
If blnFocus = True Then
ctl.BackColor = RGB(200, 237, 248)
ctl.BorderWidth = 1
Else
ctl.BackColor = RGB(255, 255, 255)
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
x = x * 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:
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.
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). -
RE: Khai báo function
mrsiro > 20-04-18, 09:51 AM
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" -
RE: Khai báo function
ongke0711 > 21-04-18, 09:15 AM
- 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. -
RE: Khai báo function
mrsiro > 21-04-18, 12:03 PM
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. -
RE: Khai báo function
ongke0711 > 21-04-18, 04:27 PM
- 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.