CÁC N ỘI DUNG TRÌNH BÀY 
CHƯƠNG I. Công cụlập trình.8
I.1. Làm quen với giao diện Visual Basic.8
I.2. Ngôn ngữVisual Basic.27
I.3. Kỹnăng gỡrối chương trình (debug).51
I.4. Sửdụng ActiveX trong Visual Basic.54
I.5. Kết nối cơsởdữliệu với ADO.61
I.6. Các hàm API cơbản.68
CHƯƠNG II. Thiết kếphần mềm.73
II.1. Khái quát vềUML.73
II.2. Rational Rose.77
II.3. Use case diagram.78
II.4. Biểu đồtương tác (Interaction diagram).81
II.5. Class diagram.83
II.6. Biểu đồthành phần (Component diagram).87
II.7. Ví dụáp dụng.88
CHƯƠNG III. Đồhọa.106
III.1. Mục đích.106
III.2. Các chức năng chính của 1 hệ đồhọa.106
III.3. Sửdụng VDraw Component.106
CHƯƠNG IV. Trợgiúp và đóng gói.115
IV.1. Lập trợgiúp với RoboHelp.115
IV.2. Đóng gói với InstallSheld.115
IV.3. Tạo film demo với WinCam.115
Tài liệu tham khảo.116
                
              
                                            
                                
            
 
            
                 116 trang
116 trang | 
Chia sẻ: maiphuongdc | Lượt xem: 2047 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Tài liệu hướng dẫn Thực tập tốt nghiệp (ngành Tin học Xây dựng), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
s Set... 
= New... 
firstForm và secondForm còn được gọi là các instances của Class frmMyForm. Class giống 
như cái khuôn, còn Objects gi ống như những cái bánh làm t ừ khuôn ấy. Chắc bạn đã để ý 
thấy trong VB6 t ừ dùng hai t ừ Class và Object l ẫn lộn nhau. Đều này c ũng không quan 
trọng, miễn là bạn nắm vững ý nghĩa của chúng. 
VB6 có hỗ trợ Class mà ta có thể triển khai và instantiate các Objects của nó khi dùng. Một 
Class trong VB6 có chứa data riêng của nó, có những Subs và Functions mà ta có th ể gọi. 
Ngoài ra Class còn có th ể Raise Events, tức là báo cho ta bi ết khi chuy ện gì x ảy ra bên 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 42 
trong nó. Cũng giống như Event Click của CommandButton, khi User clicks lên button thì 
nó Raise Event Click để cho ta x ử lý trong Sub myCommandButton_Click(), ch ẳng h ạn. 
Classtrong VB6 không có h ổ trợ Visual components, t ức là không có ch ứa những controls 
như TextBox, Label .v.v.. Tuy nhiên, ta có thể lấy những control có sẵn từ bên ngoài rồi đưa 
cho Object của Class dùng. 
I.2.7.3. Ví dụ - Xây dựng lớp clsBox 
Bây giờ chúng ta hãy b ắt đầu viết một Class. B ạn hãy m ở một Project m ới loại Standard 
EXE Visual Basic. Sau đó dùng Menu Command chọn Add Class Module: 
Khi Add Class Module dialog hiện ra chọn Class Module và click Open. 
Bạn s ẽ th ấy mở ra m ột khung tr ắng và Project Explorer v ới Properties Window. Trong 
Properties Window, hãy sửa Name property của Class thành clsBox như dưới đây: 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 43 
Kế đó đánh vào những dòng code dưới đây, trong đó có biểu diển cách dùng Class clsBox. 
Option Explicit 
Private mX As Integer 
Private mY As Integer 
Private mWidth As Integer 
Private mHeight As Integer 
Public Property Let X(ByVal vValue As Integer) 
 mX = vValue 
End Property 
Public Property Get X() As Integer 
 X = mX 
End Property 
Public Property Let Y(ByVal vValue As Integer) 
 mY = vValue 
End Property 
Public Property Get Y() As Integer 
 Y = mY 
End Property 
Public Property Let Width(ByVal vValue As Integer) 
 mWidth = vValue 
End Property 
Public Property Get Width() As Integer 
 Width = mWidth 
End Property 
Public Property Let Height(ByVal vValue As Integer) 
 mHeight = vValue 
End Property 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 44 
Public Property Get Height() As Integer 
 Height = mHeight 
