25/05/2018, 08:51

Các câu hỏi nhỏ về visual basic

Sau đây là một số câu hỏi nhỏ của các bạn tôi, bạn có thể dùng chúng để tô điểm thêm cho ứng dụng Visual Basic của mình. Đây không phải là những điều cao siêu, lạ lẵm và cũng không phải là cách giải thích tối ưu nhưng nó giúp chúng ta hiểu thấu đáo ...

Sau đây là một số câu hỏi nhỏ của các bạn tôi, bạn có thể dùng chúng để tô điểm thêm cho ứng dụng Visual Basic của mình. Đây không phải là những điều cao siêu, lạ lẵm và cũng không phải là cách giải thích tối ưu nhưng nó giúp chúng ta hiểu thấu đáo được một số vấn đề. Hy vọng sau khi đọc xong bạn sẽ "à thì ra là vậy ! ..."

Thật ra chuyện này cũng dễ hiểu, bạn chỉ cần cắt chữ ở đầu đoạn văn bản và gắn nó vào cuối đoạn văn bản, làm liên tục như vậy sẽ tạo cho người dùng có cảm giác là dòng chữ đang chạy. Bạn hãy mở 1 form mới, trên đó tạo 1 textbox (Text1), gán 1 dòng văn bản vào thuộc tính text của textbox, tạo 1 timer (timer1).

Khi form load sẽ khởi động Timer với trị Interval = 100

Private Sub Form_Load()    Timer1.Interval = 100End Sub

Và timer sẽ xử lý các lệnh theo yêu cầu của bạn mỗi khi nó phát sinh 1 sự kiện thời gian.Private Sub Timer1_Timer()    Dim x As String    Dim y As String'gán x = 1 ký tự đầu dòng văn bản    x = Left(Text1.Text, 1)'gán y là phần còn lại    y = Right(Text1.Text, Len(Text1.Text) - 1)'Hiển thị trở lại textbox theo thứ tự ngược lại.    Text1.Text = y + xEnd Sub

Bạn có thể thay textbox bằng labelbox để người dùng không thể can thiệp vào dòng văn bản đang chạy, lúc này bạn phải thay đổi thuộc tính caption thay vì text của textbox.

Chỉ việc thêm đính lệnh này vào thủ tục tình huống FormLoad của form tương ứng.

Me.Move (Screen.Width - Me.Width)2, Screen.Height.Height - Me.Height)2

Làm thế nào để tạo hiệu ứng 3D ? 

Bạn hãy mở 1 form trống, trên đó tạo 1 image, vẻ 4 đối tượng Line. Khảo sát tình huống MouseMove của Image, khi rê mouse trên Image lập tức 4 đối tượng line sẽ hiển thị xung quanh Image. Còn 3D ư ? Bạn chỉ việc cho 2 line của cạnh phải và dưới màu đen (Line1, Line2), còn 2 line của cạnh trái và trên màu trắng (Line3, Line4).

Form khi thiết kế

Khi di chuyển Mouse trên form, mọi chuyện đều bình thường, 4 đối tượng Line không xuất hiện (thuộc tính Visible=False)

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)    Line1.Visible = False    Line2.Visible = False    Line3.Visible = False    Line4.Visible = FalseEnd Sub

Khi di chuyển mouse trên đối tượng Image, 4 line sẽ được xếp xung quanh và hiển thị lại bằng cách thay đổi các thuộc tính X1, Y1, X2, Y2 của line. Nhờ có màu sắc thích hợp nên ta có cảm giác Image nổi lên khi rê mouse đến.

Khi rê mouse đến 

Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)'Cạnh Phải    Line1.X1 = Image1.Left + Image1.Width    Line1.Y1 = Image1.Top    Line1.X2 = Image1.Left + Image1.Width    Line1.Y2 = Image1.Top + Image1.Height'Cạnh dưới    Line2.X1 = Image1.Left    Line2.Y1 = Image1.Top + Image1.Height    Line2.X2 = Image1.Left + Image1.Width    Line2.Y2 = Image1.Top + Image1.Height'Cạnh trái    Line3.X1 = Image1.Left    Line3.Y1 = Image1.Top    Line3.X2 = Image1.Left    Line3.Y2 = Image1.Top + Image1.Height'Phía trên    Line4.X1 = Image1.Left    Line4.Y1 = Image1.Top    Line4.X2 = Image1.Left + Image1.Width    Line4.Y2 = Image1.Top'Cho hiện lại 4 đối tượng Line    Line1.Visible = True    Line2.Visible = True    Line3.Visible = True    Line4.Visible = TrueEnd Sub

