2012年11月22日木曜日

Struts2 + Spring + mybatis! とりあえず付箋ペタペタ機能を一通り作ってみた

超久しぶりのTagDiaryです。

ちょっと作るたびにblogを更新、だと却ってやる気を失ってしまうので、「ここでまずひと段落」というところまで作りました。
https://github.com/ymotchi/TagDiary

ここまでで、
  • ユーザを作る
  • ログインする
  • 付箋をペタペタ貼る
  • 付箋に文字を書く
  • 付箋を保存する
ができるようになりました。「TagDiary」ってくらいですから、日付ごとに付箋をまとめるような感じにしたかったのですが、まずはその前まで。

もし「利用してみたい」という方がいらっしゃれば、
mavenのプロジェクトを作る → プロジェクト直下にGitHubにあるsrcディレクトリとpom.xmlが来るようにダウンロードする → ビルドする → アプリケーションサーバを起動する
で使えると思われます。

また、こいつはMySQLも使っておりまして、テーブルを2つほど作ってやってください。

user
iduserINT(11) PK, NN
useridVARCHAR(16) NN, UQ
passwordVARCHAR(128) NN

tag
idtagINT(11) PK, NN
iduserVARCHAR(16) NN
tagseqINT(11) NN
xINT(11) NN
yINT(11) NN
widthINT(11) NN
heightINT(11) NN
contentsTEXT

わたくし、今までMySQLをほとんど知りませんで、"contents"列はCLOBにしたいんだけどCLOBは・・・などと思っておりましたら、MySQLではTEXTというのですね。

サーバが起動したら、「http://localhost:ポート/コンテキストルート/create_user_init」にアクセスしてユーザ作成、その後「.../login_init」にアクセスしてログインすると、付箋の編集画面に行きます。

ここで、四角の中をダブルクリックすると、付箋が出現。付箋はサイズ変更やドラッグ&ドロップOK。中身をクリックすれば、文字が書けます。付箋を右クリックすると、メニューが現れ、削除が可能です。下のボタンを押せば保存ができ、次回ログインしたときに、前回書いたものが再現されます。

・・・とつらつら書いてもわかりづらいものです。
よってここに、保存を除いた付箋ペタペタ機能のデモを作りました。この部分はJavascriptでいろいろやっているだけです。


なんかたまに右クリックメニューがあらぬところに現れますが、そこはご愛嬌。

エビデンス!エビデンス!!エビデンス!!! VBAでクリップボード監視 その3

第1回 → エビデンス!エビデンス!!エビデンス!!! VBAでクリップボード監視
第2回 → エビデンス!エビデンス!!エビデンス!!! VBAでクリップボード監視 その2
ユーザーフォームのソースコード → gist
標準モジュールのソースコード → gist

最後に補足。

このマクロを含めたブックは、自動保存をOFFにしたほうが良いです。また、マクロ実行中にブックを保存した場合、保存途中にPrintScreenを押してはいけません。良い子と僕らの約束だぞ。

というのも、クリップボードの変化を検知した後に、画像をシートに貼りつける部分
Public Sub pasteToSheet()
    Dim rowIdx As Integer
     
    With Sheet1
        If .Shapes.Count > 0 Then
            With .Shapes(.Shapes.Count)
                rowIdx = (.Top + .Height) / ROW_HEIGHT + 4
            End With
        Else
            rowIdx = 1
        End If
        .Cells(rowIdx, 1).PasteSpecial
    End With
End Sub
これの、"With .Shapes(.Shapes.Count)"がエラーになるから。
なんでかはよくわからないけど、保存中は、オートシェイプがVBAから正しく認識されないっぽい。
何せ保存中なのだから、そんなことがあってもしょうがない。というわけで、自動保存も非推奨です。

あと、前回こんな風に書きました。
  1.  WM_NCHITTESTであれば…
    これは実ははまるところなのですが、クリップボードの処理に直接関係ないので、次回に飛ばします。
これについてですが、WM_NCHITTESTの時にもCase Elseのようにもともとのウィンドウプロシージャを呼び出すようにすると、マウスカーソルがフォームの中に入った途端なぜだかCPUの使用率が跳ね上がり、フォームが反応しなくなります。無限ループに陥ってるっぽい。
勝手に元ネタにさせていただいたこちらでも、同じかわからないけど、似たような現象を確認されているし・・・。

この"WM_NCHITTEST"というのは、どうやら、マウスが動いたとか、ボタンが押されたとか、とにかくマウス系のイベントが起こると真っ先に送られるものらしく(MSのデベロッパー センター デスクトップ) 試しにこのメッセージを受け取った時にDebug.Printなどしてやると、フォームの上でマウスをぐりんぐりん動かしたときに、まあ出るわ出るわ。

この無限ループっぽい動きの原因はよく分かっていないのですが、このメッセージの時だけ何もしないようにしてやれば、とりあえず大丈夫そうです。
ただしこの場合、クリップボード監視中にフォームをクリックしても、ウィンドウがアクティブになった時の色にならなくなってしまうのですが・・・まぁ動くからよし。
チェックボックスのクリックもできるし。

というわけで、VBAでクリップボード監視はこれでおしまいです。

あと改良するなら、PrintScreenを押したときに、ちゃんと「押されたよ」的なポップアップがうにょんと最前面に出るといいかもしれません。対象のウィンドウを最大化していて、Excelが後ろに隠れていると、本当にPrintScreenが押されたかどうかすぐに確認できないんですよね。