Dùng Function Format để lấy ngày giờ theo dạng bạn muốn. Thí dụ:
strToday = Format (Now(), "ddd dd-mmm-yyyy hh:nn:ss")
Now() cho ta hiện giờ (realtime lấy từ đồng hồ của CPU)
ddd cho Mon, Tue .vv..
mmm cho Jul, Feb .vv..
Nhớ dùng "nn" cho phút.
1. Timer có Interval tính bằng milliseconds. Khi Timer1 được Enabled (tức là Timer1.Enabled=True) nó sẽ chạy Sub Timer1_Timer mỗi Interval msecs.
Thí dụ ta muốn Label1 chớp tắt (blink):
Mã lệnh (VB) |
Timer1.Interval = 500 ' Nữa giây
Timer1.Enabled = True ' Bắt đầu chạy Timer1 cho hết interval Sub Timer1_Timer() Label1.Visible = NOT Label1.Visible End Sub |
Cứ mỗi nữa giây hễ Label1 đang hiện ra thì cho nó tàng hình và ngược lại.
Khi nào muốn ngưng chớp tắt thì dùng:
Mã lệnh (VB) |
Timer1.Enabled = False
Label1.Visible = True |
2. Để làm một việc trong tương lai, ta cũng dùng Timer nhưng ngay trong Sub Timer1_Timer ta để câu Timer1.Enabled = False để tắt Timer1 sau khi làm xong công chuyện. Thí dụ:
Mã lệnh (VB) |
Sub Timer1_Timer()
Timer1.Enabled = False ' Ngưng Timer1 ' Để code làm công chuyện tại đây End Sub |
Có khi ngay ở giừa code bạn muốn đợi (wait) một chút. Bạn có thể làm theo bài mẫu của Microsoft như sau:
Mã lệnh (VB) |
Dim PauseTime, Start, Finish, TotalTime
' Code đang làm việc nữa chừng PauseTime = 5 ' Set duration in seconds. Start = Timer 'Set start time as now Finish = Start + PauseTime ' set finish time Do While timer < Finish DoEvents ' Yield to other processes. Loop ' Code tiếp tục công việc |
Timer dùng ở đây là một Function có sẵn (in-built) của VB chớ không phải Control Timer. Timer cho ta số giây kể từ nừa đêm.
Ta dùng DoEvents để khỏi dành hết CPU time trong một closed Do While Loop. Nó nhường cho các process khác chạy trong khi chờ đợi Finish.
Khi bạn chạy một Closed Loop giống như trên và assign cho Label1 một Caption với value biến đổi để Feedback cho user biết tình hình diễn tiến đến đâu, nếu bạn không dùng DoEvents giống như nói trên, Label1 sẽ không có dịp 'refresh' để 'display' value mới của Label1.Caption.
Không biết bạn có để ý thấy cách chờ đợi như trên có thể gặp trở ngại nếu lúc bấy giờ là gần đến nừa đêm ít hơn 5 giây. Khi đó Finish sẽ lớn hơn 3600*24 giây và Timer sẽ không bao giờ đạt đến con số ấy để nhảy ra khỏi Loop. Giống như mình lập gia đình vậy, sẽ làm mọi suốt đời, không có lối thoát.
Một cách khác để giải quyết là ta nhờ một Timer1 chạy độc lập để cho biết khi nào thời gian đã trải qua (elapsed) bằng cách set một 'variable' tên blnElapsed ra True. blnElapsed phải được để trong phần General Declaration để cả code chính và Sub Timer1_Timer đều thấy nó.
#>
Dim blnElapsed as Boolean ' Declare in General section
Sub Timer1_Timer()
Timer1.Enabled = False
blnElapse = True
End Sub
' Code đang làm việc nữa chừng
blnElapsed = False
Timer1.Interval = 5000 ' Set duration in msecs.
Timer1.Enabled = True 'Start Timer1
Do
DoEvents ' Yield to other processes.
Loop Until blnElapsed
' Code tiếp tục công việc
#>
Cách nầy cũng được nhưng nó vẫn bắt chẹt (hold up) CPU và làm cản trở các processes khác (đây là giới hạn của VB).
Cách hoàn hảo nhất là ta đợi bằng cách dùng Timer1, nhưng đặt phần code còn lại để tiếp tục công việc ngay trong Sub Timer1_Timer.
Mã lệnh (VB) |
' Code đang làm việc nữa chừng
Timer1.Interval = 5000 ' Set duration in milliseconds. Timer1.Enabled = True 'Start Timer1 Sub Timer1_Timer() Timer1.Enabled = False ' Code tiếp tục công việc End Sub |
Trong khi xử lý, ta có thể biến hình của một Image bằng cách cho nó một Picture mới như:
Image1.Picture = LoadPicture("PictureName.bmp")
rồi bắt đầu một Timer với Interval bằng 500 milliseconds.
Đầu tiên đặt một Timer tên Timer1 lên Form. Vì lúc đầu Timer1.Interval bằng 0 nên Timer1 chưa chạy được (giống như Enabled = False)
Mã lệnh (VB) |
' Cho hình thùng rác cháy lửa
Image1.Picture = LoadPicture("TrashBinOnFire.bmp") Timer1.Interval = 500 Timer1.Enabled = True ' Nữa giây sau sẽ chạy Timer1_Timer Sub Timer1_Timer() Timer1.Enabled =False ' Ngưng Timer1 ' Cho hình thùng rác thường Image1.Picture = LoadPicture("TrashBin.bmp") End Sub |