End Property 
Public Sub DrawBox(Canvas As Object) 
 Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), , B 
End Sub 
Public Sub ClearBox(Canvas As Object) 
 Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), Canvas.BackColor, B 
End Sub 
Class clsBox có 4 thuộc tính: X, Y, Width và Height. Ta sẽ tạo một Object Box từ clsBox. 
Mỗi Box có tọa độ (X,Y) và kích thước chiều rộng và chiều cao (width, height) của nó. Thật 
ra ta có th ể khai báo các bi ến X, Y, Width và Height đơn giản hơn bằng từ khóa Public. 
Nhưng ở đây ta cố ý khai báo chúng là Private, dưới dạng mX, mY, mWidth và mHeight. 
Khi ta muốn thay đổi các trị số của chúng, cũng dùng lệnh gán như bình thường. Nhưng khi 
chương trình x ử lý l ệnh gán (ví d ụ myBox.X=80), nó s ẽ g ọi m ột ch ương trình con là 
Property Let X (vValue) với vValue có giá trị 80. 
Khác với phép gán thường, trong Property Let chúng ta có th ể thực hiện các phép ki ểm tra 
trước khi gán hoặc thực hiện các lệnh thể hiện sự thay đổi của đối tượng tương ứng với lệnh 
gán (ví d ụ khi thay đổi thu ộc tính Caption c ủa CommandButton b ằng l ệnh gán 
cmdSwitch.Caption = "On" chúng ta th ấy ngay lập tức sự thay đổi được thể hiện trên màn 
hình). Đó là vì trong ch ương trình con Property Let c ủa Caption có c ả đoạn mã cho phép 
hiển thị lại caption của đối tượng. 
Ngược lại, khi ta dùng thuộc tính X của đối tượng myBox, không phải ta chỉ đọc trị số thôi 
mà còn g ọi cả cái ch ương trình con Property Get X . Nói tóm l ại, Property Get, Property 
Let cho ta c ơ hội để execute một method mỗi khi chương trình đọc hay viết lên tr ị số của 
thuộc tính tương ứng ấy. 
Thí dụ như nếu ta muốn kiểm soát để chỉ chấp nhận trị số tọa độ X mới khi nó không phải là 
số âm. Ta sẽ sửa Property Let X lại như sau: 
Public Property Let X(ByVal vValue As Integer) 
 If (vValue >= 0) Then 
 mX = vValue 
 End If 
End Property 
Property có thể là Read Only hay Write Only. Nếu muốn một Property là Read Only thì ta 
không cung cấp Property Let. Nếu muốn một Property là Write Only thì ta không cung c ấp 
Property Get. Ngoài ra nếu làm việc với Object, thay vì Data type thông thường, thì ta phải 
dùng Property Set, thay vì Property Let. 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 45 
Thí dụ ta cho clsBox một Property mới, gọi là Font dùng object của class stdFont của VB6. 
Trong clsBox ta declare m ột Private variable mFont và vi ết một Property Set Font như 
sau: 
Private mFont As StdFont 
Public Property Set Font(ByVal newFont As StdFont) 
 Set mFont = newFont 
End Property 
Ta sẽ dùng property Font của myBox (thuộc Class clsBox) như sau: 
' Declare an object of Class StdFont of VB6 
Dim myFont As StdFont 
Set myFont = New StdFont 
myFont.Name = "Arial" 
myFont.Bold = True 
Dim myBox As clsBox 
Set myBox = New clsBox 
Set myBox.Font = myFont ' Call the Property Set method 
Class clsBox có hai Public Subs, DrawBox và ClearBox. ClearBox cũng vẽ một box như 
DrawBox, nhưng nó dùng BackColor của màn ảnh (canvas), nên coi như xóa cái box có sẵn. 
Do đó, nếu muốn, bạn có thể sửa Sub DrawBox lại một chút để nhận một tham số Optional 
(tham số cho phép nhập hoặc không nhập giá trị) là fColor như sau: 
Public Sub DrawBox(Canvas As Object, Optional fColor As Long) 
 If IsMissing(fColor) Then 
 Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), , B 
 Else 
 Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), fColor, B 
 End If 
