顯示具有 macro 標籤的文章。 顯示所有文章
顯示具有 macro 標籤的文章。 顯示所有文章

2015年2月5日 星期四

[VB] 透過 Macro (巨集) 亂數挑選句子 @ Microsoft Powerpoint / OpenOffice Impress

前幾天接到朋友的一個需求,我想了一會覺得應該不難,就下海摸索一下,使用情境如下:

活動中讓賓客可以跟一些世界名句拍照合影(例如七言絕句等),希望每個賓客都可以透過抽籤(亂數)機制跟不同句子拍照。

分析一下技術:
  • 亂數功能
  • 有一個文字區域,每次亂數得到的結果要更新在文字區
原本朋友是說用網頁也行,但我覺得活動場所要連網路好像有點危險(雖然純HTML+JS也能離線),於是乎還是來用用投影片模式 XD 方向:試試看巨集吧!

簡言之,以 Microsoft Office 2007 / OpenOffice Impress 為例,亂數用法:

Public Function chooseWords As String
Dim MyArray As Variant

REM *** Comment ***
MyArray = Array("懶人包", "天龍人", "卡卡獸", "給開司一罐啤酒", "完全沒有××", "數學老ㄙ常請假", "天大地大臺科大","雅量背影出師表")

REM *** Random ***
ArraySize = UBound(MyArray)
index = Int(Rnd * ArraySize ) + 1

REM *** Return
chooseWords = MyArray(index)
REM MSGBox(MyArray(index))
End Function


至於更換掉投影片內的文字框,以 OpenOffice Impress 為例,假定投影片只有第一張,且只有一個文字框:

Sub Main
Dim Doc As Object
Dim SlideList as Object
Dim Slide AS Object
Dim Target As Object

Doc = ThisComponent
SlideList = Doc.getDrawPages()
Slide = SlideList.getByIndex(0)
Target = Slide.getByIndex(0)
REM MSGBox(chooseWords())
Target.setString( chooseWords() )
End Sub


以 Microsoft Office 2007 - Powerpoint 為例:

Sub Main()
    For Each sld In ActivePresentation.Slides
        For Each sh In sld.Shapes
            Rem MsgBox sh.Type
            If sh.Type = msoPlaceholder Or sh.Type = msoTextBox Then
                sh.TextFrame.TextRange.Text = chooseWords()
            End If
        Next
    Next
End Sub


上述 Microsoft 文件比較豐富(至少對沒經驗的我來說比較快找到),發現可以判斷物件的型態( msoPlaceholder 和 msoTextBox )。

最後則是事件綁定,例如在什麼事件下,呼叫巨集(Macro: Main) ,在 Microsoft Office - PowerPoint 方面,發現在插入圖片後,點擊圖片時,可以替他增加"動作",這時就可以輕鬆綁定巨集,至於 OpenOffice Impress 的部分...由於需求解掉,就沒再繼續鑽了。

2014年3月20日 星期四

iOS 開發筆記 - 在 Compiler Time 使用 __has_include 偵測 Framework 是否存在

__has_include Framework

以 FacebookSDK 來說,之前一直都用 github.com/facebook/facebook-ios-sdk 來使用,最近發現 source tree 預設有一些 bug 無法在 Xcode 5.1 編譯成功,自行修又容易碰到維護問題,於是就跑去下載 Facebook 官方打包好的 facebook-ios-sdk-current.pkg 來用了。

之前用 Facebook source code 來編譯時,在 header file 的使用:

#import "Facebook.h"

然而,現在改用 FacebookSDK 時,則該使用

#import <FacebookSDK/FacebookSDK.h>

因此想要在 Compiler Time 來確認,因此來增加彈性。

所幸有找到類似堪用的方式(Include File Checking Macros):

#if defined(__has_include)
#if __has_include("FacebookSDK/FacebookSDK.h")
#import <FacebookSDK/FacebookSDK.h>
#else
#import "Facebook.h"
#endif
#endif


此外,在 Project 的 Build Settings,就可以這樣通用設定:
  • Framework Search Path: /path/sdk/FacebookSDK
  • Library Search Paths: ${SRCROOT}
  • User Header Search Path: /path/sdk/facebook-ios-sdk
其中 /path/sdk/FacebookSDK 指的是 facebook-ios-sdk-current.pkg 安裝位置(只要把pkg裡的 FacebookSDK.framework 拖進去會自動設定好),而 Library Search Paths 和 User Header Search Path 的設定則是為了採用 source tree 方式。