2007年9月11日火曜日

かんたん付箋ツール

sprocketさんのサイトで、SQLite3を簡単に扱えるモジュールSQLeleが公開されました。データの保存・読み込みに費やしていた労力を大幅に削減することができるので、特にツール開発者の方々には重宝すると思います。

……ということで、初SQLele。1行だけの簡単な付箋を作成します。プライマリ・キーが1から始まることを利用し、ウィンドウIDを兼ねさせています。

CREATE TABLE実行時、主キー以外においてデータ型の宣言をしないように変更しました。(2007/09/19)
参考


// かんたん付箋ツール on SQLele
#uselib "user32.dll"
#func global ReleaseCapture "ReleaseCapture"
#include "sqlele.hsp"
#define FILENAME_DB         "tags.db"
#define WM_NCLBUTTONDOWN    0xA1
#define WM_MOVE             0x03
#define HTCAPTION           0x02

// 変数・DBの初期化
    new_memo = ""
    sql_open FILENAME_DB
    sql_q "CREATE TABLE IF NOT EXISTS TAGS ( ID INTEGER PRIMARY KEY, MEMO, X, Y)"

// メインウィンドウを作成
    syscolor 15 : boxf : syscolor 18
    mes "文章:"
    pos ginfo_mesx0 : input new_memo, ginfo_winx - ginfo_cx, , 254
    pos 0 : mes {"文字列を入力してEnter で 付箋の作成
左ドラッグ で 付箋の移動
右クリック で 付箋の廃棄"}


// on系命令の準備
    onkey   gosub *onkey_flag
    onclick gosub *click_flag
    onexit  goto  *exit_flag

// すべての付箋を作成する
    gosub *make_all_tags
    stop

// Enterキー判定用
*onkey_flag
    if ( wparam == 13 ) : gosub *make_new_tag
    return

// 新しい付箋の情報をDBに追加(INSERT)
*make_new_tag
    if ( strlen( new_memo ) > 0 ) {
        sql_q "INSERT INTO TAGS ( MEMO, X, Y ) VALUES ( '" + new_memo + "', 0, 0 )"
        gosub *make_all_tags        // すべての付箋を作り直す(ちょっとムダな処理)
    }
    return

// すべてのタグを作り直す
*make_all_tags
    sql_q "SELECT * FROM TAGS"
    repeat stat
        gsel 0 : pos ginfo_winx : mes sql_v"MEMO" )
        bgscr intsql_v"ID" ) ), ginfo_mesxginfo_mesy0intsql_v"X" ) ), intsql_v"Y" ) )
        oncmd gosub *move_flagWM_MOVE
        mes sql_v"MEMO" )
        sql_next
    loop
    return

// 付箋が移動したので、データベースを更新(UPDATE)する
*move_flag
    gsel ginfo_act
    sql_q "UPDATE TAGS SET X = " + ginfo_wx1 + " WHERE ID = " + ginfo_act
    sql_q "UPDATE TAGS SET Y = " + ginfo_wy1 + " WHERE ID = " + ginfo_act
    return

// 付箋がクリックされたので、何らかの操作を施す
*click_flag
    if ( iparam == 0 ) {
        // 左クリック → ドラッグ開始
        ReleaseCapture
        gsel ginfo_act
        sendmsg hwndWM_NCLBUTTONDOWNHTCAPTION0
    } else : if ( iparam == 3 ) {
        // 右クリック → 付箋の廃棄
        sql_q "DELETE FROM TAGS WHERE ID = " + ginfo_act
        gsel ginfo_act, -1      // とりあえず非表示にする
    }
    return

// アプリケーション終了時、データベースをクローズ
*exit_flag
    sql_close
    end

4 件のコメント:

sprocket さんのコメント...

応用早いですね!それに付箋というアイディアがいいですね。
検索条件にマッチする付箋を点滅させたりとか、何かの条件でグループ化した付箋を
カードみたいに集合させたりとか、いろいろアイディアが出てきますね。
そういうサンプル考えればよかったかもorz

eller さんのコメント...

昨日はスクリを組んだだけで時間がなくなってしまったので、今日ご挨拶に行こうと思っていたのですが……逆に来ていただく形になってしまいましたね(^-^;

というわけで、まずはSQLele公開おめでとうございます。hspdbは敷居が高かったのですが、SQLeleはとても利用しやすくて助かっています。「SQL 文を書くことのみに注力できる楽な仕様」なのも、とっつきやすくていい感じです。

DBはデータ数が可変な時にそのメリットを強く活かせると考えたので、付箋を選びました。確かに色々と工夫できそうな気もしますね。
サンプルとしてはあの起動時間を記録するものがもっとも簡単ですし、読みやすく優れていると思います。

sprocket さんのコメント...

> hspdbは敷居が高かった
そうですね...hspdb は使うのに結構手間がかかるけど、カラム名を使って結果セットへアクセスすることができないし、元のデータの型もわからないので、ちょっと普通には使いにくいです。

SQLele は SQLite のローカル DB しか扱えないけど、なるべくなるべく楽に書けるようにしながら、いかにして BLOB 入出力やバインド変数をサポートするか、とか結構トリッキーに作ったので、見た目のシンプルさのわりには長く使えるのではないかと思います。

SQL、趣味のソフト作りにも情報屋さんの仕事にも大いに使えるので、HSP ユーザーも食わず嫌いせず使ってみて欲しいですね。

eller さんのコメント...

> HSPユーザーも食わず嫌いせず使ってみて欲しい
ここが問題ですよね……。HSPとは全く次元の異なる知識が必要になりますし、初心者の方々はもちろん中級者の方々でもRDBやSQLの存在を知る人は少ないのではないかと考えています。ちょっと本格的な勉強をしたことのある人でないとダメかな、と。

ちょうど今HSP掲示板でDBを使えば簡単にできる案件がひとつ出ているのですが、SQLeleを使ったサンプルを出すのは解決にならないよなぁ……と思ったり。
wikiに専用ページでも作ってみてもいいかも知れませんね。時間ができたら試してみます。