End Sub 
Trong thí dụ trên, tham số fColor được kiểm tra xem người dùng có nhập giá trị hay không 
bằng bằng hàm IsMissing. Nếu fColor là BackColor c ủa canvas thì ta s ẽ có hi ệu quả của 
ClearBox. 
Trong form chính c ủa chương trình dùng để test clsBox, m ỗi khi ta refer đến một object 
thuộc class clsBox, IDE Intellisense sẽ hiển thị các Properties và Subs/Functions của clsBox 
như trong hình dưới đây: 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 46 
Trong chương trình này, mỗi khi ta click nút Draw thì sẽ tạo ra một đối tượng Box mới, cho 
tọa độ X,Y và kích thước Width, Height, rồi được vẽ ra ngay trên form. T ừ khóa Me trong 
đoạn chương trình này nói đến đối tượng chứa đoạn code đó, tức là frmClass. 
Để cho ch ương trình thú v ị hơn, khi user clicks nút Animate, ta s ẽ cho m ột box màu đỏ 
chạy từ trái qua phải. 
Khi user clicks nút Two Boxes ta sẽ vẽ hai box, hộp trong màu xanh, hộp ngoài màu đỏ, và 
cho chúng chạy từ trái sang ph ải. Ở đây ta biểu diễn cho thấy mình muốn tạo ra bao nhiêu 
đối tượng box từ lớp clsBox cũng được, và d ĩ nhiên mỗi box có m ột bộ các thuộc tính với 
giá trị riêng của nó. 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 47 
Ta có th ể lập trình để cho đối tượng báo cáo ch ương trình ch ủ của nó khi có m ột biến cố 
(Event) xảy ra bên trong đối tượng đó. 
Ta thử khai báo một Event tên Draw trong clsBox, và viết code để mỗi khi chương trình gọi 
hàm DrawBox đối tượng sẽ phát sinh (Raise) một sự kiện Draw. 
' Khai báo event Draw 
' Event này có 2 tham số X, Y là số Integer 
Public Event Draw(X As Integer, Y As Integer) 
Public Sub DrawBox(Canvas As Object, Optional fColor As Long) 
 If IsMissing(fColor) Then 
 Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), , B 
 Else 
 Canvas.Line (mX, mY)-(mX + mWidth, mY + mHeight), fColor, B 
 End If 
 ' Phát sinh sự kiên Draw với 2 tham số mX, mY của đối tượng Box 
 RaiseEvent Draw(mX, mY) 
End Sub 
Bây giờ, trong frmClass thay vì chỉ khai báo 
Dim myBox As clsBox 
Ta sẽ khai báo như sau 
Private WithEvents myBox As clsBox 
Ngay sau đó, chữ myBox sẽ hiện ra trong danh sách các đối tượng có Event c ủa frmClass. 
Sau đó ta s ẽ vi ết code để xử lý m ỗi khi đối tượng myBox phát sinh s ự ki ện Draw c ủa 
myBox, tức là ta cung c ấp code cho Private Sub myBox_Draw (X As Integer, Y As 
Integer). Ở đây ta chỉ hiển thị một MsgBox thông báo myBox vừa được vẽ ở đâu. 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 48 
Khi chạy chương trình, mỗi lần một đối tượng box thuộc lớp clsBox gọi đến Sub DrawBox 
ta sẽ thấy có thông báo như dưới đây (chứng tỏ rằng Sub myBox_Draw đã được gọi khi đối 
tượng myBox được vẽ và phát sinh sự kiện Draw) 
Nhớ rằng, ta khai báo một object với từ khóa WithEvents khi ta muốn xử lý các các sự kiện 
của nó. Trong thí dụ trên frmClass chứa đối tượng myBox và nó nhận được các Event Draw 
của myBox thông qua Sub myBox_Draw. 
I.2.8. Làm việc với file 
Để lưu dữ li ệu ra file, có 2 ph ương pháp: l ưu ki ểu v ăn b ản (text) và l ưu ki ểu nh ị phân 
(binary). Do đặc thù c ủa các ph ần m ềm xây d ựng thường làm vi ệc với các file v ăn b ản, 
trong tài liệu này chúng tôi chỉ giới thiệu các phương thức làm việc với file văn bản. 
I.2.8.1. Mở file 
Khi mở file text, có 3 chế độ mở file sau: 
- Đọc các ký tự từ file (Input) 
- Ghi các ký tự ra file (Output) 
- Ghi thêm các ký tự vào cuối file đã có (Append) 
Cú pháp lệnh mở file 
Open For [Input | Output | Append] As [Len = buffersize] 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 49 
Khi mở file ở chế độ Input, file ph ải tồn tại, nếu không, chương trình sẽ phát 
sinh lỗi. Khi đó ph ải sử dụng các l ệnh b ắt lỗi (xem ph ần gỡ rối). Các ch ế độ Output và 
Append sẽ tự tạo file mới nếu như file này chưa có trên ổ đĩa. 
Các file sau khi m ở phải được đóng lại bằng lệnh Close, nhất là đối với các chế độ Output 
và Append (nếu bạn không đóng lại thì các thông tin ghi ra file sẽ bị mất). 
I.2.8.2. Đọc file 
Để đọc thông tin từ file text, mở file ở chế độ Input, sau đó sử dụng các lệnh Line Input #, 
Input( ), hoặc Input # để đọc thông tin từ file vào các biến trong chương trình. 
Đoạn code dưới đây đọc từng dòng vào từ file, nối chúng lại thành một xâu ký tự chứa toàn 
bộ nội dung của file. 
Dim FileNum As Integer 
Dim LinesFromFile, NextLine As String 
FileNum = FreeFile 
Open "" For Input As FileNum 
Do Until EOF(FileNum) 
 Line Input #FileNum, NextLine 
 LinesFromFile = LinesFromFile + NextLine + Chr(13) + Chr(10) 
