none
想請教一下各位關於型別轉換… RRS feed

  • 問題

  • 小弟最近寫程式碰到一個問題:
    我在Windows Form有一個TextBox1,其中:Me.TextBox1.Text = Now。
    另外有一個DateTimePicker1和Combobox1、Combobox2 與 Combobox3。
    以下是我寫的程式片段,或許有高手會認為這樣子寫不高明,但的確是可以執行的。

    Dim d, b, h, m, t1 As String
    Dim t2 As Date

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    '顯示系統現在時間
    Me.TextBox1.Text = Now
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    If t2 = Me.TextBox1.Text Then
    ' 使用 WMI 物件進行【關機】
    Dim objOS As Object
    For Each objOS In GetObject("winmgmts:{(Shutdown)}").InstancesOf("Win32_OperatingSystem")
    objOS.Win32Shutdown(12)

    '0:LogOff
    '4:Forced LogOff
    '1Tongue Tiedhutdown
    '5:Forced Shutdown
    '2:Reboot
    '6:Forced Reboot
    '8Stick out tongueowerOff
    '12:Forced PowerOff

    Next
    End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    d = DateTimePicker1.Value.Date
    b = ComboBox1.Text
    h = ComboBox2.Text
    m = ComboBox3.Text

    '判斷使用者設定的時間格式是否正確
    If b <> "" Then
    If h <> "" Then
    If m <> "" Then
    If Me.ComboBox4.Text <> "" Then
    Me.Button1.Enabled = False
    Call start()
    Else
    MsgBox("請選擇【執行動作】!")
    Me.ComboBox4.Focus()
    End If
    Else
    MsgBox("請選擇【分】!")
    Me.ComboBox3.Focus()
    End If
    Else
    MsgBox("請選擇【時】!")
    Me.ComboBox2.Focus()
    End If
    Else
    MsgBox("請選擇【上午】或【下午】!")
    Me.ComboBox1.Focus()
    End If

    '判斷使用者所選擇的執行動
    Select Case ComboBox4.SelectedItem
    Case "!關機!"
    '啟動計時器
    Me.Timer2.Interval = 1000
    Me.Timer2.Start()
    End select


    以上是可以正常執行的。
    但小弟我現在的問題是,我想要在Windows Form增加一個ProgressBar,
    其目的是要在user設定好關機時間按下button1之後,
    ProgressBar會根據所剩的時間來顯示進度(0 → 100)
    所以我在程式裡增加了以下幾行:

    Dim t3 as Double
    t3 = CDbl(t1)
    Me.ProgressBar1.Maximum = t3 - TextBox1.Text
    Me.ProgressBar1.Increment(1)

    但它會出現如下訊息:
    t3 = CDbl(t1) → 從字串 "2007/7/18下午12:00:00" 至型別 'Double' 的轉換是無效的。

    可是我明明就有先將t1(原本是String)轉換成Double了啊?不懂為什麼會這樣???
    2007年7月18日 上午 03:54

解答

  • VB6/VBNET 都會自動做型別轉換,若你無法掌控時,請用型別轉換函數,特別是運算前後。

     

    你 t1 之前沒出現,只有在最後 t3 = CDbl(t1) 開始出現,所以前面都是垃圾,不要貼,也不需要舉例來混淆你的主題,這種文章別人無法掌握你的主題。

     

    你認為為何字串可以轉換為 Double ?或是你認為

    字串 "2007/7/18 下午 12:00:00" 轉換為 'Double' 應該是多少?

     

     

    因為你前後原因沒說清楚,我會假設你是從 VB6 升級上來,或是你抄了來自 VB6 的範例,這樣觀念會以點問題。觀念如下:


    在 VB6/VBA/VBScript 才會把 Date 型別轉換為 Double ,因為這個版本採用的是 Variant Date ,實體型別為 Double 。在 VBNET 是 Tick Date ,實體型別為 Long ,只能透過 DateTime.ToOADate 來轉換成 Double ,你是做進度列,可以直接從 Ticks 屬性處理,免去轉換的問題。

    2007年7月18日 上午 07:59
    版主