Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Forms!control vs me!control vs form_nameform.control ????
#1
Chào các bạn !

Mình tham khảo nhiều bộ code và thấy các cách điều khiển đối tượng như sau:
-Forms!nameform!control
-me!control
-me.control
-form_nameform.control
Nhờ các bạn giải thích ý nghĩa và cách sử dụng cho phù hợp.

Xin cám ơn !
Chữ ký của dinh_trong_hoa
Reply
Những người đã cảm ơn
#2
Giải thích một cách nôm na thì có thể hiểu cách tham chiếu đến đối tượng trên một Form/ Report như sau:
Form/Report là một loại đối tượng trong đó nó có chứa các điều khiển. Quy tắc chung trong cách tham chiếu là
[Tên Form/Report][.!][Đối tượng]
Quy tắc này có ý nghĩa là
Gọi [Form] + [Tên Đối tượng con]
Giống như dạng tìm địa chỉ thì phải có tên phố/ Ngõ/ Ngách....

Tùy thuộc vào việc ta đứng ở đâu để gọi tham chiếu, nhưng cú pháp chung đều có dạng như vậy. Khi đang xét thủ tục trong nội bộ Form/Report, ta có thể sử dụng thêm cú pháp.
Ví dụ có một Textbox là txtMahang, bạn có thể sử dụng cách tham chiếu:
Trường hợp này ta có thể sử dụng như sau:
Me.Controls("txtMahang") Hoặc Me.txtMahang hoặc gọi trực tiếp txtMahang
[Me] chính là từ khóa để trỏ về đối tượng Form/Report bạn đang làm việc

Nhưng khi bạn tham chiếu từ ngoài, cú pháp bắt buộc phải tuân thủ cấu trúc bôi đậm ở trên
Giả sử Form/Report có tên là FrmInput, bạn có thể sử dụng các dạng sau:
Forms("frmInput").Controls("txtMahang")
FrmInput!txtMahang
....
Nhưng không thể dùng Me.Control.... được vì bạn đã đứng ở ngoài form.
Một lưu ý, là khi bạn tham chiếu như vậy, bắt buộc Form/Report phải đã được tải vào bộ nhớ nếu không sẽ có lỗi xảy ra (trước đó bạn phải thực hiện việc tải Form/Report đó rồi).

Bình thêm:
Khi lập trình với Access, tôi thường tránh tham chiếu dạng này vì rất dễ xảy ra lỗi và việc truy tìm lỗi thường khó khăn. Nếu bắt buộc phải có việc chuyển số liệu giữa các form, tôi thường sử dụng một biến toàn cục hoặc lưu kết quả vào CSDL để truy cập lại.
Điều này có lợi khi bạn phải thay đổi tên Form/Report vì không phải kiểm tra lại tham chiếu bạn đã làm trước đó trong Code.
Riêng đối với tham chiếu nội bộ trong form thì tôi chỉ sử dụng [Me] khi phải thao tác trực tiếp với thuộc tính của Form/Report, ví dụ:
With Me
.InsideHeight=....
.Caption=....
End With
Hoặc khi sử dụng để duyệt qua các điều khiển trên form để thực hiện tác vụ nào đó, chẳng hạn
With Me
For i=1 to .Controls.Count
......
Next i
End With
Còn khi tham chiếu đến điều khiển thì đơn giản là gọi tên trực tiếp của đối tượng đó.
Xin thưa thớt vài câu như vậy
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Noname , changkhoonline77 , Minh Tiên , dinh_trong_hoa
#3
(09-07-14, 09:04 AM)paulsteigel Đã viết: Giải thích một cách nôm na thì có thể hiểu cách tham chiếu đến đối tượng trên một Form/ Report như sau:
Form/Report là một loại đối tượng trong đó nó có chứa các điều khiển. Quy tắc chung trong cách tham chiếu là
[Tên Form/Report][.!][Đối tượng]
Quy tắc này có ý nghĩa là
Gọi [Form] + [Tên Đối tượng con]
Giống như dạng tìm địa chỉ thì phải có tên phố/ Ngõ/ Ngách....

Tùy thuộc vào việc ta đứng ở đâu để gọi tham chiếu, nhưng cú pháp chung đều có dạng như vậy. Khi đang xét thủ tục trong nội bộ Form/Report, ta có thể sử dụng thêm cú pháp.
Ví dụ có một Textbox là txtMahang, bạn có thể sử dụng cách tham chiếu:
Trường hợp này ta có thể sử dụng như sau:
Me.Controls("txtMahang") Hoặc Me.txtMahang hoặc gọi trực tiếp txtMahang
[Me] chính là từ khóa để trỏ về đối tượng Form/Report bạn đang làm việc