Khi nhấn Mouse trên Image, sự kiện MouseDown (nhấn mouse) phát sinh và đảo màu của 4 đối tượng line tạo cảm giác Image bị lõm xuống.

Và khi nhấn mouse

Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)    Line1.BorderColor = QBColor(7) 'Màu trắng    Line2.BorderColor = QBColor(7)    Line3.BorderColor = QBColor(0) 'Màu đen    Line4.BorderColor = QBColor(0)End Sub

Sau khi nhấn, thả mouse ra làm phát sinh sự kiện MouseUp, các lệnh cần xử lý trong sự kiện này là trả màu sắc lại như ban đầu.

Private Sub Image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)    Line1.BorderColor = QBColor(0)    Line2.BorderColor = QBColor(0)    Line3.BorderColor = QBColor(7)    Line4.BorderColor = QBColor(7)End Sub

Thấy có vẻ hơi cực khổ quá các bạn nhỉ ?

Khi viết một ứng dụng trong VB nếu không sử dụng thêm bất cứ một Custom Control nào ngoài các Control chuẩn của VB. Sau khi dịch thành file EXE, muốn chép sang máy khác bạn phải chép kèm theo 2 file thư viện chuẩn VB nằm trong thư mục System.

MSVBVM50.DLL (1.355.776 bytes)

CTL3D32.DLL (45.056 bytes)

Đây là 2 file thư viện cần thiết cho bất cứ ứng dụng nào viết bằng Visual Basic. Bởi vậy có nhiều khi file chương trình EXE của bạn chỉ vài ba chục Kb mà phải vác theo 2 file này quả là hơi bất tiện, tuy nhiên bạn có thể nén chúng lại cho nhỏ bớt, tôi đã thử và sau khi nén chỉ còn 655.557 bytes thay vì 1.400.832 bytes như lúc đầu.

Còn nếu trong ứng dụng của bạn có xài thêm các Custom Control thì nên lưu ý phải chép thêm các file tương ứng, có như vậy khi đem qua máy khác chương trình của bạn mới chạy được.

Khi bạn chọn một Custom Control trong hộp thoại Components thì file tương ứng sẽ được hiển thị ở phần Location, bạn hãy căn cứ vào đây mà tìm chép cho đúng. Các file này thường có phần mở rộng là DLL hay OCX nằm trong thư mục System (có thể mở bằng Visual C++).

Hãy chép chúng vào thư mục Windows, System, các thư mục đã được đặt đường dẫn PATH, hay cho chung vào cùng thư mục với file EXE của máy cần chạy chương trình của bạn.

Có thể dùng một chương trình tạo bộ đĩa Setup và chỉ định cho chúng chép thêm các file này, ví dụ như Create Install chẳng hạn. Đồng thời nếu có trình Setup, chương trình của bạn trông có vẻ đàng hoàng và chuyên nghiệp hơn (có thể tin cậy được).

Khi bạn viết một chương trình bằng Visual Basic, trong ứng dụng của bạn luôn xuất hiện một đối tượng tên là App, trong các thuộc tính của đối tượng App có 3 thuộc tính lưu giữ số phiên bản (Version). Ta có thể dễ dàng truy cập 3 thuộc tính này để biết được version của chương trình.

App.Major: Con số chính

App.Minor: Con số phụ

App.Revision: Con số này cho biết số lần bạn hiệu chỉnh và dịch lại chương trình.

Bạn có thể dùng một Msgbox để thể hiện Version của chương trình:

Msgbox "Version: " & App.Major & "." & App.Minor & App.Revision

Tuy nhiên bạn có thể để cho con số Revision tự động tăng mỗi lần dịch chương trình, vào  Project Properties, chọn tab Make và click chọn mục Auto Increment trong khung Version Number

Hoặc cho chương trình thể hiện phiên bản lên Caption của Form khi Load

Private Sub Form_Load()    Me.Caption = Me.Caption & " - Ver " & App.Major & "." & App.Minor & App.RevisionEnd Sub

Bạn có để ý khi khởi động Visual Basic không ? Ttrước khi chương trình Visual Basic được khởi động thường có một khung như sau hiện ra trong chốc lát lại biến mất và VB sẵn sàng cho bạn làm việc. Không chỉ Visual Basic không đâu, hầu như tất cả các phần mềm hiện nay đều có màn hình này.

Khung đó ta gọi là màn hình Splash Screen, được cho hiển thị trong lúc khởi động nhằm tránh cho người dùng đỡ sốt ruột trong khi chương trình nạp dữ liệu hoặc thực hiện các lệnh cần thiết, trên đó thông báo các vấn đề về bản quyền, phiên bản, logo ... Khi chương trình đã sẵn sàng làm việc màn hình này tự động biến mất.

Trong VB màn hình Splash này thật ra cũng là một Form nhưng không hiển thị thanh tiêu đề, được nạp lên màn hình từ thủ tục tình huống FormLoad của 1 form nào đó trong chương trình (thường là Form chính - form sẽ luôn luôn được hiện dịch trong suốt quá trình làm việc).

Private Sub Form_Load()

Me.ShowfrmSplash.ShowDoEvents

<Các lệnh cần thực hiện khi khởi động chương trình>

Unload frmSplash

End Sub

Me.Show: bắt chương trình vẽ form chính lên màn hình. Bạn có thể ghi Show cũng được vì lệnh Show mặc nhiên tác động lên form hiện hành khi không dược chỉ rõ đối tượng.

frmSplash.Show: Cho hiển thị màn hình Splash (bạn lưu ý: cho đến lúc này frmSplash vẫn chưa hiện lên mặc dù đã gọi)

DoEvents: Chờ cho Windows hiển thị hoàn tất frmSplash lên màn hình.

Sau lệnh DoEvents là tập hợp các lệnh cần xử lý trong khi chương trình khởi động.

Cuối cùng là lệnh Unload frmSplash có tác dụng đóng màn hình Splash Screen lại. Lúc này chương trình đã sẵn sàng cho người dùng.

Ngôn ngữ lập trình Visual Basic ngày càng trở nên phổ biến, được rất nhiều người quan tâm tới. Trong vòng 2 năm trở lại đây bắt đầu xuất hiện khá nhiều sách viết về ngôn ngữ này tạo điều kiện cho chúng ta tìm hiểu, theo tôi dự đoán trong vài năm tới nó sẽ thông dụng như Word, Excel vậy. Cách thức lập trình trong ngôn ngữ này rất gần gũi với Windows (bạn sẽ hiểu Windows sâu sắc hơn khi lập trình bằng ngôn ngữ này). Nếu bạn đã học Microsoft Access thì đừng nên bỏ qua ngôn ngữ lập trình "thần tốc" này. Mặc dù chương trình được viết ra chạy không hiệu quả bằng những ngôn ngữ khác nhưng với nó bạn có thể tạo ra một ứng dụng Windows nhanh và dễ dàng như ... "nấu một gói mì ăn liền" lúc này vấn đề hiệu quả có thể tạm cho qua.

Nếu bạn muốn tìm hiểu căn bản về Visual Basic thì nên chọn quyển "Tự học lập trình Visual Basic 5" của tác giả Phạm Thùy Nhân, còn nếu chịu khó thì hãy tìm những quyển sách của Samis, thậm chí trong lúc đi xem sách tôi thấy có quyển ghi là: "chưa biết gì, đọc sách, gấp sách lại, thành chuyên gia" nữa đấy.

[Combo box tự hiện danh sách] [Form Layout]

Nếu các bạn dùng các phiên bản Enterprise - 32bit của Visual Basic, thì có sẵn 1 Custom control cho phép bạn tạo nhanh một Progress bar theo mốt của Windows 9.x trông rất đơn sơ nhưng chuẩn mực

Còn ở đây tôi xin trình bày cách tự chế Progress bar bằng các control chuẩn của Visual Basic (Picture box), cách này đặc biệt hữu ích cho các bạn còn dùng phiên bản vb 16bit hay không muốn vác theo file COMCTL.OCX (MSCOMCTL.OCX) kích thước trên dưới 1Mb kèm theo ứng dụng của mình.

