none
即時判斷擷取語句的疑問 RRS feed

  • 問題

  • 我目前在做即時通AI回復的程式

    目前已經有辦法抓到整個對話的窗口

    但有幾個問題我目前沒有能力解決 想求解於各位高手

     

    首先我先敘述一下我的邏輯問題

     

    假如這是印在即時通窗口上的語句 :

     

     

    路人甲 (2011/9/5 上午 02:58:26): 安阿

    路人甲 (2011/9/5 上午 02:58:30): 在嗎?

    路人甲 目前的狀態是 閒置。(2011/9/5 上午 03:14)

     

    最近收到的訊息時間是 2011/9/5 - 上午 02:58

    我本人 (2011/9/5 上午 04:17:40): 嗨阿

    我本人 (2011/9/5 上午 04:17:49): 我很好

    路人甲 (2011/9/5 上午 04:18:30): 你心情怎樣阿?

    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?

     

     

    因為我得把對方 路人甲的語句 抓下來 給AI判斷   就是 (安阿   , 在嗎?)

     

    我使用了分割的功能函數 Split 去把抓下來的窗口進行了分割語句的動作

    但是有幾個要點 

    1. 我要抓到對方即時的回覆語句 

    2. 可能是一句以上

    3. 抓的語句乃是建立在我最後的回覆的語句之後才需要抓

     

    以下是我目前寫的CODE:

     

     

    Public Function SPLITyahoomessage() As Long
    
    
            Dim lCount1 As Integer
            lCount1 = 0
            If ListBox1.SelectedIndex < 0 Then
                Exit Function
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
    
            'TextBox1
    
            Dim ReadData() As String  '不要設陣列大小
    
            Dim InputText As String = RichTextBox3.Text
            Dim x As String = Now.ToString("HH:mm:ss")
          
            ' If RichTextBox3 裡有出現("HH:mm:") then
    
            ReadData = Split(InputText, ":")
    
            For i As Integer = 0 To ReadData.Length - 1   '超過大小會產生錯誤
    
                Select Case ReadData(i)
    
                    '要做的事情
                End Select
                TextBox1.Text = ReadData(i)   'ReadData(i)會直接運行到最後一句 
    
    
    
            Next
            For i As Integer = 0 To ReadData.Length - 1   '超過大小會產生錯誤
    
                Select Case ReadData(i)
    
                    '要做的事情
                End Select
                TextBox2.Text = ReadData(i)   'ReadData(i)會直接運行到最後一句 
    
    
            Next
            Return lCount1
    
            else
            End if
            Exit Function
    
    
        End Function
    


    在這邊我使用了陣列還有時鐘函數  , 我的思路是這樣 ,就是先判斷RichTextBox3 中 有沒有出現最接近現在這個時間點的語句

    如果有才分割語句,用此來判斷窗口有沒有需要抓取語句,這邊有什麼函數可以去判斷(時間點的字串) 有沒有出現在RichTextBox3 中嗎?

    這是我的第一個問題

     

    第二個問題 就是如果第一點成立,那開始擷取字符串了,按照我目前的寫法,我選擇分割的界點是 :

    只能擷取到最後一句對方送出的對話,也就是說

    我只能搜索到 (還好嗎?) 但是(你心情怎樣阿?) 這句話就抓不到了

    我在這邊想到一個方法 不過有瑕疵

    就是在陣列下面再加入下面這個

     

       ReadData = Split(InputText, ":")
    
    For i As Integer = 0 To ReadData.Length - 4   '超過大小會產生錯誤
    
                Select Case ReadData(i)
    
                    '要做的事情
                End Select
                TextBox2.Text = ReadData(i)   'ReadData(i)會直接運行到最後一句 
    

     

    有就是從倒數第四個:開始擷取 然後就依循著這個方法一直截取下去, 但是這樣的話這一句結取到的東西,就會變成

    跟最後面的那些混在一起 

    (

    你心情怎樣阿?

    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?

    )

    變這樣 這不是我想要的 所以想請教各位先進有什麼解決的辦法?  這是我第二個問題  

    煩請各為賜教
    • 已編輯 向恩 2011年9月4日 下午 09:21
    2011年9月4日 下午 09:19

