VB5 實戰講座

每週一問: 挑戰您的 VB 功力 (進階篇, 97/11/23)


Q: 有一程式含有兩個 Form, 其中 Form2 的 Picture 屬性設定成一圖片, 而以下是 Form1 顯示 Form2 的程式:
    Form2.Show

    ' 延遲 2 秒
    Tm1 = Timer
    While Timer - Tm1 < 2
    Wend

以上程式的目的是希望顯示 Form2 的圖片兩秒之後, Form1 才繼續執行, 結果竟然是 2 秒之後, Form2 的圖片才顯示出來。 為什麼圖片會延遲顯示呢? 解決之道又如何?

A: 一般而言, 繪圖會比一般的指令來得費時, 因此, Windows 會延後繪圖指令的執行, 也就是說, 直到其他指令都執行完畢之後, 才會輪到繪圖指令的執行, 在以上的 Form1 程式中, 由於呼叫 Form2.Show 之後, 又執行了一個費時 2 秒的 While 迴圈, 因此, Form2 的圖片必須等待 2 秒鐘, 才會被描繪出來。

解決的方法有二:

方法一: 在 While 迴圈中增加 DoEvents 的敘述, 如下:

    Form2.Show 
    ' 延遲 2 秒 
    Tm1 = Timer 
    While Timer - Tm1 < 2 
        DoEvents
    Wend

DoEvents 的作用是「短暫地停止執行」, 由於此一暫停之動作, 使得繪圖指令有機會被執行, 於是 Form2 的圖片便可以在 While 迴圈執行的階段就被顯示出來。

方法二: 在 Form2.Show 之後, 立刻呼叫 Form2.Refresh, 如下:

    Form2.Show
    Form2.Refresh

    ' 延遲 2 秒
    Tm1 = Timer
    While Timer - Tm1 < 2
    Wend

Refresh 的作用是告訴 Windows, 不管繪圖動作有多慢, 現在立刻把圖畫出來, 當然, Windows 會照辦的。