So sánh giữa CreatObject và New ???

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,177
Được thích
24,619
Khi sử dụng Early Binding để tạo đối tượng liên kết giữa các môi trường, ta có thể sử dụng hàm CreatObject hoặc New. Ví dụ:

Dim wordAppl As Word.Document
Set wordAppl = CreateObject(“Word.Application”)


Ngoài ra có thể sử dụng từ khóa New với chức năng tương tự như:

Dim objWord As Word.Application
Set objWord = New Word.Application


Nhờ các bác tư vấn xem sử dụng CreatObject hay New hiệu quả hơn? (Nghe nói là New có phải không?)
 
So sánh New và CreateObject

Em xin so sánh sơ qua thế này.

CreateObject(class,[servername])
class: là một chuối (string) chỉ ra tên lớp đối tượng, trong đó có các thành phần như Property (có thể là class hoặc biến mang kiểu giá trị), Method (Sub), Function, Events.

Ví dụ về các Class:

Mỗi ứng dụng trong bộ Office đều có môt class "mẹ" là Application: excel.application, word.application, access.application,..... Class "Application" lại chứa các Class bên trong nó như là:
Trong EXCEL là Range, Sheet, ActiveWorkbook,....
Trong WORD là ActiveDocument, AutoCorrect, Table, ...
Trong Powerpoint là ActivePresentation, Slide, ...

Hàm CreateObject tạo một đối tượng (obj) theo class chỉ định. obj được tạo, nằm trong bộ nhớ của máy tính và hoạt theo cơ chế của class nó mang, mối obj hoạt động này người ta goi là một Instance.

CreateObject thường được dùng để tạo một đối tượng, mà class chưa được khai báo trong ứng dụng. Như là, từ VB6, Word, Access,...người ta có thể tạo một đối tượng Excel và cho nó chạy bình thường bằng lệnh

Set xlApp = CreateObject("Excel.Application")

Từ khóa New, cũng như CreateObject được dùng để tạo ra một đối tượng.
Công thức chung để tạo một đối tượng:
Dim Obj As New Class
Hoặc
Set Obj = New Class

Class dùng sau New phải được khai báo từ trước, nếu nó thuộc một ứng dụng bên ngoài thì ứng dụng đó phải được Reference (Trong VBA, vào menu Tools\Reference...)

Ví dụ trong VBA của WORD ta tạo một đối tượng EXCEL như sau:
Set xlApp = New Excel.Application
Với điều kiện trong VBE của WORD ta phải Reference tới Winword.exe nếu không sẽ bị lỗi.

Như vậy New và CreateObject có chung một mục đích là tạo ra một đối tượng, nhưng nếu dùng New thì class phải được Reference trước.

New dễ sử dụng, vì Class được khai báo từ trước nên trong môi trường soạn code (VBE) người dùng được hỗ trợ chức năng "List Property/Method", biểu hiện khi ta gõ dấu cách (space bar) thì ta có một danh sách các đối tượng (phím tắt là CTRL+J).
Nhược điểm là bộ nhớ bị chiếm dụng do phải Reference. Mặt khác, khi phiên bản của class thay đổi (VD như Excel nâng cấp từ version 10->12) thì với những chương trình được đóng gói sẽ bị lỗi, trừ khi ta mổ nó ra và Reference lại.
Dễ thấy nhất, nếu ta lập trình trên máy Office2000 thì khi chạy trên máy có Office2003 sẽ bị lỗi.

CreateObject khắc phục hoàn toàn nhược điểm của New vì không phải Reference các class, nó còn cho phép sử dụng các Class được khai báo ở một máy tính khác. Nhược điểm là khó sư dụng. Không được hỗ trợ "List Property/Method". Để sử dụng tốt thì người dùng phải nhớ các thành phần bên trong của Class.

Chú ý:
Khi sử dụng New hay CreateObject cần phải đảm bảo như sau:

Set Obj = New Class hoặc Set Obj = CreateObject("Class")

Sử dụng Obj
......

Giải phóng khỏi bộ nhớ
Obj.Quit 'Phải thoát bằng lệnh Quit hoặc Close, Exit,..tùy vào ứng dụng nếu Obj là một ứng dụng Automation (Tất cả các ứng dụng trong Office đều là Automation và có thủ tục thoát là Quit)

Cuối cùng dùng lệnh
Set Obj = Nothing

Trên là một số giải thích cơ bản. Vấn đề này đụng chạm tới nhiều khái niệm trừu tượng như là ActiveX Object, Automation. Để hiểu sâu cần phải đọc kỹ trong MSDN.
 
Lần chỉnh sửa cuối:
Upvote 0
Dear all,
--------
Anh TuanVNUNI mới chỉ đề cập đến ưu điểm của CreateObject, thế còn nhược điểm của nó là gì ạ?
Tụi em không phải lập trình viên chuyên nghiệp nên khổng nhớ các Object cung cấp cho CreateObject phải viết ra sao... Các Class string này chắc phải có quy tắc gì chứ, em đọc help khổng thấy, khó dùng quá!
 
Upvote 0
Anh có nói nhược điểm rồi mà
CreateObject khắc phục hoàn toàn nhược điểm của New vì không phải Reference các class, nó còn cho phép sử dụng các Class được khai báo ở một máy tính khác. Nhược điểm là khó sư dụng. Không được hỗ trợ "List Property/Method". Để sử dụng tốt thì người dùng phải nhớ các thành phần bên trong của Class.

Tất cả các ứng dụng được tạo theo chuẩn ActiveX, Automation đều chứa các Class. ActiveX có thể được tạo dưới dạng DLL hoặc EXE. Để tạo ActiveX DLL, trong VB6 vào menu File chọn "New Project" sau đó chọn "ActiveX DLL".
Lần đầu tiên sử dụng trên máy, cần phải đăng ký các Class tới WINDOWS bằng cách chạy lệnh "Regsvr32 TenActiveX.DLL". Mấy cái ví dụ DLL anh gửi lên diễn đàn đều là ActiveX đấy, vì thế đi cùng nó anh phải gửi kèm file "Setup.bat" mục đích để chạy Regsvr32.

Để khai thác các Class trong ActiveX thì làm thế này:

Set Obj = CreateObject("Ten_ActiveX.Class")

Em xem topic anh viết "Tạo DLL trong VB6" để hiểu cách tạo ActiveX.
 
Upvote 0
Dear TuanVNUNI,
----------------
Những cái ...X đó là do mình tự tạo thì gọi được "ngon" mà anh (trường hợp đãng trí quá thì mở source code ra mà xem). Còn những object do người khác cờ-ri-ết thì làm sao biết classes hả anh? Chắc là phải F2 rồi chui vào đó tìm ạ?
 
Upvote 0
Đào Việt Cường đã viết:
Dear TuanVNUNI,
----------------
Những cái ...X đó là do mình tự tạo thì gọi được "ngon" mà anh (trường hợp đãng trí quá thì mở source code ra mà xem). Còn những object do người khác cờ-ri-ết thì làm sao biết classes hả anh? Chắc là phải F2 rồi chui vào đó tìm ạ?

Đúng vậy, chỉ còn cách đó thôi. Cũng như mình khai thác chú EXCEL thôi, may mà còn có F1 nữa không thì "tờ gà mờ" )*&^)

(Chuyện vỉa hè chút. Sao thằng cu của em mặt mày nó nhẵn nhụi thế mà thằng cu của anh nó lem nhem quá? Làm cách nào vậy? - Avatar--=0 )
 
Upvote 0
Cám ơn 2 chuyên gia!--=0

Như vậy, trong trường hợp nào nên sử dụng New thay vì CreatObject?

Tôi có đoạn này nhưng không hiểu nghĩa lắm:

Using the New keyword in the declaration statement causes the object variable to be created even if it isn’t used.
 
Upvote 0
Tức là khi mình viết
thì objA đó đã được tạo ngay mặc dù mình chưa sử dụng gì đến cái objA đó.

Vì thế mình chỉ viết:
Khi nào dùng đến mới viết

Dùng xong thì killobj bằng cách:

Vấn đề trên được giải quyết ở .NET rồi (Vẫn Dim có New luôn vì .NET nó quản lý resources tốt)

Tuy nhiên, nếu sử dụng được Late Bound object (Create Object) thì tốt hơn. Cần gì phảit giải thích dài dòng, M$ nó viết rõ trong MSDN rồi, vào đó mà tra cứu. Khi thi mấy món MDSE của M$ về VB từ hồi xa xưa thì đó là câu hỏi basic kiểu gì cũng có.

PS: Kinh nghiêm viết LateBound Object:

Đầu tiên cứ dùng EarlyBound Object, sau đó xóa phần Dim Obj đi và thay bằng CreatObject vào rồi sử dụng Replace 1 tý. Nói chung là phải dùng mẹo 1 tý chứ. Còn lười lười 1 tý thì thôi, mấy cái viết trên Excel dùng EarlyBound Object cũng có sao đâu. :)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom