昨日大学の同期で集まって呑んでたんですが、そこでふと仕事の話に。
で、同席したwillがC#の仕事をやらにゃーならんとかで嘆いて居ったので今日ちょっくら調べてみた。
昨日酒の席でちらりと聞いた話によると、大雑把な仕様としては
・saveFileDialogを呼び出す
・が、セキュリティの都合上(?)、○分でそのダイアログを閉じたい
ということのよう。で、C#なんてやったことないし、しかもチーム内にも使える人はいないんだとか。で、仕方ないから受注先に尋ねてみてもあまりよく分かっていないらしい。
しゃーないから色々と調べてみているけれど、どうもまっとうな方法ではできないようで頭を抱えているといった感じ。
つーわけで暇だったこともあり調べてみました。
その結果、「そりゃ仕様が酷すぎると思うんだ・・・」な結果になりましたOrz
まず、saveFileDialogオブジェクトですが、通常こいつを呼出側から強制的に閉じるなんて使い方はしませんからそんな仕様になってません。saveFileDialogを開いた時点でウィンドウの制御は呼出元からダイアログの方に移ります。よーは呼出側は何もできないってことですな。
ということで、そんな無茶を通すにはひねくれたコーディングをせざるを得ません。パッと思いついた方法は
・saveFileDialogのShowDialogを実行するメソッドを別スレッドで走らせ、呼出元のメソッドにてそのスレッドを○分後に落とす
・saveFileDialogに相当するクラスを自作して、ShowDialogをoverrideする
の2つ。
まず前者は、別スレッドを強制的に殺すわけですからAbortくらいしか方法がないらしいということでちょっと気持ち悪い。まぁ要求仕様が気持ち悪いんだからこれくらいどうってことはないかも知れませんが^^;
ということで後者の可能性を探ってみました。
が、こちらも茨の道でした・・・。
というのも、saveFileDialogクラスを継承したら済むと思っていたのにこいつはsealedクラスで継承不可だったんですね。
しゃーねーからと思って1つ上のFileDialogクラスを継承しようと思ったんですがこちらも実質継承不可。従って更に上のcommonDialogクラスしか継承できません。
しかも邪魔くさいことに、commonDialogクラスは抽象クラスであり、こいつ自身はインスタンスを生成できないため、Formクラスの子クラスになっているにも関わらずShowDialogメソッドを実行できない! 正確には実行したところでDialogが出ないと来た。
つまるところ、ShowDialogメソッドを実行した時に表示されるFormは自前で用意しろと。結局のところFormを継承してsaveFileDialogっぽいUIを自前で作れってことじゃねーかOrz
そうなるとぶっちゃけcommonDialogクラスを継承するメリットなんて(今回の案件に限れば)ほっとんどないわけで。
なんぞそれーと嘆いていたらwillから助け船。PostMessageを使えばキーイベントとかを別ウィンドウに投げられるらしいと。
結局、スレッドを作ってsaveFileDialogを走らせ、呼出元でTimerイベントを使って時間になったらPostMessageでキャンセルボタンを押したことにする、という方向で作るみたいです。
ひとまず思いつく上では一番マシな方法でしょうか・・・? まぁ気になる点は一杯あるんですけれどね^^; 例えば、別スレッドで走らせると言うことは呼出元のウィンドウにも制御を渡すことができてしまうわけで、そうなると「呼出元のウィンドウの閉じるボタンが押されたらどうすんだ?」という疑問が〜とか。
やっぱダイアログ自作が一番無難かなーとは思うけど、C#まったく触ったことがないって人にやらせる内容じゃない気はするしなぁ・・・。
個人的にはC#は扱いやすい言語だと思うけど、さすがに全く触ったことがない状態でいきなり継承してoverrideしろってのは酷だと思う^^;
とりあえずはデスマに陥らないで済むことを祈っておくとしましょうw
SECRET: 0
返信削除PASS: 64fa84376bf93a7a4f06f52e1c5ee8cd
saveFileDialogである必要はあるのかな?
どうしても名前を変えて保存したいとかなら仕方ないけど、上書きでもいいなら「上書きしますか?(はい/いいえ)-残り2:19」というダイアログ出すだけでもいいんじゃないかな?勿論仕様にもよるけれど。
saveFileDialogに拘るのは理由があるのかしら?
SECRET: 0
返信削除PASS: 74be16979710d4c4e7c6647856088456
そりゃクライアントの要求だからどうかは知らないけど。
仕様として突き付けられているものを変えたいのならやっぱ交渉になるわけだし。それが通じるなら最初からやってるんじゃないのかね・・・?w