Loop 
Close FileNum 
Bạn có thể sử dụng lệnh Input # đọc một loạt các biến (số, xâu ký tự...) 
Input #FileNum, name, street, city, state, zip 
Bạn có thể sử dụng hàm Input để đọc n ký tự liên tiếp từ file 
LinesFromFile = Input(n, FileNum) 
I.2.8.3. Ghi file 
Để ghi giá tr ị các biến ra file, m ở file ở chế độ Output (hoặc Append), sau đó sử dụng các 
lệnh Print # để in các giá trị ra file. Chú ý rằng cách lệnh này sẽ in mỗi giá trị (xâu ký tự, số) 
trên 1 dòng. Như vậy, muốn in nhiều giá trị trên 1 dòng với lệnh Print # thì bạn chuyển tất 
cả thành xâu ký tự, nối chúng lại với nhau rồi in xâu ký tự kết quả đó ra. 
Print #FileNum, TheBox.Text 
AnyString = "AnyCharacters" 
AnyNumber = 23445 
Lines = AnyString & " " & AnyNumber 
Print #FileNum, Lines 
Như đã đề cập ở trên, có th ể sử dụng lệnh Input # để đọc liên ti ếp các giá tr ị từ file text. 
Tuy nhiên, chỉ có những file text được tạo bởi lệnh Write # mới đọc được bằng lệnh Input 
#. 
Dim AnyString As String, AnyNumber As Integer 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 50 
AnyString = "AnyCharacters" 
AnyNumber = 23445 
Write #FileNum, AnyString, AnyNumber 
Với đoạn lệnh ví dụ ở trên, file kết quả sẽ có nội dung như sau 
"AnyCharacters",23445 
Có nghĩa là các giá trị sẽ được ghi cách nhau bởi dấu phẩy, các giá trị xâu ký tự sẽ được đặt 
trong c ặp ngo ặc kép. Các c ấu trúc file text trong các ph ần m ềm phân tích k ết cấu thông 
dụng thường không theo c ấu trúc này. Vì v ậy, để làm việc với các file text này chúng ta s ẽ 
sử dụng các lệnh Line Input (đọc) và Print (ghi). 
I.2.8.4. Một số kỹ thuật sử dụng để đọc file text 
Phần này xin trình bày các k ỹ thuật đọc các cấu trúc file text mà chúng tôi th ường sử dụng. 
Phương pháp đơn giản nhất là s ử dụng các l ệnh Line Input để đọc từng dòng, sau đó sử 
dụng hàm split để tách dòng đó thành mảng các chuỗi ký tự. 
Trong đoạn chương trình ví d ụ sau, chúng tôi ti ến hành đọc các thông s ố tọa độ của các 
Joint của hệ kết cấu trong file s2k của SAP2000 v8. 
- Chương trình sẽ lần lượt đọc từng dòng của file s2k cho đến khi gặp dòng [TABLE: 
"JOINT COORDINATES"] 
- Sau đó chương trình ti ếp tục đọc từng dòng cho đến khi g ặp dòng tr ống, với mỗi 
dòng vì d ữ liệu được ghi theo t ừng cặp = nên chúng tôi s ử 
dụng hàm DocFile(s As String) để đọc từng cặp này. 
- Hàm DocFile phân tích xâu ký t ự s thành nhi ều cặp giá tr ị (sử dụng hàm split), v ới 
mỗi cặp giá tr ị lại sử dụng hàm split tách thành và , sau đó 
cặp dữ liệu này được đưa vào một Collection để xử lý. 
Option Explicit 
' Cấu trúc xâu s: " a=b c=d e=f... " 
' Trả về Collection DocFile với 
' DocFile(a) = b 
' DocFile(c) = d 
' DocFile(e) = f 
Private Function DocFile(s As String) As Collection 
 Dim i As Integer 
 Dim vals As Variant, v2 As Variant 
 Set DocFile = New Collection ' Khởi tạo Collection 
 vals = Split(s, " ") ' Tách xâu s thành mảng 
 For i = LBound(vals) To UBound(vals) 
 If vals(i) "" Then ' Chỉ xử lý với phần tử không rỗng 
 v2 = Split(vals(i), "=") ' Tách cặp thành 2 phần 
 DocFile.Add v2(1), v2(0) ' Đưa giá trị nhận được vào Collection 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 51 
 End If 
 Next 