解答

  • 你是要剖析字串嗎?

    用正則運算式會比用Split來得容易操控。

     

    例如判斷字串中有無日期可用:\d{4}/\d{1,2}/\d{1,2}

     

    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月5日 上午 01:30
  • 正則運算式 = 規則運算式 = RegularExpression

    你要抓4:18:00 ~4:18:59這 1 分鐘的話可以組出patten字串再跑Regex.Match方法

    patten:

    \d{4}/\d{1,2}/\d{1,2} [上下]午 04:18:\d{2}

     

     


    我改一下patten,這樣可能比較準確

    2011/(0?[1-9]|1[12])/([0-2]?[0-9]|3[01]) [上下]午 04:17:[0-5]\d{1}

    • 已編輯 阿尼 2011年9月5日 上午 05:55
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月5日 上午 05:47
  • Dim saveNow As DateTime = DateTime.Now
    
            Dim hour As String = saveNow.Hour
    
            Dim 上下午 As String
    
            If hour > 12 Then
    
                上下午 = "下午"
            Else
                上下午 = "上午"
            End If
    


    我試是會呢!

    不過,建議您hour使用integer 型態

     Dim hour As Integer = saveNow.Hour

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年9月6日 上午 10:34
    • 已標示為解答 向恩 2011年9月9日 上午 04:05
    • 已取消標示為解答 向恩 2011年9月10日 下午 03:24
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月6日 上午 10:32
  • string input = @"路人甲 (2011/9/5 上午 02:58:26): 安阿
     
    路人甲 (2011/9/5 上午 02:58:30): 在嗎?
     
    路人甲 目前的狀態是 閒置。(2011/9/5 上午 03:14)
     
     
     
    最近收到的訊息時間是 2011/9/5 - 上午 02:58
     
    我本人 (2011/9/5 上午 04:17:40): 嗨阿
     
    我本人 (2011/9/5 上午 04:17:49): 我很好
     
    路人甲 (2011/9/5 上午 04:18:30): 你心情怎樣阿?
     
    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?
    ";
        Regex regex = new Regex(@"\(2011/(0?[1-9]|1[12])/([0-2]?[0-9]|3[01]) [上下]午 04:18:[0-5]\d{1}\):(?<text>.*)");
        MatchCollection matches = regex.Matches(input);
        foreach (Match m in matches) {
            string result = m.Groups["text"].Value;
        }
    

    • 已標示為解答 向恩 2011年9月9日 上午 04:05
    • 已取消標示為解答 向恩 2011年9月10日 下午 03:24
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月6日 下午 04:39
  • patten是字串啊,你用變數取代不就行了
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月7日 上午 01:45
  •         Dim strName As String = "路人甲"
            'Dim strTime As String = Now.ToString("04:18")
            Dim strTime As String = Now.ToString("hh:mm")
            Dim regex As Regex = New Regex(strName & " \(2011/(0?[1-9]|1[12])/([0-2]?[0-9]|3[01]) [上下]午 " & strTime & ":[0-5]\d{1}\):(?<text>.*)")
            Dim matches As MatchCollection = regex.Matches(RichTextBox1.Text)
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                TextBox1.Text += result + vbNewLine
            Next
    

    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月7日 下午 02:53
  • TextBox1.Text += result + vbNewLine

    也就是

    TextBox1.Text =TextBox1.Text + result + vbNewLine

    這是一個非常基本的用法.



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已編輯 Bill ChungMVP, Moderator 2011年9月7日 下午 04:50
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月7日 下午 04:48
    版主
  •         Dim nowdate As String = Now.ToString("yyyy/M/d")
     Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)") Dim matches As MatchCollection = regex.Matches(RichTextBox1.Text) For Each m As Match In matches Dim result As String = m.Groups("text").Value TextBox1.Text += result + vbNewLine Next


    • 已編輯 Joe Hung 2011年9月8日 上午 01:44
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 上午 01:43
  •         MessageBox.Show(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)")
    

    上面這列顯示字串是什麼?照之前舉例的對話內容,是可以抓到的,請把整個專案壓縮上傳到網路空間如SkyDrive,或把RichTextBox的對話內容另存成文字檔上傳...

    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 上午 04:56
  •         Dim nowdate As String = Now.ToString("yyyy/M/d")

    請用心寫程式好嗎?對話日期明明是用"/"隔開,卻一直用"-",直到世界末日,也找不到吧...
    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 下午 12:00
  • "路人甲 \(2011/9/9 上午 02:17:[0-5]\d{1}\):(?<text>.*)"

    人名和"\"中間要有空格,原本的對話內容有空格吧...

    • 已標示為解答 向恩 2011年9月9日 上午 04:05
    • 已取消標示為解答 向恩 2011年9月10日 下午 03:19
    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 下午 11:17
  •         Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
    


    • 已編輯 Joe Hung 2011年9月10日 下午 03:39
    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月10日 下午 03:38
  • puch要宣告在Function外面,為全域變數,基本的全域和區域變數的觀念都沒有嗎?此外,您乾脆不要標解答算了,標示又取消,您不嫌麻煩,我們不堪其擾耶...
    • 已標示為解答 向恩 2011年9月11日 上午 05:45
    2011年9月11日 上午 04:33
  •     Dim intIndex As Integer = 0
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    
            If intIndex = ListBox1.Items.Count Then
                intIndex = 0
            End If
            ListBox1.SelectedIndex = intIndex
            'subChanged
            intIndex += 1
    
        End Sub
    

    ListBox 類別
    一、把SelectedIndexChanged事件裡的程式另外寫在Sub副程式裡,再去呼叫Sub即可。
    二、基本的類別成員,還是不會用嗎...
    • 已標示為解答 向恩 2011年9月11日 下午 12:08
    2011年9月11日 上午 10:58
  •   ReDim Preserve x(ListBox1.Items.Count-1)
    
    • 已標示為解答 向恩 2011年9月14日 下午 01:10
    2011年9月14日 下午 12:58

