hn4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com
Full version available at http://4u.jcisio.com/r/article369.htm

Vovisoft

Ngày giờ

Các dạng của Ngày và Thì giờ

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.

Hai cách dùng Timer

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

Đợi một chút

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

Làm thùng rác cháy lửa nữa giây

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


hainam4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com