Bạn hãy tạo 2 Picture box lồng vào nhau, di chuyển vị trí Picture box bên trong, chọn màu sắc cho thích hợp. Còn để nó chạy được ư ? bạn hãy tăng (hoặc giãm) độ rộng của Picture box bên trong, cực đại khi độ rộng Picture box bên trong = bên ngoài, cực tiểu khi độ rộng Picture box bên trong = 0.

Phía trên là đồ xịn, phía dưới là hàng tự chế.

Bạn thấy không cũng ngang ngữa chớ bộ, không những thế hàng tự tạo còn cho phép chúng ta thay đổi màu sắc một cách vô tư, muốn xanh đỏ tím vàng đều được cả, về khả năng này thì đồ xịn rất khó thực hiện nếu không muốn nói là không được.

Để minh họa tôi đã dùng một Timer (Timer1) và 2 Picture box (Picture1 và Picture2), Picture2 màu xanh nằm trong Picture1 màu xám. Cùng với đoạn mã sau:

Option Explicit

Private Sub Form_Load()

Picture2.Width = 0Timer1.Interval = 1000

End Sub

Private Sub Timer1_Timer()

If Picture2.Width < Picture1.Width Then

Picture2.Width = Picture2.Width + Picture1.Width 20

Else

Timer1.Interval = 0MsgBox "Đã 20 giây trôi qua rồi đấy !"End

End If

End Sub

Khi chạy thử chương trình bạn sẽ thấy Progress bar của chúng ta thay đổi mỗi giây 1 lần, cho đến hết 20 giây, thông báo bằng hàm MsgBox nếu bạn click OK thì nó goodbye bạn luôn.

Làm thế nào để 1 combo box tự động hiện danh sách khi nhận được focus, mà không cần người dùng click chuột ?

[Tự tạo Progress bar] [Form Layout]

Combo box dễ thấy nhất trong các thảo trình là hộp chọn font như hình dưới đây.

Để làm được việc này, bạn cần nhớ lại tổ hợp phím tắt để mở một combo box trong Windows là ALT - DownArrow (Mũi tên xuống). Do đó ta chỉ cần làm sao cho combo box nhận được tổ hợp phím ALT + DownArrow là êm chuyện.

Rất dễ dàng bạn hãy cho lệnh Sendkeys gởi 1 tổ hợp phím ALT - DownArrow từ thủ tục tình huống GotFocus của Combo box cần mở.

Hãy tạo 1 form mới trên đó tạo một control nào đó ví dụ như CommandButton, kế đến bạn hãy tạo 1 Combo box. Lý do bạn phải tạo Command button trước để cho nó có focus trước (TabIndex = 0), khi chạy chương trình bạn hãy nhấn phím Tab để chuyển focus sang cho combo box, lúc này bạn sẽ thấy rất rõ tác dụng của lệnh SendKeys.

Private Sub Combo1_GotFocus()

SendKeys "%{DOWN}"

End Sub

Câu lệnh SendKeys "%{DOWN}" dùng để gởi tổ hợp phím ALT - DownArrow lên Combo box khi chính nó nhận được Focus do người sử dụng dịch chuyển bằng phím Tab hay bằng Mouse. Sẽ làm cho combo box tự động mở ra (hiện danh sách).

Thủ thuật này hữu ích khi bạn viết các ứng dụng có yêu cầu nhập dữ liệu, thường thì người dùng nhập dữ liệu bằng bàn phím, sau đó nhấn phím Tab đến một combo box, nó sẽ bung ra ngay để người dùng chọn lựa, rất tiện dụng, khiến cho người ta cảm thấy rất hài lòng về chương trình của mình.

[Tự tạo Progress bar] [Combo box tự hiện danh sách]

Đây là một trong những tính năng mới của Visual Basic 5 & 6, giúp cho lập trình viên dễ dàng phân bố các form trên màn hình khi chương trình thực thi một cách rất trực quan. Vào View Form Layout Windows, hay click vào Icon trên toolbar để hiển thị cửa sổ Form Layout nếu chưa xuất hiện.

Để sử dụng các chức năng trên cửa sổ này, bạn hãy right click trên cửa sổ để bật menu Popup gồm các mục chọn sau:

Resolution Guides: Hiển thị độ phân giải màn hình (chỉ hiển thị các độ phân giải thấp hơn độ phân giải mà màn hình đang sử dụng).

Dockable: Hiển thị Form Layout bằng một cửa sổ riêng hay nằm chung với các cửa sổ Project, Properties.

Hide: đóng cửa sổ Form Layout.

Startup Position: Vị trí form hiển thị trên màn hình

Manual: Tự bạn thiết lập, bằng cách rê form có tên tương ứng, và dựa vào các Resolution Guides để biết rõ vị trí form sẽ xuất hiện trên màn hình khi chạy chương trình.

Center Owner: Nằm giữa form đã gọi nó.

Center Screen: Nằm giữa màn hình ở bất kỳ độ phân giải nào.

Windows Default: Theo chuẩn của Windows, nằm hơi chệch về góc trái trên của màn hình.

Mỗi form trong giai đoạn thiết kế, muốn hiển thị trên cửa sổ Form Layout bạn phải mở form đó lên, nó sẽ xuất hiện trên cửa sổ Form Layout bằng tên tương ứng, vị trí thực của nó sẽ xuất hiện trên màn hình lúc chạy được phản ảnh rất chính xác trong cửa sổ này.

Xưa nay người ta có quan niệm là ngôn ngữ lập trình Visual Basic "bị yếu" hơn các ngôn ngữ khác do không có các hàm, thủ tục can thiệp đến các thông tin cấp thấp của hệ thống như ngôn ngữ C. Nhưng cũng chính Visual Basic đã bù vào sự thiếu hụt đáng tiếc của mình bằng cách liên kết và sử dụng các hàm API (Application Programmer's Interface) có sẵn trong Windows qua câu lệnh Declare. Giúp cho ta làm được khối việc tưởng chừng như vô vọng. Thật ra các hàm API này được tạo ra bằng ngôn ngữ C do đó ta có thể tận dụng được các khả năng của C trong Visual Basic. Các hàm API tồn tại dưới dạng file có phần mở rộng là DLL hay EXE trong thư mục System. Ơở các bài viết sau chúng ta sẽ cùng nhau tìm hiểu về các API tuyệt vời này. Một ứng dùng Visual Basic viết đàng hoàng, chạy ngon lành thì đố ai nhìn mà biết được bạn viết bằng ngôn ngữ nào (bạn lưu ý chỉ cho người ta nhìn thôi nhé).

Chức năng Wordwrap / Mẫu hàm API

Có rất nhiều cách gọi trình duyệt Internet Explorer của Windows. Ơở đây tôi xin bày cho bạn 1 cách đơn giản nhất. Để chạy một chương trình khác từ Visual Basic, bạn buộc phải dùng hàm Shell(), đối số là gì, đó mới là điều quan trọng.

Thường IE nằm ở Program FilesInternet ExplorerIExplorer.exe thư mục Program Files nằm cùng ổ đĩa với thư mục Windows. Tóm lại, ta tìm thư mục Windows ở ổ đĩa nào, sau đó lấy 2 ký tự đầu tiên là tên ổ đĩa (Vi dụ C:), kế đến bạn hãy ghép với "Program FilesInternet ExplorerIExplorer.exe" để được đường dẫn đến IE rõ ràng. Tuy nhiên cách này sẽ "phá sản" nếu như người dùng "ngẫu hứng" cài IE ở một thư mục khác.

Có một cách khác hơi "mánh mung" một chút, nhưng đơn giản hơn và triệt để hơn rất nhiều. Bạn có thể "xí gạt" Windows để gọi IE thông qua Windows Explorer bằng cách chuyển cho nó một tham số là file htm, lúc này tự động Windows Explorer nhận biết và "alô" đến cho IE để vào thế chỗ. Vậy cũng xong chuyện, việc gọi Windows Explorer rất đễ dàng

Thí dụ: Cần gọi IE để hiển thị file "testfile.htm" bạn có thể dùng hàm Shell() như sau:

Shell("explorer.exe testfile.htm",vbNormalFocus)

Lưu ý: cách này đòi hỏi hệ thống bạn phải có Internet Explorer 4 trở lên.

Thật là đơn giản phải không bạn ?

0