none
關於游標 RRS feed

  • 問題

  • Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
            ID_In.Enabled = True
            ID_In.Focus()
        End Sub
      

    Public sub A
            ID_In.Enabled = True
            btnTXD.Enabled = True
            Button_S6.Enabled = False
            Close_Modbus.Enabled = True
            ReadX0 = True
            t1 = New Thread(AddressOf Read_X0)
            t1.IsBackground = True
            t1.Start()
            Reset_btn.Enabled = True
            ' Cursor.Show()
            ' Button2.PerformClick()
            ID_In.Focus()
            delay(200)
        End Sub

    大家好

    我想問一下,我執行完成某段程式之後希望游標會自動停留在ID_IN這各TEXTBOX

    可是我不管怎麼怎麼寫,游標都不會出現在在TEXTBOX

    除非用按鈕去處理

    求救,不然他總是讓文字框是白白的沒有游標


    • 已編輯 VBenson 2017年7月13日 下午 12:44
    2017年7月13日 上午 06:58

解答

  • 這是完整示例代碼,假設你的窗體上有一個textbox和一個Button:

    Imports System.Threading
     
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgsHandles Button1.Click
            Dim th As New Thread(New ParameterizedThreadStart(AddressOf DelayTimeSub))
            th.IsBackground = True
     
            '把TextBox作為Invoke的對象傳回去
            th.Start(TextBox1)
        End Sub
     
        Private Sub DelayTimeSub(obj As Object)
            '這裡處理耗時的任務
            Thread.Sleep(5000)
            Dim txtbox As TextBox = obj
            txtbox.Invoke(New Action(Of TextBox)(AddressOf TextBoxReact), txtbox)
        End Sub
     
        Private Sub TextBoxReact(obj As TextBox)
            Dim txtbox As TextBox = obj
            txtbox.Select()
            txtbox.Text = "耗時結束"
        End Sub
    End Class

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    • 已標示為解答 VBenson 2017年7月17日 上午 03:41
    2017年7月17日 上午 03:16