End Function 
' Ví dụ về dữ liệu 
'.... 
'TABLE: "JOINT COORDINATES" 
' Joint=1 CoordSys=GLOBAL CoordType=Cartesian XorR=0 Y=0 Z=0 
SpecialJt=No GlobalX=0 GlobalY=0 GlobalZ=0 
' Joint=2 CoordSys=GLOBAL CoordType=Cartesian XorR=10 Y=0 Z=0 
SpecialJt=No GlobalX=10 GlobalY=0 GlobalZ=0 
' 
'TABLE: "CONNECTIVITY - FRAME" 
' Frame=1 JointI=1 JointJ=2 IsCurved=No Length=10 CentroidX=5 
CentroidY=0 CentroidZ=0 
'.... 
Private Sub Command1_Click() 
 Dim FileNum As Integer 
 Dim s As String, val As Collection 
 Dim x As Double, y As Double, z As Double 
 FileNum = FreeFile 
 Open "c:\1.s2k" For Input As #FileNum 
 Do While Not EOF(FileNum) 
 Line Input #FileNum, s 
 If s = "TABLE: ""JOINT COORDINATES""" Then 
 ' Dòng nhận biết bảng tọa độ nút 
 Do While Not EOF(FileNum) 
 Line Input #FileNum, s ' Đọc dòng kế tiếp 
 If Trim(s) = "" Then Exit Do ' Dừng nếu gặp dòng trống 
 Set val = DocFile(s) ' Đọc dữ liệu vào Collection 
 MsgBox val("GlobalX") & " " & val("GlobalY") & " " & val("GlobalZ")
 ' Hiển thị các dữ liệu đọc được 
 Loop 
 End If 
 Loop 
 Close FileNum 
End Sub 
I.3. Kỹ năng gỡ rối chương trình (debug) 
Gỡ rối chương trình (debug) là k ỹ năng cơ bản nhất đối với mỗi lập trình viên. Tuy nhiên, 
qua kinh nghiệm dạy và hướng dẫn sinh viên Tin học xây dựng làm đồ án tốt nghiệp, chúng 
tôi nhận thấy kỹ năng này của sinh viên là rất yếu (nếu không nói là gần như không có). 
Chương trình lập ra hoạt động không theo ý muốn của người lập trình (không hoạt động, có 
lỗi khi ch ạy, hoạt động nhưng không cho k ết quả đúng) là điều hết sức bình thường (có l ẽ 
nên coi đó là điều hiển nhiên). Khi ch ương trình ho ạt động không theo d ự kiến, cần phải 
khoanh vùng xem l ỗi có th ể phát sinh t ừ phần nào c ủa chương trình. Sau đó, sử dụng các 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 52 
công cụ gỡ rối để tìm hiểu hoạt động của chương trình tại vị trí đó để xác định cụ thể xem 
lỗi bắt nguồn từ đâu. 
Trong phần này xin gi ới thiệu những kiến thức và thao tác c ơ bản nhất để gỡ rối chương 
trình trong VB. 
I.3.1. Sử dụng MsgBox 
Một trong những công cụ đơn giản nhất để gỡ rối chương trình. MsgBox được sử dụng để 
hiển thị các giá tr ị trong khi chương trình đang hoạt động. Sau đây chúng ta cùng xem m ột 
ví dụ 
Private Sub Command1_Click() 
 Dim a As Integer 
 a = 10 
 a = a * a 
 a = a * a 
 a = a * a 
 MsgBox a 
