2009年10月11日 星期日

改造 Taglocity 3.0 Tag Bar (2) ---- 反映標籤狀態

繼上一篇, 改造 Taglocity 3.0 Tag Bar (1) ---- 讓 按鈕文字 變清爽 之後。接下來, 要來看看如何讓『Tag Bar 反映標籤狀態』。

底下的 VBA 程式, 不論是 操作範圍 或 執行時機, 都比要前一篇來得複雜, 所以建議先熟悉 Outlook 的巨集運作, 再來實作。

 

(1) 按鈕文字變清爽

(2) 反映標籤狀態

操作範圍

輸入 : Tag Bar 的文字
輸出 : Tag Bar 的文字
輸入 : 當前的郵件標籤
輸出 : Tag Bar 的狀態

執行時機

只需要執行一次 需要重複執行

.

讓 Taglocity 3.0 Tag Bar 反映標籤狀態

為了彈性和容易除錯, 把程式碼拆成幾個部份

  • 第一部份 ---- updateTagBar()
    1. 查出目前 Outlook 的視窗狀況, 只對郵件列表 (Explorer) 作處理, 因為此時才有 Tag Bar。將來如果需要, 可以擴充到單篇郵件 (Inspector)。
    2. 將多封郵件的標籤連結在一個字串裡
    3. 呼叫第二部份
  • 第二部份 ---- syncTagBar("標籤字串")
    1. 確認輸入參數為字串, 以避免意外錯誤
    2. 如果 Tag Bar 可見 (.Visible=True) 才繼續往下
    3. 取出 .DescriptionText (如果不是空字串), 否則取出 .Caption
      ** 這是上一篇的伏筆, 因為按鈕文字 (.Caption) 經過處理之後, 可能會和標籤兜不起來, 所以上一篇先將資訊存在平常用不到內部說明欄位 (.DescriptionText)
    4.  移除 按鈕文字開頭的 &2. 或是 12. 等數字, 這樣不管 Tag Bar 有沒有經過『清爽化』的處理, 都可以反映標籤狀態
    5. 根據標籤, 將按鈕的 .State 欄位設為 msoButtonDown 或 msoButtonUp

2009-10-10_170220 實作出來就像這樣, 橘色底色反映標籤狀態

光是以上的程式, 只能做到『一次性』的反映標籤狀態。

雖然有幾種不同的方式可以實現『定時重複執行』或是『觸發執行』, 但各有優缺點, 就留待下一篇再來詳細說明囉。

.

Public Sub updateTagBar()
Dim oSel, oItem As Object

mailTags = ""
Select Case TypeName(Application.ActiveWindow)
Case "Explorer"
Set oSel = Application.ActiveExplorer.Selection
For i = 1 To oSel.Count
Set oItem = oSel.Item(i)
mailTags = mailTags + ", " + oItem.Categories
Next
Case Else
Exit Sub
End Select

syncTagBar (mailTags)
End Sub

Sub syncTagBar(ByRef oInput As Variant)

On Error GoTo ErrorHandler

Select Case TypeName(oInput)
Case "String"
mailTags = oInput
Case Else
mailTags = ""
End Select

Set myTagBar = Application.ActiveExplorer.CommandBars.Item("Taglocity 3.0 Tag Bar")
If Not myTagBar.Visible Then Exit Sub
For i = 1 To myTagBar.Controls.Count
With myTagBar.Controls.Item(i)
If Len(.DescriptionText) > 0 Then
btnTag = .DescriptionText
Else
btnTag = .Caption
End If
' /-- Begin of optional section
c = Left(btnTag, 1)
If InStr(1, "&123456789", c) > 0 Then
p = InStr(1, btnTag, ". ")
If (p > 0) And (p <= 3) Then btnTag = Mid(btnTag, p + 2, 100)
End If
If Left(btnTag, 1) = " " Then btnTag = Mid(btnTag, 2, 100)
' \-- End of optional section
If (Len(mailTags) > 0) And (InStr(1, mailTags, btnTag) > 0) Then
.State = msoButtonDown
Else
.State = msoButtonUp
End If
End With
Next
ErrorHandler:
End Sub


.


0 意見:

發表您的回應

張貼留言