所有回覆

  • 你執行完 "某段程式" 這段程式寫在哪裡啊? 你有下中斷點是否有執行到 ID_In.Focus()

    "除非用按鈕去處理" ? 你的那段程式是放在Button OnClick事件裡面被觸發的嗎?


    2017年7月13日 上午 07:27
  • 我的副程式已經有FOCUS 但是就是不會出現游標

    除非要用按鈕去處置

    2017年7月13日 下午 12:45
  • 我的副程式已經有FOCUS 但是就是不會出現游標

    除非要用按鈕去處置

    那你在哪裡觸發你的副程式,你下了中斷點執行你的副程式有跑到 ID_In.Focus() 嗎?
    2017年7月13日 下午 12:51
  • 您要先呼叫Form的Focus方法, 讓Form擁有Focus, TextBox才有可以獲得Focus
    2017年7月14日 上午 04:35
  • 請問大大

    要怎麼呼叫FORM的FOUCS方法呢?

    2017年7月14日 上午 05:50
  • 副程式就是Public A

    按鈕處置是另外的測試

    因為都弄不出ID_in 這個TEXTBOX要得到focus

    2017年7月14日 上午 06:35
  • 執行

    Form物件.Focus()

    2017年7月15日 上午 12:00
  • Public A

     Close_Modbus.Enabled = True
            ReadX0 = True
            t1 = New Thread(AddressOf Read_X0)
            t1.IsBackground = True
            t1.Start()
            Reset_btn.Enabled = True



            Me.Form1.Focus()
            ID_In.Focus()
            

        End Sub

    大大 還是不行,甚至我中斷去看 Form1.Focus() 回傳值竟然是False

    2017年7月15日 上午 01:55
  • 是否可以上傳你的代碼到某個雲端方便我們下載測試看一下呢?你可以模擬一下問題,簡化一下代碼程式。

    關鍵只要模擬出問題,可以讓問題重現即可。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report




    2017年7月15日 上午 03:59
  • Me.Form1.Focus

    其中的Form1有建立嗎?

    2017年7月15日 下午 02:36
  • 抱歉 我不會建立這個 

    不知道要怎麼建立FORM1!

    2017年7月16日 上午 02:58
  • VBenson:

    嘗試把你的聚焦的代碼放在Thread裡邊,因為Thread是獨立於窗體的線程運行,並行運行的線程並不能保證一定是同步的哦。這樣做試試看:

    Public A Close_Modbus.Enabled = True ReadX0 = True t1 = New Thread(AddressOf Read_X0) t1.IsBackground = True t1.Start() Reset_btn.Enabled = True End Sub Public Sub Read_X0() '這裡處理你的一大堆問題 '最後一句把ID設置為Focus ID_X.Invoke(AddressOf Result,Nothing) End Sub

    Public Sub Result()

    ID_X.Focus()

    End Sub


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report




    2017年7月16日 上午 03:20
  •  FAE9D91C-3F07-4090-91EB-E3F70E4D0617

    作者ID_IN是一個TextBox不是一個Label……所以可以使用Focus獲取焦點?


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年7月16日 上午 08:05
  • 我的意思是:

    Label不能用Focus,但是樓主的ID不是Label或者LinkedLabel,樓主那個是TextBox,所以應該可以用Foucs的。

    你誤解我的意思了,當然,如果你說優先選擇Select是對的。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report




    2017年7月16日 上午 10:04
  • 請問大大

        Private Sub Read_X0()
            While ReadX0 = True
                X0 = ModbusRTU1.Modbus02H_Read_InputStatus(14, "0000", 1, 50)   '連續監控X0
                If X0 = "01" Then
                    TestActive()
                End If
                Thread.Sleep(50)
            End While
            ID_In.Select()

            ID_In.Invoke(AddressOf Result, Nothing)

        End Sub
        Public Sub Result()
            ID_In.Focus()
        End Sub

    嚴重性 程式碼 說明 專案 檔案 隱藏項目狀態
    錯誤 BC30939 因為類型 '[Delegate]' 宣告為 'MustInherit' 但卻無法建立,所以 'AddressOf' 運算式無法轉換成 '[Delegate]'。

    請問這各該怎麼解呢?

    2017年7月17日 上午 01:55
  • 這是完整示例代碼,假設你的窗體上有一個textbox和一個Button:

    Imports System.Threading
     
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgsHandles Button1.Click
            Dim th As New Thread(New ParameterizedThreadStart(AddressOf DelayTimeSub))
            th.IsBackground = True
     
            '把TextBox作為Invoke的對象傳回去
            th.Start(TextBox1)
        End Sub
     
        Private Sub DelayTimeSub(obj As Object)
            '這裡處理耗時的任務
            Thread.Sleep(5000)
            Dim txtbox As TextBox = obj
            txtbox.Invoke(New Action(Of TextBox)(AddressOf TextBoxReact), txtbox)
        End Sub
     
        Private Sub TextBoxReact(obj As TextBox)
            Dim txtbox As TextBox = obj
            txtbox.Select()
            txtbox.Text = "耗時結束"
        End Sub
    End Class

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    • 已標示為解答 VBenson 2017年7月17日 上午 03:41
    2017年7月17日 上午 03:16
  • 謝謝你

    我試試看

    確實如同 ThankfulHeart說的因為使用了thread 所以整個聚焦完全不見

    我怎麼證明的呢 因為我跑完之把tabindex給秀出來 答案都是0

    表示聚焦已經不知道去哪裡了

    • 已編輯 VBenson 2017年7月17日 上午 03:43
    2017年7月17日 上午 03:34
  • 謝謝你

    我試試看

    請根據您實際情況進行改進,我的Demo模擬一個延時的情況。

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年7月17日 上午 03:36
  • 謝謝你

    我試試看

    確實如同 ThankfulHeart說的因為使用了thread 所以整個聚焦完全不見

    我怎麼證明的呢 因為我跑完之把tabindex給秀出來 答案都是0

    表示聚焦已經不知道去哪裡了

    問題的確全部解決了嗎?用TextBox的Select方法,在Invoke方法裡邊,在Thread處理完與UI控件交互無關的數據(我這裡模擬用Thread的長延時代表你的繁重任務)。

    如FAE9D91C-3F07-4090-91EB-E3F70E4D0617之前所言(貌似他自己刪除了自己優秀的回答?!),用Select是很好的。TabIndex必須是非0,且按一定順序,這樣你按Tab鍵的時候會按照你設定的從小到大的TabIndex順序聚焦的。所以理論上在FormLoad事件中,雖然Control尚未成型無法直接用Focus,但是可以設置TabIndex=0強制讓他成型聚焦哦!與此同時,在任何控件的Activated事件中也可用Focus。

    但是原則上MSDN已經不推薦使用Foucs——儘管這樣某些情況下可以的。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    2017年7月17日 上午 03:50
  • 謝謝你

    我終於在跑完一個段落後 將聚焦抓回到ID_in這個textbox中

    只是我不了解是不是只要遇到我的程式中有thread就得這樣處理聚焦

    2017年7月17日 上午 03:57
  • 謝謝你

    我終於在跑完一個段落後 將聚焦抓回到ID_in這個textbox中

    只是我不了解是不是只要遇到我的程式中有thread就得這樣處理聚焦

    是的,無論任何情況,應該優先用Select進行聚焦。

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年7月17日 上午 03:57
  • 另外想說明一點:如果你的線程任務不是很繁忙,沒有必要用線程的。因為開線程也是需要資源消耗的(看你代碼貌似不像很繁忙的樣子),哈哈。

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年7月17日 上午 03:59
  • 其實本來沒有使用

    但是因為畫面呈現變成很頓 沒有按照順序出現數據

    改用線程之後就乖乖地呈現出來

    2017年7月17日 上午 04:37
  •  Private Sub Read_X03()

            While ReadX03 = True
                X0 = ModbusRTU1.Modbus02H_Read_InputStatus(14, "0000", 1, 50)   '連續監控X0
                If X0 = "01" Then
                    TestActive3()
                End If
                Thread.Sleep(50)

            End While

            Dim ID_InFocusThread As New Thread(New ParameterizedThreadStart(AddressOf DelayTimeSub))
            ID_InFocusThread.IsBackground = True
            '把TextBox作為Invoke的對象傳回去
            ID_InFocusThread.Start(ID_In)
        End Sub
        Private Sub DelayTimeSub(obj As Object)
            '這裡處理耗時的任務
            Thread.Sleep(100)
            Dim txtbox As TextBox = obj
            txtbox.Invoke(New Action(Of TextBox)(AddressOf TextBoxReact), txtbox)
        End Sub

        Private Sub TextBoxReact(obj As TextBox)
            Dim txtbox As TextBox = obj
            txtbox.Select()
            '  txtbox.Text = "耗時結束"
        End Sub

    您好我最後改成這樣去處理 要回了焦點

    謝謝

    2017年7月17日 上午 05:51