Thursday, October 29, 2009

Thủ thuật nhỏ trong VB p5

Thêm một đối tượng trong lúc chương trình thực thi

Ngoài các Control trong lúc thiết kế chương trình được bạn tạo ra, trong lúc chương trình đang thực thi (chạy) bạn vẫn có thể tạo thêm các Control một cách khá dễ dàng với điều kiện như sau để tạo nên một mảng các Control.

- Phải có tối thiểu 1 Control ban đầu

- Có thuộc tính Index = 0

Trong lúc chương trình chạy bạn có thể dùng câu lệnh sau đây để Load một Control lên. Khi Control được Load lên nó sẽ mang các thuộc tính giống hệt với cái ban đầu chỉ trừ chỉ số Index. Bạn hãy dùng lệnh sau để Load. Với Index là chỉ số của phần tử kế tiếp trong mảng

Load object(index)

Visual Basic chỉ cho phép bạn Load đến 32767 (Giới hạn của Integer) phần tử trong một mảng mà thôi.

Sau đây là một thí dụ minh họa cách thêm CommandButton

- Bạn hãy tạo một CommandButton, đặt thuộc tính Name = cmdBtn và Index = 0 (zero). Khi bạn nhập vào thuộc tính Index của một con số cũng có nghĩa là bạn đã tạo một mảng các đối tượng đó.

- Paste vào đoạn Code sau:

Private Sub cmdBtn_Click(Index As Integer)

Dim btn As CommandButton

Dim iIndex As Integer

iIndex = cmdBtn.Count

If iIndex <= 32767 Then

Load cmdBtn(iIndex)

Set btn = cmdBtn(iIndex)

With btn

.Top = cmdBtn(iIndex - 1).Top + 620

.Caption = "Command" & iIndex + 1

.Visible = True

End With

Set btn = Nothing

End If

End Sub

Nhấn F5 chạy thử chương trình, Click chuột vào CommandButton bạn sẽ thấy một CommandButton nữa xuất hiện phía dưới.


Nhờ ToolTip để hiển thị dữ liệu quá dài trong ListBox

Bạn có khi nào bạn gặp trường hợp Item cần hiển thị trong ListBox lại dài hơn bề rộng của Listox không ?

Trong rất dị hợm phải không ? Tự nhiên mất khúc đuôi của người ta.

Và đây là giải pháp. Bạn hãy dùng một ToolTip, nội dung của ToolTip chính là nội dung Item của ListBox mỗi khi bạn rê Mouse đến.

Hãy mở 1 form mới, trên đó tạo 1 ListBox (Name: List1). Tôi phải dùng đến hàm API SendMessage và hằng (LB_ITEMFROMPOINT = &H1A9) để làm việc này.

Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long,ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Private Const LB_ITEMFROMPOINT = &H1A9

Ơở thủ tục tình huống Form_Load() bạn hãy thêm vào vài dòng lệnh để Add vào ListBox (Nhớ cho dòng dữ liệu dài dài một chút để thấy rõ tác dụng).

Private Sub Form_Load()
List1.AddItem "Tao bo dia cai dat phan mem"
List1.AddItem "Su dung Font Navigator"
List1.AddItem "Tao man hinh Splash Screen"
List1.AddItem "EditPlus (Text/HTML Editor for Windows)"
List1.AddItem "Tu tao Progress bar cho ung dung"
List1.AddItem "Combo box tu hien danh sach khi nhan focus"
List1.AddItem "Cua so FormLayout dung de lam gi"
End Sub

'Khi rê mouse trên ListBox, thủ tục sau đây sẽ lấy nội dung của Item tại vị trí Mouse và cho hiện lên bằng ToolTip.

Private Sub List1_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
    Dim lXPoint As Long
    Dim lYPoint As Long
    Dim lIndex As Long

If Button = 0 Then 'Nếu không có nút nào được nhấn

          lXPoint = CLng(X / Screen.TwipsPerPixelX)
          lYPoint = CLng(Y / Screen.TwipsPerPixelY)

With List1

lIndex = SendMessage(.hwnd,LB_ITEMFROMPOINT,0, _
ByVal ((lYPoint * 65536) + lXPoint))

'Hiện ToolTip hoặc xóa cái trước đó

If (lIndex >= 0) And (lIndex <= .ListCount) Then

                  .ToolTipText = .List(lIndex)
                Else
                  .ToolTipText = ""
                End If
          End With
    End If
End Sub
 

Làm sao để TextBox tự động Select văn bản mỗi khi nhận focus ?

Bạn có chú ý ở hầu hết các phần mềm, nếu người dùng cần nhập liệu vào một hộp văn bản (TextBox) nào đó, thì khi người dùng nhấn Mouse hoặc Tab để chuyển đến TextBox, tức thì toàn bộ dữ liệu đang hiện có trong TextBox sẽ được Select. Cách này giúp người dùng gõ dữ liệu khác đè lên dữ liệu hiện hữu, mà không phải mất công xóa đi rồi gõ lại cái khác.

Viết một thủ tục riêng, thủ tục này nhận đối số là một TextBox

Public Sub FocusMe(ctlName As TextBox)
    With ctlName
        .SelStart = 0
        .SelLength = Len(ctlName)
    End With
End Sub

'Bây giờ bạn hãy gọi hàm này trong thủ tục tình huống GotFocus của một TextBox

Private Sub txtFocusMe_GotFocus()

    Call FocusMe(txtFocusMe)
End Sub

Hy vọng những câu hỏi nhỏ này sẽ giúp ích cho bạn trong lúc phát triển một ứng dụng bằng Visual Basic. Chúc bạn thành công.

No comments:

Post a Comment