• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Khai báo ByVal và ByRef

Các bài viết hướng dẫn và tham khảo chung, không thuộc ngôn ngữ nào

Điều hành viên: vietluyen

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Khai báo ByVal và ByRef

Gửi bàigửi bởi truongphu » CN 10/05/2009 9:23 am

Tên bài viết: Khai báo ByVal và ByRef
Tác giả: truongphu
Cấp độ bài viết: căn bản quan trọng
Tóm tắt: Ít ai chú tâm đến ý nghĩa của khai báo ByVal...


Trong thủ tục khai báo các biến số của hàm (function) hay thủ tục (sub) ta thấy có lúc các biến được khai báo có kèm từ "ByVal" ở đằng trước. Vậy ByVal là gì? có tác dụng thế nào trong hàm hay thủ tục?

* Mặc định của Visual Basic là ByRef (By References), nghĩa là nếu không khai báo ByVal thì hàm hay thủ tục nhận luôn cả biến để tính toán, và trong quá trình làm việc nầy, nếu giá trị biến thay đổi thì vẫn tiếp tục dùng.
Tóm tắt: Nếu không khai báo ByVal trong các biến (đối số) của một Function hay Sub thì Function hay Sub sẽ sử dụng luôn biến số nầy và chấp nhận các giá trị thay đổi của biến số trong các quá trình tính toán tiếp theo.

* Ngược lại, nếu có khai báo ByVal (By value) thì hàm hay thủ tục chỉ nhận giá trị của biến lúc đó để tính toán, nhờ thế giá trị biến vẫn bảo tồn
Tóm tắt: Nếu có khai báo ByVal với biến số (của đối số) của một Function hay Sub thì Function hay Sub chỉ nhận giá trị tức thời của biến để tính toán, hoàn toàn không tác động thay đổi giá trị của biến trong suốt quá trình làm việc.

* Code minh họa: Biến XX và Function YYY với khai báo ByVal

Mã: Chọn hết

  1. Dim XX As Integer
  2.  
  3. Private Sub Form_Load()
  4.     XX = 10
  5. End Sub
  6.  
  7. Private Sub Command1_Click()
  8.     MsgBox YYY(XX)
  9. End Sub
  10.  
  11. Function YYY(ByVal XX As Integer) As Long
  12.     XX = XX + 1
  13.     YYY = XX * 5
  14. End Function


Trong đoạn code trên, biến toàn cục XX được khởi tạo có giá trị là 10
Khi nhấn Command1 sẽ gọi Function YYY để xử lý biến XX
Lúc nầy, Function YYY Chỉ Nhận Giá Trị của biến XX là 10 và đưa vào tính toán
còn biến XX gạt ra ngoài, không đụng đến
Kết quả, ta nhấn Command1 bao nhiêu lần
vẫn chỉ nhận đáp án là 55
(do biến XX không thay đổi)

* Code minh họa: Biến XX và Function YYY (không khai báo ByVal)

Mã: Chọn hết

  1. Dim XX As Integer
  2.  
  3. Private Sub Form_Load()
  4.     XX = 10
  5. End Sub
  6.  
  7. Private Sub Command1_Click()
  8.     MsgBox YYY(XX)
  9. End Sub
  10.  
  11. Function YYY(XX As Integer) As Long
  12.     XX = XX + 1
  13.     YYY = XX * 5
  14. End Function


Trong đoạn code trên, biến toàn cục XX được khởi tạo có giá trị là 10
Khi nhấn Command1 sẽ gọi Function YYY để xử lý biến XX
Lúc nầy, Function YYY Nhận Luôn Biến XX đưa vào tính toán
và biến XX bị thay đổi theo quá trình làm việc
Kết quả, ta nhấn Command1 nhiều lần
thì đáp án nhận được sẽ thay đổi 55, 60, 65...
(do biến XX đã thay đổi từ 10, 11, 12...)


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
xuanquy_th
Guru
Guru
Bài viết: 792
Ngày tham gia: T.Ba 05/08/2008 9:15 pm
Đến từ: Thanh Hoá
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

Re: Khai báo ByVal và ByRef

Gửi bàigửi bởi xuanquy_th » CN 10/05/2009 10:06 am

Đây chính là điểm yếu của VB6
Và qua vb2005 nó đã được khắc phục

Hồi trước làm VB6 nhiều lúc gặp lổi mà không hiểu tại sao nó lổi!
Sau vài lần Debug với phát hiện ra là VB6 mặc định các biến trong Function và Sub là ByRef
Vấn đề này quả thật là đau đầu với ai lần đầu tiên vướng phải :D
Khi Chúa Trời đóng cánh cửa này lại, Ngài sẽ mở một cánh cửa khác cho ta.
Nhưng ta thường nhìn quá lâu vào cánh cửa đã đóng nên không thấy được có một cánh cửa khác đang mở ra cho ta!!!

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: Khai báo ByVal và ByRef

Gửi bàigửi bởi tungcan5diop » CN 10/05/2009 9:57 pm

xuanquy_th đã viết:Đây chính là điểm yếu của VB6
Và qua vb2005 nó đã được khắc phục

Hồi trước làm VB6 nhiều lúc gặp lổi mà không hiểu tại sao nó lổi!
Sau vài lần Debug với phát hiện ra là VB6 mặc định các biến trong Function và Sub là ByRef
Vấn đề này quả thật là đau đầu với ai lần đầu tiên vướng phải :D

chưa làm vb6 nên nghe xuanquy nói mới hiểu..sang vb.net thì dễ rồi :D
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

Hình đại diện của người dùng
hoangthu1974
Guru
Guru
Bài viết: 812
Ngày tham gia: T.Năm 09/03/2006 9:30 am
Đến từ: Hà Nội --> Tp. Hồ Chí Minh
Been thanked: 13 time
Liên hệ:

Re: Khai báo ByVal và ByRef

Gửi bàigửi bởi hoangthu1974 » T.Hai 11/05/2009 8:27 am

Thủ tục khai báo tham số truyền cho Sub và Function của VB6 gồm ByVal (Chỉ truyền tham số) và ByRef (Truyền liên kết biến). Mặc định nếu tên biến khai báo không trùng với biến đã được khai báo trong phạm vi hoạt động của Sub hoặc Function là ByVal, còn trùng là ByRef.

Khi dùng ở ByVal, các thay đổi về giá trị của biến sẽ không ảnh hưởng đến biến nguyên gốc truyền vào.
Khi dùng ở ByRef, các thay đổi về giá trị của biến sẽ thay đổi cả giá trị của biến nguyên gốc truyền vào.


Quay về “Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách