Sử dụng ActiveX control trên .NET ActiveX control là một loại COM component rất ñặc biệt chịu hỗ trợ một lô giao diện ñặc biệt cung cấp những khía cạnh ñồ họa và có thể ñược lôi thả lên một biểu mẫu. Như bạn có thể ñã biết, ActiveX control mang phần ñuôi là .ocx. Khi Microsoft phát triển chuẩn OCX, cho phép lập trình viên xây dựng những ActiveX control trên Visual Basic và ñem sử dụng chúng với C++ (hoặc ngược lại) thì cuộc cách mạng ActiveX control bắt ñầu. Sau nhiều năm, hằng ngàn ô control OCX ñược triển khai, bán qua thị trường và ñược sử dụng. Các ô control này tương ñối nhỏ, dễ sử dụng và là một thí dụ về việc tái sử dụng những binary. Giống như việc bạn nhập khẩu những component COM chuẩn dùng trong các dự án .NET như trong các mục ñi trước, bạn cũng có thể nhập khẩu dễ dàng ActiveX control vào .NET, mặc dù chuẩn COM binary và .NET binary không hề tương thích. Visual Studio .NET có khả năng nhập khẩu ActiveX control, và Microsoft cũng chế ra một trình tiện ích command line mang tên AxImp.exe cho phép bạn nhập khẩu ActiveX control. AxImp.exe sẽ tạo những assembly cần thiết ñối với ActiveX control ñể có thể dùng trên các ứng dụng .NET.
1 Tạo một ActiveX control ðể minh họa khả năng sử dụng ActiveX control cổ ñiển trên một ứng dụng .NET, trước tiên bạn cho triển khai một máy tính bỏ túi ñơn giản gồm 4 chức năng (cộng, trừ, nhân và chia) như là một ActiveX control rồi sau ñó cho triệu gọi ActiveX control này trong một ứng dụng .NET. Bạn sẽ tạo ActiveX control này trên Visual Basic 6.0. Một khi ô control này ñược tạo xong chạy trên môi trường Windows, bạn sẽ cho chép nó lên môi trường .NET, cho nó ñăng ký lên hệ thống rồi cho nhập khẩu vào một ứng dụng Windows Forms. Muốn tạo ô control, bạn cho mở Visual Basic 6.0, rồi chọn ActiveX control như là kiểu dự án. Bạn cho biểu mẫu thu nhỏ lại càng nhỏ càng tốt, vì ô control này không cần có một giao diện người sử dụng. Bạn right-click lên UserControl, chọn click Properties, rồi ñổi tên thành Calculator trên cửa sổ Properties. Tiếp theo, bạn right-click lên Project1 rồi chọn click mục Project1 Properties ñể cho khung ñối thoại Project Properties hiện lên. ðổi tên Project1 thành CalcControl. Lập tức cho Save dự án và ñặt tên tập tin và dự án là CalcControl vào thư mục bạn muốn. Bây giờ bạn có thể thêm 4 hàm máy tính. Bạn right-click lên biểu mẫu CalcControl, chọn View Code (hoặc ra lệnh View | Code) bạn cho khỏ ñoạn mã Visual Basic như theo Thí dụ 7-07 sau ñây:
Thí dụ 7-07: Thi công ActiveX control CalcControl ************************************************************************* Public Function Add (left As Double, right As Double) As Double Add = left + right End Function Public Function Subtract (left As Double, right As Double) As Double Subtract = left - right End Function Public Function Multiply (left As Double, right As Double) As Double Multiply = left * right End Function Public Function Divide (left As Double, right As Double) As Double Divide = left / right End Function
*************************************************************************
Bạn cho biên dịch ñoạn mã này bằng cách ra lệnh File | Make CalcControl.ocx.trên trình ñơn Visual Basic 6.0. Tiếp theo, bạn mở một dự án thứ hai trên Visual Basic nhưng lần này là Standard EXE và cho ñặt tên biểu mẫu là TestForm và tên dự án là CalcTest, rồi cho save dự án dưới cái tên CalcTest. Bạn thêm ActiveX control như là component, bằng cách ấn tổ hợp phím ñể cho hiện lên khung ñối thoại Components (hình 7-14), rồi chọn CalcControl từ Tab Controls như theo hình 7-14. Việc này ñưa những ô control mới vào toolbox. (hình 7-15)
Bạn cho lôi ô control CalcControl mới này vào biểu mẫu TestForm và cho ñặt tên CalControl. Bạn ñể ý là ô control này không hiện lên vì nó không giả sử có người sử dụng. Bạn thêm hai text box (Text1 và Text2), 4 button (btnAdd, btnSubtract, btnMultiply, và btnDivide) và một label (Label1) như theo hình 7-16. Vấn ñề còn lại là viết những hàm thụ lý tình huống các nút bị ấn xuống. Mỗi lần nút bị ấn xuống bạn ñi lấy trị trong hai text box, ép nó về kiểu double (thông qua hàm CDbl()), triệu gọi hàm CalcControl rồi in ra kết quả trên label control Label1. Thí dụ 708 cho thấy toàn bộ ñoạn mã viết theo Visual Basic 6.0.
:
Thí dụ 7-08: Sử dụng CalcControl trên một chương trình Visual Basic ************************************************************************* Private Sub btnAdd_Click() Label1.Caption = CalcControl.Add(CDbl(Text1.Text), _ CDbl(Text2.Text)) End Sub Private Sub btnDivide_Click() Label1.Caption = CalcControl.Divide(CDbl(Text1.Text), _ CDbl(Text2.Text)) End Sub Private Sub btnMultiply_Click() Label1.Caption = CalcControl.Multiply(CDbl(Text1.Text), _ CDbl(Text2.Text)) End Sub Private Sub btnSubtract_Click() Label1.Caption = CalcControl.Subtract(CDbl(Text1.Text), _ CDbl(Text2.Text)) End Sub *************************************************************************
Hình 7-17 cho thấy kết quả chạy chương trình:
2 Nhập khẩu một ActiveX control vào .NET Bây giờ bạn biết là ActiveX control CalcCon trol.ocx chạy tốt, bạn có thể sao tập tin CalcControl.ocx qua môi trường .NET. Một khi sao qua xong bạn cho ñăng ký tập tin này sử dụng trình tiện ích Regsvr32 như sau:
Regsvr32 CalcControl.ocx
Nếu việc ñăng ký thành công, bạn có thể xây dựng một chương trình trắc nghiệm chạy trên .NET. Bạn bắt ñầu tạo một ứng dụng Windows Forms trên Visual Studio .NET, cho mang tên InteropTest và thiết kế giống như hình 7-16. Hình 7-18 cho thấy biểu mẫu thực sự:
2.1 Nhập khẩu một ô control Có hai cách ñể nhập khẩu một ActiveX control vào một môi trường triển khai Visual Studio .NET: • •
Bạn có thể dùng các công cụ của Visual Studio .NET, hoặc Bạn sử dụng trình tiện ích Aximp.exe ñi kèm theo .NET SDK
Muốn sử dụng Visual Studio .NET, bạn ra lệnh Tools | Customize Toolbox từ trình ñơn chính của IDE. Khi khung ñối thoại Customize Toolbox | Tab COM components hiện lên, bạn cho ON ô check CalcControl.Calculator mà bạn vừa ñăng ký xong. Xem hình 7-19.
Vì CalcControl ñược ñăng ký trên máy tính .NET, Customi ze Toolbox có khả năng tìm thấy nó. Khi bạn chọn ô control này từ khung ñối thoại hình 7-19 kể trên, thì ô control này ñược nhập khẩu vào ứng dụng của bạn. Visual Studio .NET sẽ lo mọi chi tiết. Cách thứ hai là bạn cho mở command line rồi sử dụng trình tiện ích aximp .exe ñể nhập khẩu bằng tay ô control này, như theo hình 7-20: Trình tiện ích aximp.exe chỉ nhận một ñối mục là ActiveX control mà bạn muốn nhập khẩu (CalcControl.ocx). Nó sẽ tạo ra 3 tập tin: • • •
AxCalcControl.dll: một .NET Windows control CalcControl.dll: một proxy .NET class library AxCalcControl.pdb: một tập tin debug.
2.2 Thêm một ô control vào Visual Studio toolbox Một khi xong việc này, bạn có thể trở về cửa sổ Customize Toolbox, nhưng lần này chọn tab .NET Framework Components. Giờ ñây, bạn có thể rảo qua tìm nơi cư trú của .NET Windows control AxCalcControl.dll ñược kết sinh và cho nhập khẩu tập tin này vào toolbox. Một khi ñược nhập khẩu, ô control hiện lên trên trình ñơn toolbox.
Bây giờ bạn có thể lôi thả ô control này lên biểu mẫu Windows Form, mang tên mặc nhiên là axCalculator1. Bạn có thể sử dụng các hàm của ô control này giống như trên thí dụ Visual Basic 6.0. Bạn thêm các hàm thụ lý tình huống ñối với mỗi nút btnAdd, btnMultiply, btnSubtract và btnDivide. Thí dụ 7-09 cho thấy ñoạn mã của các hàm tài khoản tình huống:
Thí dụ 7-09: Thi công các hàm thụ lý tình huống dùng trắc nghiệm Windows Form ************************************************************************* private void btnAdd_Click(object sender, System.EventArgs e) { double left = double.Parse(textBox1.Text); double right = double.Parse(textBox2.Text); label1.Text = axCalculator1.Add(ref left, ref right).ToString(); } private void btnSubtract_Click(object sender, System.EventArgs e) { double left = double.Parse(textBox1.Text); double right = double.Parse(textBox2.Text); label1.Text = axCalculator1.Subtract(ref left,ref right).ToString(); } private void btnMultiply_Click(object sender, System.EventArgs e) { double left = double.Parse(textBox1.Text); double right = double.Parse(textBox2.Text); label1.Text = axCalculator1.Multiply(ref left,ref right).ToString(); } private void btnDivide_Click(object sender, System.EventArgs e) { double left = double.Parse(textBox1.Text); double right = double.Parse(textBox2.Text); label1.Text = axCalculator1.Divide(ref left,ref right).ToString(); }
Các trị vùng mục tin text ñược chuyển ñổi thành double sử dụng hàm hành sự static double.Parse(), rồi chuyển các trị này cho máy tình bỏ túi. Kết quả ñược ép về cho một chuỗi rồi cho hiển thị lên label. Kết quả cũng giống như trên hình 7-17. Bước kế tiếp là tìm hiểu sâu tiến trình chuyển ñổi và một số qui tắc ñặc trưng mà trình tiện ích tlbimp.exe sử dụng trong việc chuyển ñổi.