edama2さんからの投稿です。いつもながら、(同じAppleScriptを書いているのに)異種格闘技のようなフレーバーの違いを感じるものですが、ソースコードを美しく書くことへのこだわりと、実際に実現されている機能については折り紙つきです。
—- >8 投稿ここから
タイトルは「日付ダイアログで開始時と終了時を選択する」です。
「アラートダイアログ上のDate Pickerで日付選択」をベースに日付をふたつ選択できるようにしました
結果はレコードで帰って返ってきます
--> {|開始日|:date "2019年10月23日 水曜日 21:23:04", |終了日|:date "2019年10月24日 木曜日 21:23:04"}
NSDatePickerのコメントアウトしている部分を変更するとカレンダー以外にもできます
スプリクトオブジェクトの使い方が奇怪(?)だと思うかもしれませんが、
script-factory さんのクラスオブジェクトのやり方を参考に結果のプロパティ値を本体と分離するためにこうしています。
制作環境:macOS10.14.6
—– >8 投稿ここまで
まず「property parent : AppleScript」で腰を抜かしてしまいました。なるほど、こういう逃げ道があったんですか。Script文の中にCocoaの機能を呼び出すAppleScriptObjCを書く方法がなかなか見つからずに、個人的にそういう書き方はしてこなかったところですが、これは実際に試してみないと。
AppleScriptで作った部品を積み上げて新しい概念や機能を実現することには関心がありますが、記法の限界を探るという方向にはほとんど興味がないので、参考になります。
自分も、NSDatePickerにNSBoxをかぶせてアラートダイアログに表示させるところまでは同様に作っていたんですが、サイズの調整に手間取って、思い通りの表示を行えていませんでした。はい、まさにこういう形のものが作りたかった(利用したかった)ので、これを見て勉強させていただきましょう。
AppleScript名:日付ダイアログで開始時と終了時を選択する.scpt |
on run set dateObj to my chooseDate("期間を選択", "開始日と終了日を選択してください。", "開始日", "終了日") end run #カレンダー作成対象の年、月を選択(ただし、日付をクリックして選択しないと値を取得できないので注意) on chooseDate(aMainMes, aSubMes, aLabel1, aLabel2) script MyDialog property parent : AppleScript use AppleScript use scripting additions use framework "Foundation" property _the_date : missing value on make set aClass to me script property parent : aClass end script end make ## ダイアログの呼び出し on chooseDate(aMainMes, aSubMes, aLabel1, aLabel2) set paramObj to {myMessage:aMainMes, mySubMessage:aSubMes, myLabel1:aLabel1, myLabel2:aLabel2} parent’s performSelectorOnMainThread:"raize:" withObject:paramObj waitUntilDone:true return (my _the_date) end chooseDate ## ダイアログの生成 on raize:paramObj set aMainMes to paramObj’s myMessage set aSubMes to paramObj’s mySubMessage set aLabel1 to paramObj’s myLabel1 set aLabel2 to paramObj’s myLabel2 set setTime1 to current date set setTime2 to setTime1 + days set aList to {} set aList’s end to {boxLabel:aLabel1, aTime:setTime1} set aList’s end to {boxLabel:aLabel2, aTime:setTime2} set viewList to {} set datePickerList to {} set parentViewWidth to 0 set aMargin to 8 set countItem to count aList repeat with num from 1 to countItem set anItem to (aList)’s item num set setLabel to anItem’s boxLabel set setTime to anItem’s aTime ## create a view set opt to current application’s NSYearMonthDayDatePickerElementFlag –set opt to opt + (current application’s NSHourMinuteSecondDatePickerElementFlag as integer) tell current application’s NSDatePicker’s new() –setDatePickerStyle_(current application’s NSClockAndCalendarDatePickerStyle) –> 10.13以下 setDatePickerStyle_(current application’s NSDatePickerStyleClockAndCalendar) –> 10.14以上 カレンダー –setDatePickerStyle_(current application’s NSDatePickerStyleTextField) –> 10.14以上 テキスト入力 –setDatePickerStyle_(current application’s NSDatePickerStyleTextFieldAndStepper) –> 10.14以上 ステップ入力 setDatePickerElements_(opt) setDateValue_(setTime) set thisSize to fittingSize() setFrameSize_(thisSize) ### 余白の大きさを指定 set aWidth to (thisSize’s width) + aMargin * 3.75 set aHeight to (thisSize’s height) + aMargin * 5.25 set boxFrameSize to current application’s NSMakeSize(aWidth, aHeight) setFrameOrigin_(current application’s NSMakePoint(aMargin, aMargin)) log frame() set theDatePicker to it end tell tell current application’s NSBox’s new() setTitle_(setLabel) addSubview_(theDatePicker) setFrameSize_(boxFrameSize) setFrameOrigin_(current application’s NSMakePoint(parentViewWidth, 0)) set viewList’s end to it end tell ### 親NSViewの大きさを指定 set countItem2 to count viewList repeat with num2 from num to countItem2 set anItem2 to viewList’s item num2 set tmpFrame to anItem2’s frame() set aBoxWidt to current application’s NSWidth(tmpFrame) set parentViewHeight to current application’s NSHeight(tmpFrame) set parentViewWidth to parentViewWidth + aMargin + aBoxWidt log result end repeat ### set datePickerList’s end to {pickerObj:theDatePicker, keyLabel:setLabel} end repeat tell current application’s NSView’s new() –setAutoresizingMask_(0) –setAutoresizesSubviews_(true) setFrameSize_(current application’s NSMakeSize(parentViewWidth, parentViewHeight)) setSubviews_(viewList) set theView to it end tell ## set up alert tell current application’s NSAlert’s new() setMessageText_(aMainMes) setInformativeText_(aSubMes) addButtonWithTitle_("OK") addButtonWithTitle_("Cancel") setAccessoryView_(theView) set returnCode to runModal() — show alert in modal loop end tell if returnCode = (current application’s NSAlertSecondButtonReturn) then error number -128 ## retrieve date set keyList to {} set dateList to {} repeat with anItem in datePickerList set keyList’s end to anItem’s keyLabel set dateList’s end to (anItem’s pickerObj)’s dateValue() as date end repeat set my _the_date to (current application’s NSDictionary’s dictionaryWithObjects:dateList forKeys:keyList) as record log result end raize: end script ## tell (make MyDialog) return chooseDate(aMainMes, aSubMes, aLabel1, aLabel2) end tell end chooseDate |