#http://www.ac-promenade.net/text/windowsmobile/ #Scripted by AC-Promenade http://www.ac-promenade.net/ #カレンダー・ビューテキスト #Calendar_ViewText.mscr #実行時の当月から指定月分のカレンダーを #等幅テキストファイルで作成し、保存するMortScript。 #PC上でも動作可能なので使い方は多々模索できればと思います。 #ViewText等でToday画面上に表示することを想定しており、 #PapeCaleの予定や、拙作のPapeCale_Sp.mscrとの連動も可能です。 #●使用方法概要 #いくつかの動作は設定により変更できます。 #・PC上でも動作可能です。 #・本mscrを実行すると静的にカレンダーのtxtファイルを作ります。 #・作成先の指定が無ければ実行mscrと同じフォルダに作成します。 #・カレンダーは7週7行のボックス型で、当月から指定月分並びます。 #・開始曜日も指定が可能です。(月曜開始から土曜開始まで7通り) #・ViewTextで表示する事を想定していますが限定はしておりません。 #・設定によりPapecaleの予定日を参照し、反映することができます。 #・Papecale_spの設定により、PapeTransと連動した生成ができます。 #・Papecale_spを使用しなくても、単体で自動日付更新ができます。 #・本mscrを複製すれば複数のカレンダー生成も可能です。 #・テキスト参照時は、等幅フォントを利用して下さい。 #●動作確認デバイス #DesktopPC, Advanced/W-ZERO3[es], WILLCOM 03, HYBRID W-ZERO3 #その他機種はMortScriptが動くならおよそ動くかと思います。 #PapeCaleが動くなら連動も可能だと思います。 #●必要環境 #・MortScript4.1以上(それ以下でも動くかも)、mscrの関連付け。 # http://www.sto-helit.de/ (PCサイト) #●補足事項 #・ViewText txtファイルをTodayに表示してくれます。必要なら。 # http://www.dream-seed.com/weblog/archives/2006/12/viewtext_12/ #・PapeCale 1.30以上 (軽量で優れたカレンダー型PIMソフト) # http://gen-soft.sakura.ne.jp/ #・PapeCale_Sp (軽量な予定カレンダーPapeCaleの実用補助) # http://www.ac-promenade.net/text/windowsmobile/index.html#PapeCale_Sp #尚、2038年問題は打ち止めとしてますのでご了承下さい。 #アンインストールの際は、"AutoDailyRun"による日付変更時更新の #登録を行っていれば解除して、本mscrを削除するだけで大丈夫です。 #その他レジストリの追加、別ファイルの作成等は行っていません。 #本mscrによって生じる不利益に当方は関与しません。 #設定変数値を除く内容に改ざんがない限り、再配布は自由です。 #内容に変更を加えた際の再配布は、必ずその変更前と変更後の #明記を、本文中にて行ってあれば構いません。 #--------------------------------------------------------------- #以下環境設定 #(書き換えの際、文字コードS-JISが変換されないよう御注意下さい。) #■カレンダー開始曜日を0〜6の範囲で指定。(0=日曜日〜6=土曜日) StartWeek=0 #■実行月から、何か月分のカレンダーを生成するか、整数で指定。 #あまり多くすると作成に時間がかかるので、少ない方が良いです。 SetMonth=2 #■カレンダーのtxtファイル出力先をパスで指定。 #パスはファイル名を省略しても、指定しても構いません。 #空白時は本mscrと同一のフォルダに作成されます。 CaleOutPath="" #■本mscrが予定参照対象とするPapeCaleのppcファイルのパスを指定。 #パス指定先にファイルが存在しなければこの機能は無視されます。 #(故意に利用しないのであれば""内を空欄にでもして下さい。) ppcFilePath="\My Documents\PapeCale\MyMemo.ppc" #■本mscr実行後、Today画面を更新する=1、しない=0。 #PapeCale_Spを利用している場合、特にこの機能は必要ありません。 #PC実行の場合は無視されます。 ReToday=0 #■日付変更時、自動でカレンダーを再生成をする=1、しない=0。 #初回実行時のみ登録/解除を行います。後はそのまま使用して下さい。 #Notificationsの登録なので常駐しません、自動削除も行っています。 #日付変更起動しなかった時は、次回本mscr起動時に再登録されます。 #本mscrの名前やパスを変更した場合PapeCale更新時に修正されます。 #本mscrを削除する際は、事前に=0にして解除実行して下さい。 #予めファイル名に任意の文字を加えておけば、忘れないと思います。 #RunAtがあるなら、=0にして自前で登録管理しても良いと思います。 #PapeCale_Spを利用している場合、特にこの機能は必要ありません。 #PC実行の場合は無視されます。 AutoDailyRun=0 #■日付変更時の実行を、0時0分何秒に行うか整数で指定。 #特に複数の同時刻処理が懸念されるなら、適切に指定して下さい。 #AutoDailyRunが有効の場合にのみ影響します。 #PapeCale_Spを利用している場合、特にこの機能は必要ありません。 #PC実行の場合は無視されます。 OffSetSec=55 #--------------------------------------------------------------- #バージョン履歴 #2.00 生成速度を優先すべく、コードをほぼ全体的に書き直しました。 #1.00 公開。 #--------------------------------------------------------------- #Main Script #LastQueueSt PreAutoDailyRun=0 Tomorrow=1240358445 LastFilePath="" #LastQueueEd #■PC区別パラメータ整形 If(SystemVersion("platform") ne "WinCE") AutoDailyRun=0 ReToday=0 Else #■RunAt関連 If(TransOnly=1) ToggleDisplay(True) EndIf If(AutoDailyRun<>1) AutoDailyRun=0 EndIf If(ReToday<>1) ReToday=0 EndIf If (AutoDailyRun<>PreAutoDailyRun) Call("RunAtQueue") If(AutoDailyRun=1) Message ("日付変更時の自動起動を^NL^登録しました。") Else Message ("日付変更時の自動起動を^NL^解除しました。") EndIf Exit EndIf EndIf #■準備 NowTimeStamp=TimeStamp() NowY=FormatTime("Y",NowTimeStamp) NowM=FormatTime("m",NowTimeStamp) NowD=FormatTime("d",NowTimeStamp) NowW=FormatTime("w",NowTimeStamp) #■パラメータ整形 If(StartWeek<0) StartWeek=0 Else StartWeek=StartWeek mod 7 EndIf FinMonth=(2038-NowY)*12-NowM+2 If(SetMonth<1) SetMonth=1 ElseIf(SetMonth>FinMonth) SetMonth=FinMonth EndIf If(CaleOutPath eq "") OutputFilePath=SystemPath("ScriptPath")\SystemPath("ScriptName")&".txt" If(Find(OutputFilePath,"\\\\")) OutputFilePath=Replace(OutputFilePath,"\\\\","\\") EndIf ElseIf(DirExists(CaleOutPath)) OutputFilePath=CaleOutPath\SystemPath("ScriptName")&".txt" ElseIf(DirExists(SubStr(CaleOutPath,1,ReverseFind(CaleOutPath,"\")))) OutputFilePath=CaleOutPath Else Message("CaleOutPath指定先が有効ではありません^NL^"&CaleOutPath) SetMonth=0 EndIf If(FileAttribute(OutputFilePath,"readonly")) SetMonth=0 EndIf #▼エラー回避用 If(SetMonth) #■ppcファイル準備 ppcFound=0 If(FileExists(ppcFilePath)) ppcRead=ReadFile(ppcFilePath,0,"unicode-prefix") ppcForEnd=(NowM+SetMonth-1)/12 For i = 0 to ppcForEnd step 1 ppcFound=Find(ppcRead,""""&NowY+i) If(ppcFound) ppcRead=SubStr(ppcRead,ppcFound) i=ppcForEnd EndIf Next If(Not ppcFound) ppcRead="" EndIf EndIf If(Not ppcFound) OpnD=" " ClsD=" " EndIf #■先行して準備、曜日と空白関連 (使いまわせるのでリピートに入れない) CalendarSPHFull=" " CalendarSPTFull=" ^NL^ " WeekName=Array(" Mon"," Tue"," Wed"," Thu"," Fri"," Sat"," Sun"," Mon"," Tue"," Wed"," Thu"," Fri") WeekName[0]=" Sun" CalendarW=WeekName[StartWeek]\ &WeekName[StartWeek+1]\ &WeekName[StartWeek+2]\ &WeekName[StartWeek+3]\ &WeekName[StartWeek+4]\ &WeekName[StartWeek+5]\ &WeekName[StartWeek+6]&" ^NL^ " #▼作成月リピート ThisMonth=1 WriteFile(OutputFilePath,CalendarText,0,"jis") CntTimeStamp=NowTimeStamp-(NowD-1)*86400 Repeat(SetMonth) CntY=FormatTime("Y",CntTimeStamp) CntM=FormatTime("m",CntTimeStamp) #■月作成 If(CntM=10) CalendarM="O" ElseIf(CntM=11) CalendarM="N" ElseIf(CntM=12) CalendarM="D" Else CalendarM=(CntM*1) EndIf #■先頭空白 OffSetWeek=(7+FormatTime("w",CntTimeStamp)-StartWeek) mod 7 CalendarSPH=SubStr(CalendarSPHFull,25-OffSetWeek*4) #■日付作成と、来月のタイムスタンプまでを取得 MaxCnt=0 Clear(DayBox) #日付1〜9 DZero="0" DSpace=" " Repeat(9) Call("MakeDayBox") EndRepeat DZero="" DSpace="" #日付10〜28 Repeat(19) Call("MakeDayBox") EndRepeat #日付29〜31 CntTimeStamp=CntTimeStamp+86400*MaxCnt While((FormatTime("d",CntTimeStamp) ne "01") and (MaxCnt<31)) Call("MakeDayBox") CntTimeStamp=CntTimeStamp+86400 EndWhile #■末尾空白 i=37-OffSetWeek-MaxCnt CalendarSPT=SubStr(CalendarSPTFull,41-4*(i+(i>2))) #■年月(当月なら日週と日付マーク)表示 If(ThisMonth) NumD=NowD*1 DayBox[NumD]=SubStr(DayBox[NumD],1,1)&"■"&SubStr(DayBox[NumD],4) CalendarDtl=" "&NowY&"--"&NowM&"--"&NowD&"--"&SubStr(WeekName[NowW],2)&" ^NL^^NL^" ThisMonth=0 Else CalendarDtl=" "&CntY&"--"&CntM&"--------- ^NL^^NL^" EndIf #■出力 WriteFile(OutputFilePath,CalendarM&CalendarW&CalendarSPH\ &DayBox[1]&DayBox[2]&DayBox[3]&DayBox[4]&DayBox[5]&DayBox[6]&DayBox[7]\ &DayBox[8]&DayBox[9]&DayBox[10]&DayBox[11]&DayBox[12]&DayBox[13]&DayBox[14]\ &DayBox[15]&DayBox[16]&DayBox[17]&DayBox[18]&DayBox[19]&DayBox[20]&DayBox[21]\ &DayBox[22]&DayBox[23]&DayBox[24]&DayBox[25]&DayBox[26]&DayBox[27]&DayBox[28]\ &DayBox[29]&DayBox[30]&DayBox[31]\ &CalendarSPT&CalendarDtl,1,"jis") EndRepeat EndIf #■RunAt関連 (PCの場合既に0) If(AutoDailyRun) If(TimeStamp() >= Tomorrow) Call("RunAtQueue") EndIf EndIf #■再描画 (PCの場合既に0) If(ReToday) RedrawToday EndIf #--------------------------------------------------------------- #Sub Script #■Call("RunAtQueue") Notifications Queue 登録/解除 Sub RunAtQueue ThisFile=SystemPath("ScriptName")&SystemPath("ScriptExt") ThisFilePath=SystemPath("ScriptPath")\ThisFile MortScriptPath=SystemPath("ScriptExe")\"MortScript.exe" RemoveNotifications(""""&MortScriptPath&"""",""""&LastFilePath&""" TransOnly=1") If(AutoDailyRun=1) If(OffSetSec<=1) OffSetSec=1 EndIf Tomorrow=TimeStamp() - (TimeStamp() mod 86400) + 86400 + OffSetSec RunAt(Tomorrow,""""&MortScriptPath&"""",""""&ThisFilePath&""" TransOnly=1") EndIf If(FileExists(ThisFilePath)) ThisFileText=ReadFile(ThisFilePath,0,"jis") PostFileText=Part(ThisFileText,"^NL^#LastQueueSt",1,0)\ &"^NL^#LastQueueSt"\ &"^NL^PreAutoDailyRun="&AutoDailyRun\ &"^NL^Tomorrow="&Tomorrow\ &"^NL^LastFilePath="""&ThisFilePath&""""\ &"^NL^#LastQueueEd"\ &Part(ThisFileText,"^NL^#LastQueueEd",-1,0) Sleep(300) WriteFile(ThisFilePath,PostFileText,0,"jis") EndIf EndSub #■Call("MakeDayBox") 各日付表示を生成して配列化 Sub MakeDayBox MaxCnt=MaxCnt+1 If(ppcFound) If(Find(ppcRead,""""&CntY&CntM&DZero&MaxCnt&"""")) OpnD="<" ClsD=">" Else OpnD=" " ClsD=" " EndIf EndIf If((MaxCnt+OffSetWeek) mod 7) DayBox[MaxCnt]=OpnD&DSpace&MaxCnt&ClsD Else DayBox[MaxCnt]=OpnD&DSpace&MaxCnt&ClsD&" ^NL^ " EndIf EndSub