所有回覆

  • 你是要剖析字串嗎?

    用正則運算式會比用Split來得容易操控。

     

    例如判斷字串中有無日期可用:\d{4}/\d{1,2}/\d{1,2}

     

    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月5日 上午 01:30
  • 我是要先判斷擷取下來的對話窗口中  有沒有NOW TIME的時間點出現

     

    如果有才進行截取對話  我的思路如下

    EX: 現在的時間點是 4:19:59  然後我會開始搜索窗口 有沒有接近4:19:59秒的時間點的語句在字串裡

    在這邊我想先另外加個變數進去 來用以判斷處理視窗的時間點  例如處理的窗口少 我就設成一分鐘  因為如下最接近4:19:59 秒的時間點是

    4:18:32秒  所以我想把他設成如果有4:18:XX  時間點出現  才進行截取窗口的動作   

    關於這樣用正則運算式會比較容易操作嗎?  還是用規則運算式比較好呢? 請給一點建議

     

    路人甲 (2011/9/5 上午 02:58:26): 安阿

    路人甲 (2011/9/5 上午 02:58:30): 在嗎?

    路人甲 目前的狀態是 閒置。(2011/9/5 上午 03:14)

     

    最近收到的訊息時間是 2011/9/5 - 上午 02:58

    我本人 (2011/9/5 上午 04:17:40): 嗨阿

    我本人 (2011/9/5 上午 04:17:49): 我很好

    路人甲 (2011/9/5 上午 04:18:30): 你心情怎樣阿?

    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?

     


    • 已編輯 向恩 2011年9月5日 上午 04:53
    2011年9月5日 上午 04:52
  • 正則運算式 = 規則運算式 = RegularExpression

    你要抓4:18:00 ~4:18:59這 1 分鐘的話可以組出patten字串再跑Regex.Match方法

    patten:

    \d{4}/\d{1,2}/\d{1,2} [上下]午 04:18:\d{2}

     

     


    我改一下patten,這樣可能比較準確

    2011/(0?[1-9]|1[12])/([0-2]?[0-9]|3[01]) [上下]午 04:17:[0-5]\d{1}

    • 已編輯 阿尼 2011年9月5日 上午 05:55
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月5日 上午 05:47
  • 那個我抓的時間值會是個變數 因為我要參考系統中的目前時間下去做

    判斷這樣運算值該怎麼寫呢? 

     

    還有一個問題就是 我這邊CODE中要具備判斷 是否有 4:18:XX 這個最接近系統現在時間點

    是否存在  有的話才進行分割字串 這個要用什麼方法實現呢?



    • 已編輯 向恩 2011年9月5日 上午 10:10
    2011年9月5日 上午 07:22
  • [String.Contains 方法] 這你看看派的上用場沒有.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年9月5日 上午 11:15
    版主
  • OK  謝謝版主的答覆

    讓我已經掌握了 不少處理字串的方法

    目前有個疑問 我在處理時間的時候遇上了一個麻煩

     

    就是我想從系統取得的時數 然後以12點整點來判斷上午還是下午  

    以下是我的寫法   不曉得為什麼 我取得的系統時數  hour 明明是大於12了  我也逐步執行去檢查hour 的變數 目前是下午6點

     hour 就是18

    為什麼 If hour > 12 Then 會不起作用 無法判斷呢? 請各位給予指導一下

     

    Dim saveNow As DateTime = DateTime.Now
    
    Dim hour As String = saveNow.Hour
    
    Dim 上下午 As String
    
            If hour > 12 Then
    
                上下午 = "下午"
    
            End If
    
            上下午 = "上午"
    


     


    • 已編輯 向恩 2011年9月6日 上午 10:09
    2011年9月6日 上午 10:08
  • Dim saveNow As DateTime = DateTime.Now
    
            Dim hour As String = saveNow.Hour
    
            Dim 上下午 As String
    
            If hour > 12 Then
    
                上下午 = "下午"
            Else
                上下午 = "上午"
            End If
    


    我試是會呢!

    不過,建議您hour使用integer 型態

     Dim hour As Integer = saveNow.Hour

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年9月6日 上午 10:34
    • 已標示為解答 向恩 2011年9月9日 上午 04:05
    • 已取消標示為解答 向恩 2011年9月10日 下午 03:24
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月6日 上午 10:32
  • 我不是來回答問題的, 我只是有幾句話想要囉嗦一下。

    第一, 在 .Net (以及眾多物件導向語言) 中, 以 I 字母開頭通常都代表 Interface 型別; 而我們通常並不需要為變數特別標記型別。只有一種情形例外, 就是我們很明確需要特別註明該變數型別的時候 (例如在同一段程式中有相同意義的變數, 但型別不同)。但就算如此, 最好還是避免以 I 來做為開頭, 可以考慮使用像 intCount, strCount 之類的命名方式。

    第二, 要分析人類說出來的話或寫出來的文字, 牽涉到人工智慧和語言學的領域。或許有興趣的人可以朝「文法分析」以及「語義分析」開始著手。

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny

    • 已編輯 Johnny.Net 2011年9月6日 上午 11:34 For probably being offensive to others
    2011年9月6日 上午 11:23
  • 謝謝各位熱情的答覆  時間的部分已經有辦法解決 可是我在這邊又有一個新的疑惑

     

    因為我看不懂阿尼提供的方法 

    我自己用別的方法組出了這樣的句子  這個方法也比較符合我的要求

    Dim STtime As String = String.Concat(textBuilders(0), " (", nowdate, " ", 上下午, " ", hour, ":", minute, ":", X0, "): ")

     

    我用這個組出了 路人甲 (2011/9/5 上午 04:18:00):   一直到   路人甲 (2011/9/5 上午 04:18:59):    的字符 

    搜索字串的窗口如下:

     

     

    路人甲 (2011/9/5 上午 04:18:30): 你心情怎樣阿?

    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?

    可是要怎麼抓他後面的字串  

    ( 你心情怎樣阿? ,還好嗎?)

    Regex.Match方法做得到嗎?

    要怎麼用呢?  我不太懂Regex.Match 的方法 

    請各位高手指教一下了 謝謝!

     

    2011年9月6日 下午 04:22
  • 謝謝你 有試出來了 少一個 else
    2011年9月6日 下午 04:23
  • 目前我還沒動工到AI 這邊  等動工到AI 這邊再討論瞜!
    2011年9月6日 下午 04:24
  • 謝謝各位熱情的答覆  時間的部分已經有辦法解決 可是我在這邊又有一個新的疑惑

     

    因為我看不懂阿尼提供的方法 

    我自己用別的方法組出了這樣的句子  這個方法也比較符合我的要求

    Dim STtime As String = String.Concat(textBuilders(0), " (", nowdate, " ", 上下午, " ", hour, ":", minute, ":", X0, "): ")

     

    我用這個組出了 路人甲 (2011/9/5 上午 04:18:00):   一直到   路人甲 (2011/9/5 上午 04:18:59):    的字符 

    搜索字串的窗口如下:

     

     

    路人甲 (2011/9/5 上午 04:18:30): 你心情怎樣阿?

    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?

    可是要怎麼抓他後面的字串  

    ( 你心情怎樣阿? ,還好嗎?)

    Regex.Match方法做得到嗎?

    要怎麼用呢?  我不太懂Regex.Match 的方法 

    請各位高手指教一下了 謝謝!

    2011年9月6日 下午 04:25
  • string input = @"路人甲 (2011/9/5 上午 02:58:26): 安阿
     
    路人甲 (2011/9/5 上午 02:58:30): 在嗎?
     
    路人甲 目前的狀態是 閒置。(2011/9/5 上午 03:14)
     
     
     
    最近收到的訊息時間是 2011/9/5 - 上午 02:58
     
    我本人 (2011/9/5 上午 04:17:40): 嗨阿
     
    我本人 (2011/9/5 上午 04:17:49): 我很好
     
    路人甲 (2011/9/5 上午 04:18:30): 你心情怎樣阿?
     
    路人甲 (2011/9/5 上午 04:18:32): 還好嗎?
    ";
        Regex regex = new Regex(@"\(2011/(0?[1-9]|1[12])/([0-2]?[0-9]|3[01]) [上下]午 04:18:[0-5]\d{1}\):(?<text>.*)");
        MatchCollection matches = regex.Matches(input);
        foreach (Match m in matches) {
            string result = m.Groups["text"].Value;
        }
    

    • 已標示為解答 向恩 2011年9月9日 上午 04:05
    • 已取消標示為解答 向恩 2011年9月10日 下午 03:24
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月6日 下午 04:39
  • 回覆阿尼 

     

    不好意思  因為我這邊 還要參考系統的時間變數nowdate 還有參考對象的變數textBuilders(0)這些 做即時的擷取

    可是你舉用的方法好像是直接就參考我這個  例子

     列舉出來的方法  所以這邊不能達到我的要求 在這邊因為我要做即時的擷取  所以我才自己定義了下面這個東西

     

    不曉得能不能把你這個方法 

    跟我定義的這個STtime  相結合起來

    Dim STtime As String = String.Concat(textBuilders(0), " (", nowdate, " ", 上下午, " ", hour, ":", minute, ":", X0, "): ")    

    去截取STtime =路人甲 (2011/9/5 上午 04:18:32): <後面的東西> 

    2011年9月6日 下午 05:17
  • patten是字串啊,你用變數取代不就行了
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月7日 上午 01:45
  • 恩恩  我把字串定義成如下的東西
    這樣不曉得能不能跑  
        Dim STtime As String = String.Concat(textBuilders(0), " (", nowdate, " ", 上下午, " ", hour, ":", minute, ":", X0, "): ", "(?<text>.*)")
                Dim rgx As New Regex(STtime, "(?<text>.*)")
                Dim returnValue As Match = rgx.Match(InputText)
                TextBox1.Text = returnValue
    目前有個疑問 就是我節取到的字串 不能做做成字符應用嗎?
    下面這一行 我要把他印出來  
    TextBox1.Text = returnValue
    結果出現如下的錯誤訊息 :
    錯誤 1 型別 'System.Text.RegularExpressions.Match' 的值無法轉換成 'String'。 C:\Users\tom\Desktop\即時通AI 2010\Form1.vb 246 29 WindowsApplication1
    請問我該怎麼修正??
    2011年9月7日 上午 11:25
  •         Dim strName As String = "路人甲"
            'Dim strTime As String = Now.ToString("04:18")
            Dim strTime As String = Now.ToString("hh:mm")
            Dim regex As Regex = New Regex(strName & " \(2011/(0?[1-9]|1[12])/([0-2]?[0-9]|3[01]) [上下]午 " & strTime & ":[0-5]\d{1}\):(?<text>.*)")
            Dim matches As MatchCollection = regex.Matches(RichTextBox1.Text)
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                TextBox1.Text += result + vbNewLine
            Next
    

    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月7日 下午 02:53
  • 請問一下 下面這段代碼是即時更新 抓到的語句這樣嗎@@  

    TextBox1.Text += result + vbNewLine
    還是就是抓到的語句 都顯示到TextBox1 裡面呢?
    • 已編輯 向恩 2011年9月7日 下午 03:59
    2011年9月7日 下午 03:58
  • TextBox1.Text += result + vbNewLine

    也就是

    TextBox1.Text =TextBox1.Text + result + vbNewLine

    這是一個非常基本的用法.



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已編輯 Bill ChungMVP, Moderator 2011年9月7日 下午 04:50
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:26
    2011年9月7日 下午 04:48
    版主
  • OK  謝謝

     

    以下是我目前的寫法  我將你們傳授的 做了一點轉換 

     

       Public Function SPLITyahoomessage() As Long
    
    
            Dim lCount1 As Integer
            lCount1 = 0
            If ListBox1.SelectedIndex < 0 Then
                Exit Function
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
    
            'TextBox1
            '----------------------------
            Dim textBuilders() As String = Split(textBuilder, "(")
            For i As Integer = 0 To textBuilders.Length - 1
    
    
            Next
           
         
            Dim InputText As String = RichTextBox3.Text
            '-----------------------------
            '系統時間的部分
    
            Dim nowdate As String = Now.ToString("yyyy-MM-dd")
    
            Dim saveNow As DateTime = DateTime.Now   '取得系統目前時間
          
    
            Dim hour As String = saveNow.Hour
    
            Dim minute As String = saveNow.Minute
            '-------------------------------------------------
            '處理上午下午時間
            Dim 上下午 As String
            If hour > 12 Then
    
                上下午 = "下午"
                hour = hour - 12
    
            Else
                上下午 = "上午"
                If hour = 0 Then
                    hour = 12
                End If
            End If
    
            '-------------------------------------------------
            If hour <= 9 Then          ' 處理時數和分數
                hour = String.Concat("0", hour)
            End If
    
            If minute <= 9 Then
                minute = String.Concat("0", minute)
            End If
    
            '-------------------------------------------------
            Dim X0 As String = -1    ' 處理秒數
    
            For X As Integer = 0 To 59
                X0 = X0 + 1
                If X0 <= 9 Then
                    X0 = String.Concat("0", X0)
                End If
    
                Dim regex As Regex = New Regex(textBuilders(0) & " (" & nowdate & " " & 上下午 & hour & ":" & minute & ":" & X0 & "):(?<text>.*)")
    
                Dim returnValue As Match = regex.Match(InputText)
                Dim result As String = returnValue.Groups("text").Value
    
    
                TextBox1.Text += result + vbNewLine
                'Label3.Text = hour
    
    
            Next
    
            Return lCount1
            Exit Function
    
    
        End Function
    
    '------------------------------------------
     Dim regex As Regex = New Regex(textBuilders(0) & " (" & nowdate & " " & 上下午 & hour & ":" & minute & ":" & X0 & "):(?<text>.*)")
    

     

       上面這一行 我打算改成這樣 比較符合我想要的功能  因為日期時間還有即時讀取ID 那些 這邊都是變數

       但是我在這邊不曉得是不是沒有用  

     

     For Each   As   In

     

     

     Next

    我改成了用 For X As Integer = 0 To 59  迴圈來控制 這邊因為我還沒有一個較完善的想法 就是我要控制讀取的那段時間

     

    這邊是用0~59秒   但是我之後想再視情況加長時間  因為在擷取語句上 跟視窗數的多寡 都是影響這段時間的因素 所以我目前是這樣設計的!

     

    不曉得我這樣的寫法  哪邊有錯誤  我目前還是抓不到語句  麻煩指點一下迷津!

    • 已編輯 向恩 2011年9月7日 下午 06:00
    2011年9月7日 下午 05:59
  •         Dim nowdate As String = Now.ToString("yyyy/M/d")
     Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)") Dim matches As MatchCollection = regex.Matches(RichTextBox1.Text) For Each m As Match In matches Dim result As String = m.Groups("text").Value TextBox1.Text += result + vbNewLine Next


    • 已編輯 Joe Hung 2011年9月8日 上午 01:44
    • 已標示為解答 向恩 2011年9月10日 下午 05:21
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:04
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 上午 01:43
  • 好像還是抓不到  不知道哪邊出了問題

    以下是CODE:

     

     Public Function SPLITyahoomessage() As Long
    
    
            Dim lCount1 As Integer
            lCount1 = 0
            If ListBox1.SelectedIndex < 0 Then
                Exit Function
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
    
            'TextBox1
            '----------------------------
            Dim textBuilders() As String = Split(textBuilder, "(")
            For i As Integer = 0 To textBuilders.Length - 1
    
    
            Next
           
         
            Dim InputText As String = RichTextBox3.Text
            '-----------------------------
            '系統時間的部分
    
            Dim nowdate As String = Now.ToString("yyyy-M-d")
    
            Dim saveNow As DateTime = DateTime.Now   '取得系統目前時間
          
    
            Dim hour As String = saveNow.Hour
    
            Dim minute As String = saveNow.Minute
            '-------------------------------------------------
            '處理上午下午時間
            Dim 上下午 As String
            If hour > 12 Then
    
                上下午 = "下午"
                hour = hour - 12
    
            Else
                上下午 = "上午"
                If hour = 0 Then
                    hour = 12
                End If
            End If
    
            '-------------------------------------------------
            If hour <= 9 Then          ' 處理時數和分數
                hour = String.Concat("0", hour)
            End If
    
            If minute <= 9 Then
                minute = String.Concat("0", minute)
            End If
    
            '-------------------------------------------------
            '   Dim X0 As String = -1    ' 處理秒數
    
            '   For X As Integer = 0 To 59
            '    X0 = X0 + 1
            '   If X0 <= 9 Then
            '   X0 = String.Concat("0", X0)
            '   End If
    
            'Dim regex As Regex = New Regex(textBuilders(0) & " (" & nowdate & " " & 上下午 & hour & ":" & minute & ":" & X0 & "):(?<text>.*)")
            Dim regex As Regex = New Regex(textBuilders(0) & "\(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)")
    
            'Dim returnValue As Match = regex.Match(InputText)
            'Dim result As String = returnValue.Groups("text").Value
            Dim matches As MatchCollection = regex.Matches(InputText)
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                TextBox1.Text += result + vbNewLine
            Next
    
            ' TextBox1.Text += result + vbNewLine
            'Label3.Text = hour
    
    
            '  Next
    
            Return lCount1
            Exit Function
    
    
        End Function
    

    我本來以為會不會是這行有改錯

     Dim regex As Regex = New Regex(textBuilders(0) & "\(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)")
    

    我把它改成 

    Dim regex As Regex = New Regex(textBuilders(0) & "  (" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)")
    

    "\("
    

    這邊不是應該是下面這個嗎?

    "  (" 
    

    可是這邊改成這樣又會出現錯誤訊息:

    正在剖析 "路人甲 (2011-9-8 上午 11:43:[0-5]\d{1}\):(?<text>.*)" - 沒有足夠的 ) 符號。

     

    麻煩這邊在指點一下迷津了 謝謝!

     

    2011年9月8日 上午 03:45
  •         MessageBox.Show(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)")
    

    上面這列顯示字串是什麼?照之前舉例的對話內容,是可以抓到的,請把整個專案壓縮上傳到網路空間如SkyDrive,或把RichTextBox的對話內容另存成文字檔上傳...

    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 上午 04:56
  • OK  我已經把專案 上傳到SkyDrive 上了

    以下是鏈結:

    https://skydrive.live.com/redir.aspx?cid=105b2868cb2df559&resid=105B2868CB2DF559!185

     

    至於RichTextBox的文字檔  這邊就不方便提供了  因為要測試有沒有做到即時擷取的功能 還是要麻煩你一下

    安裝即時通11版的 然後用兩台電腦 兩個帳號 這樣才方便做測試 !!  真不好意思 這個有點麻煩


    • 已編輯 向恩 2011年9月8日 上午 06:09
    2011年9月8日 上午 06:09
  •         Dim nowdate As String = Now.ToString("yyyy/M/d")

    請用心寫程式好嗎?對話日期明明是用"/"隔開,卻一直用"-",直到世界末日,也找不到吧...
    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 下午 12:00
  • 恩  謝謝你幫我指出這邊的錯誤

     

    Dim nowdate As String = Now.ToString("yyyy/M/d")

    這邊我已經改成這個了  不過還是抓不到句子 不曉得哪邊還有BUG..

     

    這一行

    Dim regex As Regex = New Regex(textBuilders(0) & "\(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\):(?<text>.*)")

    所MACH的東西 如下 帳號後面 路人甲  後面是\   我一直覺得這邊怪怪的 這邊沒有問題嗎?

    下面是我用區域變數去監看regex 抓出來的:

    {路人甲\(2011/9/9 上午 02:17:[0-5]\d{1}\):(?<text>.*)}

    麻煩指點一下迷津了

    • 已編輯 向恩 2011年9月8日 下午 06:22
    2011年9月8日 下午 06:13
  • "路人甲 \(2011/9/9 上午 02:17:[0-5]\d{1}\):(?<text>.*)"

    人名和"\"中間要有空格,原本的對話內容有空格吧...

    • 已標示為解答 向恩 2011年9月9日 上午 04:05
    • 已取消標示為解答 向恩 2011年9月10日 下午 03:19
    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月8日 下午 11:17
  • 恩  總算有了 謝謝你們 !
    2011年9月9日 上午 04:05
  • 不好意思  我想再補充一個提問

    如果要在match 到的對話

    比如說總共五句話

    能依序的存入 TextBox1   TextBox2 TextBox3  TextBox4  TextBox5 的文字欄內   要利用什麼函數或技巧呢?

     

    CODE如下:

     Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\): (?<text>.*)")

     

            Dim matches As MatchCollection = regex.Matches(InputText)

            '-------------------------------------------------------

            For Each m As Match In matches

                Dim result As String = m.Groups("text").Value

                'TextBox1.Text += result + vbNewLine

                TextBox1.Text=result 

               TextBox2.Text

              TextBox3.Text

              TextBox4.Text

              TextBox5.Text

            Next

            Return lCount1

    2011年9月10日 下午 03:23
  •         Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
    


    • 已編輯 Joe Hung 2011年9月10日 下午 03:39
    • 已標示為解答 向恩 2011年9月10日 下午 05:20
    • 已取消標示為解答 向恩 2011年9月11日 上午 04:05
    • 已標示為解答 向恩 2011年9月11日 上午 05:25
    2011年9月10日 下午 03:38
  • 恩恩  謝謝你 抓到了!!
    2011年9月10日 下午 05:20
  • 在測試程式中 又遇到了一個新的問題點

    就是擷取語句之後 把截取到的語句記憶下來   防止繼續掃描

    我想了下面這一個思路 不過這樣行不太通

    就是記憶下來句子之後 就又清掉了句子..   

    所以想請各位提供一下有什麼技巧 能幫我做到這一件事!

     

    CODE:

     Dim puch As String = 0
            '-------------------------------------------------
            Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\): (?<text>.*)")
    
            '-------------------------------------------------
    
            If puch = regex.ToString Then
                Exit Function
            End If
    
    
            '------------------------------------------
            Dim matches As MatchCollection = regex.Matches(InputText)
            '-------------------------------------------------------
    
            Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
            '----------------------------------------
            puch = regex.ToString            '將掃瞄過的句子記憶下來 防止再次掃描
    
    
            '-------------------------------------------
    


    2011年9月11日 上午 04:03
  • puch要宣告在Function外面,為全域變數,基本的全域和區域變數的觀念都沒有嗎?此外,您乾脆不要標解答算了,標示又取消,您不嫌麻煩,我們不堪其擾耶...
    • 已標示為解答 向恩 2011年9月11日 上午 05:45
    2011年9月11日 上午 04:33
  • 不好意思  因為我以為就是標示解答之後

    這一個帖子就會標示問題已解決

    如果又有針對這一問題又冒出相關的問題出現  那標題那邊就不會出現問號

    會出現打勾的符號  這樣不曉得會不會讓網友們認為 這一帖子沒問題了!

    又不能為了這個相關的問題又開另一個新的帖子..

    所以才把標示解答又通通取消掉   讓問號在標題那邊出現..


    • 已編輯 向恩 2011年9月11日 上午 05:44
    2011年9月11日 上午 05:43
  • 張貼文章應注意事項及應提供資訊

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/e707eac3-3038-4be8-a925-eaec92a88c5f

    國有國法,家有家規,版有版規,請照規矩來,以免被版主鎖文...

     

    2011年9月11日 上午 05:51
  • 標記為解答的文章若有問題可續問,不需要將標記解答移除

    若非站長或版主無理由移除解答,該文可由站長、版主標記解答後直接鎖文,避免網友把此功能當玩具玩,標記為解答會發送 eMail 給所有設定通知的使用者,任意移除、標記將造成眾人的不便。
    T.L. Cheng
            恩  有看到了 !!  下次注意  謝謝你的提醒 
    2011年9月11日 上午 08:23
  • 又發現了一個新的問題  麻煩指點一下

    就是如何在timer 呼叫sub 事件過來呢?

    我想要利用timer去即時更新ListBox1_SelectedIndexChanged的事件

    以下是我的寫法  

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
    
            Label2.Text = Now.ToString("HH:mm:ss")
            AddHandler Me.ControlAdded, AddressOf ListBox1_SelectedIndexChanged
    
    
        End Sub

    這邊好像不太正確  不會更新...  

     

    第二個問題是 就是我想要利用timer 去依序執行list item中的欄目  需要用到哪些函數才能做到我想要的功能

    2011年9月11日 上午 09:24
  •     Dim intIndex As Integer = 0
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    
            If intIndex = ListBox1.Items.Count Then
                intIndex = 0
            End If
            ListBox1.SelectedIndex = intIndex
            'subChanged
            intIndex += 1
    
        End Sub
    

    ListBox 類別
    一、把SelectedIndexChanged事件裡的程式另外寫在Sub副程式裡,再去呼叫Sub即可。
    二、基本的類別成員,還是不會用嗎...
    • 已標示為解答 向恩 2011年9月11日 下午 12:08
    2011年9月11日 上午 10:58
  • 恩 謝謝 解決問題了!
    2011年9月11日 下午 12:08
  • 有一個新的問題

     

     

     

       
    Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\): (?<text>.*)")
    
            '-------------------------------------------------
    
            If x(u) = regex.ToString Then      '  掃瞄過的句子自動跳出
                Exit Function
            End If
    
    
    
    
            '------------------------------------------
            Dim matches As MatchCollection = regex.Matches(InputText)
            '-------------------------------------------------------
    
            Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
            '----------------------------------------
            x(u) = regex.ToString          '將掃瞄過的句子記憶下來 防止再次掃描
    
    

     


    我想要再掃描句子這邊的程式碼 加一段掃瞄過的句子會記憶下來 防止再次掃描

     If x(u) = regex.ToString Then
    

    可是這邊這一句 我在跑的時候出現了BUG

    錯誤訊息:

    並未將物件參考設定為物件的執行個體。

    這邊要怎麼解決呢??






    • 已編輯 向恩 2011年9月12日 上午 02:58
    2011年9月12日 上午 02:54
  • x(u)是什麼鬼?u又是什麼?什麼型態?在哪宣告?有初始化嗎?到現在都還不會發問的技巧嗎...
    2011年9月12日 上午 03:12
  •  

      Dim x() As String = Nothing
        Dim u As Integer
    
        Public Function SPLITyahoomessage() As Long    '擷取窗口語句
    
    
            u = Val(ListBox1.SelectedIndex)
    
            ca = Len(TextBox1.Text)               ' 這段可能會有bug 應該改成截取過的語句不要再進行match
            If ca > 0 Then
                Exit Function
            End If
           
    
    
            Dim lCount1 As Integer
            lCount1 = 0
            If ListBox1.SelectedIndex < 0 Then
                Exit Function
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
    
            'TextBox1
            '----------------------------
            Dim textBuilders() As String = Split(textBuilder, " (")
            For i As Integer = 0 To textBuilders.Length - 1
    
    
            Next
    
    
            Dim InputText As String = RichTextBox3.Text
            '-----------------------------
            '系統時間的部分
    
            Dim nowdate As String = Now.ToString("yyyy/M/d")
    
            Dim saveNow As DateTime = DateTime.Now   '取得系統目前時間
    
    
            Dim hour As String = saveNow.Hour
    
            Dim minute As String = saveNow.Minute
    
            minute = minute - 1
            '-------------------------------------------------
            '處理上午下午時間
            Dim 上下午 As String
            If hour > 12 Then
    
                上下午 = "下午"
                hour = hour - 12
    
            Else
                上下午 = "上午"
                If hour = 0 Then
                    hour = 12
                End If
            End If
    
            '-------------------------------------------------
            If hour <= 9 Then          ' 處理時數和分數
                hour = String.Concat("0", hour)
            End If
    
            If minute <= 9 Then
                minute = String.Concat("0", minute)
            End If
    
    
    
    
            '-------------------------------------------------
            Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\): (?<text>.*)")
    
            '-------------------------------------------------
    
            If x(u) = regex.ToString Then      '  掃瞄過的句子直接跳出
                Exit Function
            End If
    
    
    
    
            '------------------------------------------
            Dim matches As MatchCollection = regex.Matches(InputText)
            '-------------------------------------------------------
    
            Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
            '----------------------------------------
            x(u) = regex.ToString          '將掃瞄過的句子記憶下來 防止再次掃描
    
    
            '-------------------------------------------
    
    
    
    
    
            Return lCount1
            Exit Function
    
    
        End Function
    

     

    不好意思  我沒把我的問題描述清楚

    x(u) 在這邊應該稱做全域陣列變數型態 以上是完整的程式碼 請參考..

     

     



    • 已編輯 向恩 2011年9月12日 上午 04:01
    2011年9月12日 上午 03:49
  • 2011年9月12日 上午 04:14
  • 謝謝 

    我剛剛測試了一下 在這邊 我加入了的陣列變數去記憶讀取過的句子

    照理說應該可以在讀取到同樣的句子跳出match

    可是在這邊還是照常match  我不曉得怎樣解決這裡的問題

    現在把專案檔PO到skydriver上 希望各位能幫我一起解決問題

     

    連結: 

    https://skydrive.live.com/redir.aspx?cid=105b2868cb2df559&resid=105B2868CB2DF559!185

    2011年9月12日 上午 06:29
  • Timer2裡,有關x(u)的程式都要註解,不然會出錯吧...
    2011年9月12日 上午 07:33
  • Joe Hung 大大  不好意思 不太懂你說這邊x(u)註解的意思
    我在timer2中已經有加入了以下這幾行  不過似乎沒有發揮功效 這邊麻煩指點一下了
      
    ReDim Preserve x(u)
            '-------------------------------------------
            If x(u) = x(u) Then      '  在這邊因為textBuilders掃瞄過 又變了 所以這邊會通過
                Exit Sub
            End If
    
    

    • 已編輯 向恩 2011年9月12日 上午 08:52
    2011年9月12日 上午 08:52
  • 那四列都刪掉,不刪掉執行難道不會出錯嗎...
    2011年9月12日 上午 10:13
  • 這四列都要刪掉?

    沒刪掉還是可以照常執行  只不過在這邊他似乎沒辦法達成我的要求

    我不太清楚Timer2這邊應該怎麼處理比較好 麻煩指正一下我的錯誤.


    • 已編輯 向恩 2011年9月12日 上午 11:04
    2011年9月12日 上午 11:03
  •     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
            Label2.Text = Now.ToString("HH:mm:ss")
            subChanged()
    
        End Sub
    
        Private Sub subChanged()
    
            Dim hwnd4 As IntPtr
            Dim obj As mshtml.HTMLDocument
            Dim STemp(100) As String
    
            If ListBox1.SelectedIndex < 0 Then
                Exit Sub
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
            Dim hwnd1 As IntPtr = FindWindow(vbNullString, textBuilder)
            Dim hwnd0 As IntPtr = FindWindowEx(hwnd1, 0, "YHTMLContainer", vbNullString)
            hwnd4 = FindWindowEx(hwnd0, 0, "Internet Explorer_Server", vbNullString)
    
            GetWindowText(hwnd4, STemp(100), Len(STemp(100)))
            If hwnd4 <> 0 Then
                obj = WDom(hwnd4)
                If Not (obj Is Nothing) Then
                    RichTextBox3.Text = obj.body.innerText
                End If
            End If
    
        End Sub
    
        Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    
            subChanged()
    
        End Sub
    
    

    把x(u)、u、regex的內容貼上來,到現在還是不會自行除錯嗎...
    2011年9月12日 下午 12:51
  • Dim x() As String
        Dim u As Integer
    
    
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
    
            Label2.Text = Now.ToString("HH:mm:ss")
    
    
            ReDim Preserve x(u)
            '-------------------------------------------
            If x(u) = x(u) Then      '  在這邊因為textBuilders掃瞄過 又變了 所以這邊會通過
                Exit Sub
            End If
    
            '--------------------------------------------
    
            Call ListBox1_SelectedIndexChanged()
    
    
    
        End Sub
    
    
      Public Function SPLITyahoomessage() As Long    '擷取窗口語句
    
    
            u = Val(ListBox1.SelectedIndex)
    
            ca = Len(TextBox1.Text)               ' 這段可能會有bug 應該改成截取過的語句不要再進行match
            If ca > 0 Then
                Exit Function
            End If
    
    
    
            Dim lCount1 As Integer
            lCount1 = 0
            If ListBox1.SelectedIndex < 0 Then
                Exit Function
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
    
            'TextBox1
            '----------------------------
            Dim textBuilders() As String = Split(textBuilder, " (")
            For i As Integer = 0 To textBuilders.Length - 1
    
    
            Next
    
    
            Dim InputText As String = RichTextBox3.Text
            '-----------------------------
            '系統時間的部分
    
            Dim nowdate As String = Now.ToString("yyyy/M/d")
    
            Dim saveNow As DateTime = DateTime.Now   '取得系統目前時間
    
    
            Dim hour As String = saveNow.Hour
    
            Dim minute As String = saveNow.Minute
    
            minute = minute - 1
            '-------------------------------------------------
            '處理上午下午時間
            Dim 上下午 As String
            If hour > 12 Then
    
                上下午 = "下午"
                hour = hour - 12
    
            Else
                上下午 = "上午"
                If hour = 0 Then
                    hour = 12
                End If
            End If
    
            '-------------------------------------------------
            If hour <= 9 Then          ' 處理時數和分數
                hour = String.Concat("0", hour)
            End If
    
            If minute <= 9 Then
                minute = String.Concat("0", minute)
            End If
    
    
            '-------------------------------------------------
            Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & hour & ":" & minute & ":[0-5]\d{1}\): (?<text>.*)")
    
            '-------------------------------------------------
            ReDim Preserve x(u)
            If x(u) = regex.ToString Then      '  在這邊因為textBuilders掃瞄過 又變了 所以這邊會通過==
                Exit Function
            End If
    
            '------------------------------------------
            Dim matches As MatchCollection = regex.Matches(InputText)
            '-------------------------------------------------------
    
            Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
            '----------------------------------------
            x(u) = regex.ToString          '將掃瞄過的句子記憶下來 防止再次掃描
    
    
            '-------------------------------------------
    
    
    
    
    
            Return lCount1
            Exit Function
    
    
        End Function



    上面是我程式碼跟x(u),u,regex有關的部分
    下面是這三個變數會記憶的內容 (當然這邊會隨著listitem改變變不同)
    x(u) >>>ADO \(2011/9/13 上午 01:0-1:[0-5]\d{1}\): (?<text>.*)
    u = Val(ListBox1.SelectedIndex)
    regex>>>{ADO \(2011/9/13 上午 01:01:[0-5]\d{1}\): (?<text>.*)}
    這邊的情況 有點棘手 我自己也在這邊研究了挺久的 不知道該怎麼debug Timer2這邊...

    • 已編輯 向恩 2011年9月12日 下午 05:12
    2011年9月12日 下午 05:12
  •   Dim u As Integer
        Dim x() As String
        Dim s() As String
       
    
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    
            u = Val(ListBox1.SelectedIndex)
            Label2.Text = Now.ToString("HH:mm:ss")
    
            ReDim Preserve x(u)
            ReDim Preserve s(u)
            '-------------------------------------------
            If x(u) = s(u) Then
                Exit Sub
            End If
            '--------------------------------------------
    
            Call ListBox1_SelectedIndexChanged()
    
            s(u) = x(u)
    
        End Sub
    


    在timer2這裡 我另外加一個陣列s(u) 去儲存在 SPLITyahoomessage() 這邊記憶到的語句
    不過我運行的時候 不曉得為什麼 只有第一個窗口 擷取一次語句之後 就不再擷取了
    然後第二個窗口的語句 已經截取過語句之後 好像沒有記憶下來 還是拼命的做截取的動作
    SPLITyahoomessage() 這邊沒有做任何的更動
    我研究了很久 麻煩哪位高手指點一下這邊..

    • 已編輯 向恩 2011年9月13日 下午 12:09
    2011年9月13日 下午 12:08
  • 2011年9月13日 下午 01:35
  • 嗨,Joe Hung

    我參考了你po的這個範例參考呼叫副程式事件的方法, 我在SPLITyahoomessage() 中

    將這行 x(u) = regex.ToString 改成了這樣 Me.Controls(x(u)).Text = regex.ToString

    不過這行出現了錯誤訊息 :

    並未將物件參考設定為物件的執行個體。

    請問邊該如何修正才是正確?

    2011年9月13日 下午 03:51
  • 您在改什麼鬼?您的邏輯思考在哪裡?您要去補習班上課或買本基礎書自修,會比較好吧,

    一、請改回x(u) = regex.ToString,您誤會很大 ,判斷regex是否重複,只在SPLITyahoomessage()這個函式裡有意義

    ,寫在Timer2裡

    無用,甚至還寫出x(u) = x(u),x(u) = s(u),這種火星文程式,怎麼回事?

    二、ListBox1_SelectedIndexChanged事件,您的寫法,應該是無法觸發,參考程式和網址,

    前面都貼過了,您不用也沒辦法...


    • 已編輯 Joe Hung 2011年9月14日 上午 01:43
    2011年9月14日 上午 01:41
  • 嗨,Joe Hung

    不好意思 之前我的判斷有誤 我之前在測試 一直以為是time2這邊影響了SPLITyahoomessage()這裡的判斷

    所以寫了那些東西

    我現在用了兩個窗口項目去做測試

    我現在再做測試的結果似乎問題發生在u(1) 這個位置的陣列 u(0)有記憶下來然後退出SPLITyahoomessage()

    可是u(1)這個明明已經發送出去一次了 應該有記憶下來 可是程式再度運行到

    x(u) = regex.ToString

    這邊 x(1) 沒有東西 沒有記憶下來 一樣會再度把掃描過的句子在掃進去 請協助我解決這邊的問題 謝謝


    • 已編輯 向恩 2011年9月14日 上午 04:21
    2011年9月14日 上午 04:05
  • u(1)又是從哪來的?下中斷點在x(u) = regex.ToString這列,ListBox1.SelectedIndex值有變化嗎?確定u = 1嗎...
    2011年9月14日 上午 04:21
  • 我在 SPLITyahoomessage() 最上方有加入這行

     u = Val(ListBox1.SelectedIndex

    所以x(1) 指得就是第二個窗口  ListBox1.SelectedIndex 會指派u=1

    然後x(u) 這邊就會變x(1)

     

    可是在下面的判斷式這邊 If x(u) = regex.ToString Then 好像無法判別到x(1) 不曉得是不是這邊要更改

     

     

    ReDim Preserve x(u)
            If x(u) = regex.ToString Then                 
    
              Exit Function
            End If
    
    
    
    
            '------------------------------------------
            Dim matches As MatchCollection = regex.Matches(InputText)
            '-------------------------------------------------------
    
            Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
            '----------------------------------------
            x(u) = regex.ToString   '將掃瞄過的句子記憶下來 防止再次掃描
    
    

     

    ps:u(1) 那邊打錯了是x(1) 才對

     



    • 已編輯 向恩 2011年9月14日 上午 05:06
    2011年9月14日 上午 05:05
  • 剛剛我又修改了一下 嘗試用x(0)   x(1) 去當中斷點 

    我發現x(0) 一直有把掃過的句子 給記憶下來  可是x(1) 掃過之後 不曉得為什麼 他記憶的句子

    遽然無故消失了...

    以下是我修改的程式碼:

     Dim u As Integer
        Dim x() As String

        Public Function SPLITyahoomessage() As Long    '擷取窗口語句
    
    
            u = Val(ListBox1.SelectedIndex)
    
            ca = Len(TextBox1.Text)               ' 這段可能會有bug 應該改成截取過的語句不要再進行match
            If ca > 0 Then
                Exit Function
            End If
    
    
    
            Dim lCount1 As Integer
            lCount1 = 0
            If ListBox1.SelectedIndex < 0 Then
                Exit Function
            End If
            Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
    
            'TextBox1
            '----------------------------
            Dim textBuilders() As String = Split(textBuilder, " (")
            For i As Integer = 0 To textBuilders.Length - 1
    
    
            Next
    
    
            Dim InputText As String = RichTextBox3.Text
            '-----------------------------
            '系統時間的部分
    
            Dim nowdate As String = Now.ToString("yyyy/M/d")
    
            Dim saveNow As DateTime = DateTime.Now   '取得系統目前時間
    
    
            Dim hour As String = saveNow.Hour
    
            Dim minute As String = saveNow.Minute
    
            minute = minute - 1
            '-------------------------------------------------
            '處理上午下午時間
            Dim 上下午 As String
            If hour >= 12 Then
    
                上下午 = "下午"
                hour = hour - 12
    
            Else
                上下午 = "上午"
                If hour = 0 Then
                    hour = 12
                End If
            End If
    
            '-------------------------------------------------
            If hour <= 9 Then          ' 處理時數和分數
                hour = String.Concat("0", hour)
            End If
    
            If minute <= 9 Then
                minute = String.Concat("0", minute)
            End If
    
    
            '-------------------------------------------------
    
            Dim regex As Regex = New Regex(textBuilders(0) & " \(" & nowdate & " " & 上下午 & " " & "05" & ":" & "08" & ":[0-5]\d{1}\): (?<text>.*)")
            '-------------------------------------------------
            ReDim Preserve x(0)
            ReDim Preserve x(1)
    
            If x(1) = regex.ToString Then
                Exit Function
            End If
    
            If x(0) = regex.ToString Then
                Exit Function
            End If
          
    
            '------------------------------------------
            Dim matches As MatchCollection = regex.Matches(InputText)
            '-------------------------------------------------------
    
            Dim intCount As Integer = 0
            For Each m As Match In matches
                Dim result As String = m.Groups("text").Value
                intCount += 1
                Me.Controls("TextBox" & intCount).Text = result
            Next
            '----------------------------------------
            x(u) = regex.ToString   '將掃瞄過的句子記憶下來 防止再次掃描
    
    
            '-------------------------------------------
    
            Return lCount1
            Exit Function
    
    
        End Function
    

    請各位高手指導一下我的錯誤點在哪!

     


    • 已編輯 向恩 2011年9月14日 上午 09:55
    2011年9月14日 上午 09:36
  •   ReDim Preserve x(ListBox1.Items.Count-1)
    
    • 已標示為解答 向恩 2011年9月14日 下午 01:10
    2011年9月14日 下午 12:58