Nhưng khi bạn tham chiếu từ ngoài, cú pháp bắt buộc phải tuân thủ cấu trúc bôi đậm ở trên
Giả sử Form/Report có tên là FrmInput, bạn có thể sử dụng các dạng sau:
Forms("frmInput").Controls("txtMahang")
FrmInput!txtMahang
....
Nhưng không thể dùng Me.Control.... được vì bạn đã đứng ở ngoài form.
Một lưu ý, là khi bạn tham chiếu như vậy, bắt buộc Form/Report phải đã được tải vào bộ nhớ nếu không sẽ có lỗi xảy ra (trước đó bạn phải thực hiện việc tải Form/Report đó rồi).

Bình thêm:
Khi lập trình với Access, tôi thường tránh tham chiếu dạng này vì rất dễ xảy ra lỗi và việc truy tìm lỗi thường khó khăn. Nếu bắt buộc phải có việc chuyển số liệu giữa các form, tôi thường sử dụng một biến toàn cục hoặc lưu kết quả vào CSDL để truy cập lại.
Điều này có lợi khi bạn phải thay đổi tên Form/Report vì không phải kiểm tra lại tham chiếu bạn đã làm trước đó trong Code.
Riêng đối với tham chiếu nội bộ trong form thì tôi chỉ sử dụng [Me] khi phải thao tác trực tiếp với thuộc tính của Form/Report, ví dụ:
With Me
.InsideHeight=....
.Caption=....
End With
Hoặc khi sử dụng để duyệt qua các điều khiển trên form để thực hiện tác vụ nào đó, chẳng hạn
With Me
For i=1 to .Controls.Count
......
Next i
End With
Còn khi tham chiếu đến điều khiển thì đơn giản là gọi tên trực tiếp của đối tượng đó.
Xin thưa thớt vài câu như vậy

Xin chào paulsteigel !

Cám ơn bạn đã giải thích hộ, cho mình hỏi thêm khi tham chiếu từ ngoài dùng dấu "." hoặc dấu "!" đều có ý nghĩa giống nhau phải không hay nó tùy vào trường hợp.
VD:
Mình có 02 form A và B, mình đang làm việc ở form A muốn tham chiếu đến textbox của form B thì cú pháp sẽ là: "Forms!form_b!textbox" hay "forms.form_b.textbox"
Mình đã từng gặp trường hợp sử dụng 02 cú pháp trên nó bị lỗi, còn dùng "form_form_b.textbox" thì ok

Thanks
Chữ ký của dinh_trong_hoa
Reply
Những người đã cảm ơn
#4
Trong VB từ bản 4.0, dấu Chấm than "!" được dùng để tham chiếu đến tổ hợp đối tượng, dấu Chấm "." để tham chiếu các thuộc tính hoặc thủ tục của một đối tượng.
Tuy nhiên, điều khiển (Control) có thể cũng tham chiếu được giống như một thuộc tính của Form/Report vì bản thân nhóm các điều khiển trên Form/Report cũng là một tập hợp. Trong Access, thì đây là thuộc tính mặc định. Chính vì vậy bạn có thể tham chiếu đến điều khiển trên Form/Report với dấu "!"

Ví dụ để truy cập thuộc tính của Điều khiển Ctrl1 trên form ta có thể làm thế này:
Mã PHP:
Form1.Ctrl1.Text "Hello" 
Nếu dùng
Mã PHP:
Form1!Ctrl1.Text "Hello" 
Thì khi dịch sang mã máy nó được chuyển thành giống dạng tham chiếu này
Mã PHP:
Form1.Controls.Item("Ctrl1").Text "Hello" 
Vì bản thân VBA đã có cơ chế tối ưu hóa các Form/Report vì thế nó cho phép trình dịch sử dụng dạng tham chiếu thế này.
Chẳng hạn
Mã PHP:
Form1!Ctrl1.Text "Hello" 
sẽ được dịch thành
Mã PHP:
Form1.Ctrl1.Text "Hello" 
Còn bạn gặp lỗi thì rất có thể giống như tình huống tôi đã đề cập trong bài trước.
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
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
  [Hỏi] Cách thay đổi Back Color của control theo giá trị toancvp 15 753 16-07-16, 10:43 AM
Bài mới nhất: toancvp
  [Hỏi] Chức năng hiện Control theo điều kiện toancvp 5 258 16-06-16, 04:23 PM
Bài mới nhất: toancvp
  Kích thước và các Control thay đổi khi Max,min huuduy.duy 1 132 26-05-16, 04:24 PM
Bài mới nhất: ongke0711
  Hướng Dẫn Hướng dẫn tạo Tab control ngochieu8109 5 366 17-01-16, 07:25 PM
Bài mới nhất: caytregiavn77
  Hiển thị hình trên forms DoquangLam 6 2,245 01-01-16, 03:16 PM
Bài mới nhất: tvn_hut

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ơ