End Sub 
Đoạn chương trình trên xem ra vô h ại, nhưng nếu bạn chạy nó sẽ báo lỗi. Nguyên nhân t ại 
sao? Để biết được điều này chúng ta sửa lại chương trình như sau 
Private Sub Command1_Click() 
 Dim a As Integer 
 a = 10 
 a = a * a 
 MsgBox a 
 a = a * a 
 MsgBox a 
 a = a * a 
 MsgBox a 
End Sub 
Khi chạy đoạn chương trình này, chúng ta sẽ thấy hộp thoại 100 hiện ra (đây là giá trị của a 
= 10 * 10). Click OK, h ộp thoại 10000 hi ện ra ti ếp theo ( đây là giá tr ị của a = 100*100). 
Click OK tiếp, chương trình báo l ỗi, có ngh ĩa là lệnh 10000*10000 không được thực hiện. 
Đến đây chúng ta có th ể biết được lỗi này xuất hiện do giá tr ị 10000*10000 vượt quá khả 
năng lưu trữ của số nguyên Integer. Để chương trình hoạt động đúng dự kiến, ta chỉ cần sửa 
Integer thành Long. 
I.3.2. Sử dụng cửa sổ Watch 
MsgBox tuy đơn giản, dễ dùng và t ương đối hiệu quả, nhưng không ph ải lúc nào c ũng có 
thể sử dụng. Xét ví dụ sau 
Private Sub Command1_Click() 
 Dim a As Integer 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 53 
 Dim i As Integer 
 a = 20000 
 For i = 1 To 20000 
 a = a + 1 
 Next 
End Sub 
Đoạn chương trình này c ũng phát sinh l ỗi, tuy nhiên n ếu bạn sử dụng MsgBox để hiển thị 
kết quả trong từng trường hợp thì sẽ là khủng khiếp khi bạn phải click OK cả vạn lần chỉ để 
tìm một lỗi. 
Trong trường hợp này, khi chương trình báo lỗi, bạn click vào nút Debug, ch ương trình sẽ 
quay trở lại IDE của VB với một giao diện như sau 
Trong đó, dòng "a=a+1" được hiển th ị với màu vàng và 1 m ũi tên bên trái, đây chính là 
dòng và thời điểm mà chương trình gặp lỗi. Vậy trong thời điểm này thì giá tr ị của a là bao 
nhiêu? Tại sao lệnh a=a+1 lại lỗi? 
Đề trả lời các câu h ỏi trên, chúng ta s ử dụng cửa sổ Watch để xem giá tr ị của biến a. Cách 
sử dụng như sau: bôi đen biến a, phải chuột tại vị trí đã bôi đen, chọn Add watch từ popup 
menu, hộp tho ại Add watch (hình trái) hi ện lên, click OK để theo dõi giá tr ị của bi ến a 
(hình phải). Cửa sổ Watches cho phép chúng ta bi ết được giá trị và kiểu của biến. Trong 
trường hợp này ta thấy a có giá trị 32767 (đây là giá trị lớn nhất của số Integer), có nghĩa là 
lệnh a=a+1 s ẽ phát sinh l ỗi tràn do giá tr ị vượt quá khả năng lưu trữ của số Integer. Cách 
sửa lỗi cũng giống ví dụ trước, tức là sử dụng kiểu biến Long có phạm vi giá trị lớn hơn. 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 54 
Chú ý: Với các giá trị biến đơn (số, xâu ký tự...) thì có thể xem giá trị của biến một cách rất 
dễ dàng b ằng cách để con tr ỏ chuột tại v ị trí tên bi ến, sau kho ảng vài giây s ẽ có m ột 
tooltip hiện lên cho bi ết giá trị của biến đó. Tuy nhiên cách này không th ể sử dụng với các 
biến kiểu phức (mảng, kiểu người dùng định nghĩa, object), khi đó sử dụng cửa sổ Watch là 
phương pháp hữu hiệu nhất. 
Ngoài cửa sổ Watch, một công cụ rất mạnh khác là Immediate Window (phím tắt Ctrl+G) 
cho phép bạn xem giá tr ị các biến, biểu thức, thực hiện các lệnh VB ngay lập tức trong khi 
đang gỡ rối chương trình. (Xem phần I.1.2.8) 
I.3.3. Đặt điểm dừng & chạy từng dòng lệnh 
Ở phần trên, chúng ta đã dừng chương trình lại để xem giá tr ị các bi ến, tuy nhiên vi ệc 
dừng chương trình là bị động (do có lỗi nên phải dừng lại). Trên thực tế, không phải lúc nào 
chương trình cũng phát sinh lỗi. Ví dụ như khi kết quả sai do thuật toán lỗi, khi đó phải chủ 
động dừng chương trình để quan sát giá tr ị các biến nhằm nắm được nguyên nhân của sai 
sót. Xét ví dụ sau: 
I.4. Sử dụng ActiveX trong Visual Basic 
ActiveX là công ngh ệ cho phép người lập trình Windows có th ể sử dụng các thành ph ần 
(component) do ng ười khác phát tri ển để áp d ụng trong ch ương trình c ủa mình. Công 
nghệ ActiveX cho phép ng ười phát triển tận dụng được lao động của người khác, không 
phải viết lại những chức năng thông dụng, tiết kiệm được rất nhiều sức lao động cũng như 
làm tăng đáng kể sức mạnh của các chương trình (vì được phát triển chuyên môn hóa). 
Tuy nhiên, mặt trái của việc sử dụng ActiveX là sự phức tạp khi cài đặt (rất hay xảy ra xung 
đột version giữa phiên bản được cài đặt mới và phiên bản đã có sẵn trong máy tính). Ngoài 
ra, tất cả các ActiveX của sinh viên sử dụng trong đồ án tốt nghiệp đều là những bản crack 
(có nghĩa là sinh viên đang vi phạm pháp luật). Chúng tôi đưa ra hướng dẫn sử dụng các 
ActiveX như là giải pháp tình th ế, trong tương lai sẽ tìm kiếm các component hợp pháp từ 
nguồn phần mềm miễn phí hoặc phần mềm nguồn mở hay các component do sinh viên 
trong Khoa tự phát triển. 
I.4.1. Các ActiveX thông dụng 
I.4.1.1. CommonDialog 
Các hộp thoại thông d ụng trên Windows (H ộp thoại mở file, h ộp thoại ghi file, h ộp thoại 
chọn font, hộp thoại in ấy, hộp thoại chọn màu...) 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 55 
Để đưa ActiveX này vào trong project, click ph ải chu ột trên h ộp ToolBox, ch ọn 
Components từ menu Popup. Trên h ộp thoại Components, đánh dấu vào m ục "Microsoft 
Common Dialog Controls". 
Sau đó trên ToolBox, ch ọn đối tượng CommonDialog để đưa vào form, v ới đối tượng 
này bạn có thể sử dụng để hiển thị các hộp thoại thông dụng của Windows. 
' Visual Basic 6.0 
' Uses a CommonDialog control. 
CommonDialog1.InitDir = "C:\Program Files" 
CommonDialog1.ShowOpen 
MsgBox CommonDialog1.FileName 
Tên thuộc tính Kiểu Mô tả 
DialogTitle String Tiêu đề của hộp thoại 
FileName String Tên file được chọn (open hoặc save) 
FileTitle String Tên file được chọn (không kèm theo đường dẫn) 
InitDir String Thư mục ban đầu khi bật hộp thoại lên 
MaxFileSize String Chiều dài lớn nhất cho phép lưu vào tên file (FileName) 
Tên thao tác Mô tả 
ShowColor Hiển th ị hộp thoại chọn màu (theo giá tr ị RGB) ho ặc chọn màu theo v ị trí trên b ảng 
màu 
ShowFont Hiển thị hộp thoại lựa chọn font chữ 
ShowHelp Hiển thị hộp thoại trợ giúp 
ShowOpen Hiển thị hộp thoại để lựa chọn file (mở file) 
ShowPrinter Hiển thị hộp thoại lựa chọn máy in và các thông số của máy in 
ShowSave Hiển thị hộp thoại Save as cho phép nhập vào tên file cần ghi 
I.4.1.2. VSFlexGrid 
Các ứng dụng trong ngành Tin học xây dựng thường liên quan rất nhiều đến bảng biểu. VB 
có cung cấp Grid control cho phép làm vi ệc với bảng biểu. Tuy nhiên, Grid control của VB 
không có đầy đủ các tính năng cần thiết cho các ứng dụng Tin học Xây dựng, các bạn có thể 
sử dụng VSFlexGrid ( để thực hiện các chức năng này. 
Với VSFlexGrid, có th ể thực hiện được rất nhiều chức năng: Đọc và l ưu dữ liệu trên file 
Text, Excel. Lưu trữ được một số lượng lớn các ô dữ liệu, cho phép cập nhật (edit)... 
Sau khi đã cài đặt VSFlexGrid, b ạn có th ể s ử d ụng b ằng cách đưa thêm component 
"ComponentOne VSFlexGrid 8.0 (Light) " vào trong ToolBox c ủa VB (các b ước chi ti ết 
xin xem trong ph ần CommonDialog). Chú ý r ằng với phiên bản mới nhất của VSFlexGrid, 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 56 
bạn có nhi ều lựa chọn: Nếu ứng dụng kết nối CSDL, có th ể chọn b ản OLEDB ho ặc bản 
DAO/RDO, nếu không thì chỉ cần sử dụng bản Light là đủ. 
Sau đó, đưa VSFlexGrid control từ ToolBox vào form để sử dụng. Dưới đây là ví dụ với 
grid control có tên là "VSFlexGrid1", ch ương trình t ạo ra b ảng có 3 dòng và 3 c ột (kể cả 
dòng và cột tiêu đề). Việc gán thông tin vào grid ch ỉ đơn giản là gán giá tr ị vào thuộc tính 
TextMatrix của control. 
Private Sub Form_Load() 
 With VSFlexGrid1 
 .Rows = 3 
 .Cols = 3 
 .TextMatrix(0, 0) = "So TT" 
 .TextMatrix(0, 1) = "Ho dem" 
 .TextMatrix(0, 2) = "Ten" 
 .TextMatrix(1, 0) = 1 
 .TextMatrix(1, 1) = "Nguyen Van" 
 .TextMatrix(1, 2) = "A" 
 .TextMatrix(2, 0) = 2 
 .TextMatrix(2, 1) = "Tran Thi" 
 .TextMatrix(2, 2) = "B" 
 .Editable = True 
 End With 
End Sub 
Khi số lượng các ô l ớn, việc gán dữ liệu vào từng ô có th ể gây chậm chương trình, bạn có 
thể sử dụng phương pháp khác là kết nối grid với một mảng 2 chiều các giá trị bằng cách sử 
dụng thao tác BindToArray: 
VSFlexGrid.BindToArray [ VariantArray As Variant ], [ RowDim As Long ], [ ColDim 
As Long ], [ PageDim As Long ], [ CurrentPage As Long ] 
Với thao tác BindToArray, dữ liệu sẽ được đưa rất nhanh từ mảng vào grid (nhanh hơn 
rất nhiều lần so với việc bạn gán từng giá tr ị cho từng ô trong grid). Ngoài ra, n ếu dữ liệu 
được bind vào (từ mảng [A]), sau đó thay đổi các thông số trong mảng [A], có th ể sử dụng 
thao tác Refresh để cập nhật (xem ví dụ dưới đây). 
Bộ môn Tin học Xây dựng – ĐHXD Tài liệu hướng dẫn thực tập tốt nghiệp 
 57 
Private Sub Command1_Click() 
 Dim Dong(2, 2) 
 With VSFlexGrid1 
 .Rows = 3 
 .Cols = 3 
 Dong(0, 0) = "STT": Dong(0, 1) = "Ho dem": Dong(0, 2) = "Ten"
            Các file đính kèm theo tài liệu này:
 Thuc_tap_Tin_hoc_xay_dung.pdf Thuc_tap_Tin_hoc_xay_dung.pdf