none
請問程式do loop在 run 如何知道 button Click被啟動 RRS feed

  • 問題

  •  

    請問程式 do loop 在 run 如何知道 button Click被啟動

    其中Button已經建立好了

    目前要知道那一個Button被按下

    謝謝!

    2007年11月22日 上午 05:52

解答

  • 單緒的情況下,使用 Application.DoEvents() 允許其他事件發生,然後檢查公用變數看看是否有發生 Button Click 。

     

    多緒的話就是直接檢查公用變數了。

     

    ex.

    程式碼區塊

    Private bStop As Boolean = False

    ...

    Sub DoTask()

       Do

          ...

          Application.DoEvents() ' 多緒的話不用這句

          If bStop Then

             bStop = False

             Exit Do

          End If

       Loop

    End Sub

     

    Private Sub ButtonClickEvent(...)...

       bStop = True

    End Sub

     

     

     

    2007年11月22日 上午 06:22
    版主

所有回覆

  • 使用 button Click  EVENT 處理常式  不就知道了嗎

    2007年11月22日 上午 06:10
  • 單緒的情況下,使用 Application.DoEvents() 允許其他事件發生,然後檢查公用變數看看是否有發生 Button Click 。

     

    多緒的話就是直接檢查公用變數了。

     

    ex.

    程式碼區塊

    Private bStop As Boolean = False

    ...

    Sub DoTask()

       Do

          ...

          Application.DoEvents() ' 多緒的話不用這句

          If bStop Then

             bStop = False

             Exit Do

          End If

       Loop

    End Sub

     

    Private Sub ButtonClickEvent(...)...

       bStop = True

    End Sub

     

     

     

    2007年11月22日 上午 06:22
    版主
  •  

    不好意思 ~我的意思是
    do
      doevents
    ......
    .......

    loop

    同時另一個form可以Click所有控制項
    我的目地是要記錄 那些控制項被啟動了(使用者操作過程)
    控制項 當引數傳入 儲存的Function
    如此 當增加物件在此表單上就可以 不必一個一個call 儲存的Function

    2007年11月22日 上午 07:24
  • 你後面的補充讓人看不懂你在說啥。

    請明確的舉例說明。

     

    從我會意的角度來看,你可以用個公用的集合物件來存入控制項,只要把這個集合物件宣告在模組內就可以跨 Form 來記錄。

    2007年11月22日 上午 07:30
    版主
  •  

     

    程度太差 講不太清處

     

    程式流程:在某個表單顯示以後 程式進到某個 迴圈 如下

     

    select case form.name

     

     

    case .....

        ........

    case form1.name

    do

    doevents

    '----------------
    計畫加程式的地方
    '----------------

    loop until form1.unload

    end select

     

    此時可以控制表單from1,這是一個現成的表單

    另外我有一個新的sub如下 功能是記錄 被click過的button

     

    Public Sub recordbtnclick(ByRef from As Object)

    Dim i As Long
    Dim tp As Long

    For i = 0 To Form1.Count - 1
        If from.Controls(i).Value = True Then
              tp = i
              Exit For
        End If
    Next


    Dim hour As Long
    Dim min As Long
    Dim sec As Long

    hour = Timer \ 3600
    min = (Timer Mod 3600) \ 60
    sec = Timer Mod 60

    Call WritePrivateProfileSection(App.Title, hour & ":" & Format(min, "00") & ":" & sec & "   $$   " & from.Caption & from.Controls(tp).Caption, "c:\Test.txt")

    End Sub

    當我把此sub一個個貼到 button內 就可以把所有 button 的操作過程記錄下來


    但是我不打算這麼做 我希望可以知道某個 button被click了


    便可以直接傳給此sub 在doevents 下面加入 call recordbtnclick

    從此以後 此表單再加上控制項 就不用刻意加入  call recordbtnclick 也會被記錄成功
     
    這樣不知道能不能了解我的意思!謝謝你耐心的看完 >_<

     


     

    2007年11月22日 上午 09:01
  • 請明確依照公告註明問題分類是 VB6

    張貼文章應注意事項及應提供資訊

     

    在 VB6 不能透過迴圈來設定事件的 Handle ,所以沒有方法。VBNET 則可輕易做到。

     

    兩種可能改善的做法:

    1. 針對你的 Form 做 WndProc (Window Message Hook) ,則可由該程序收到所有針對該 Form 的 Window Message ,這個必須要對 API 及 Window Message 有一定程度的了解。

     

    2. 不是每個控制項都有 Value = True ,所以可以假設你可能是 CommandButton 或 OptionButton ,同一種類別可以建立控制項陣列(這個東西在 VBNET 沒有) ,比如說你把 Button1 複製後,貼上時,會問你要不要建立控制項陣列,可以以採用這種方式建立,這樣在事件中會多一個 Index 屬性代表這是不同的 Button 傳回,但是所有同一個控制項陣列只需寫一個事件即可共用。

     

    亦即你的事件會變成

    Private Sub Button1_Click(Index As Integer)

     ' 加入 call recordbtnclick

     ' 可變更引數來直接記錄哪個按鈕被按下,就不用整個 Form 掃描

    End Sub

    2007年11月22日 上午 09:39
    版主