sprocketさんのサイトで、SQLite3を簡単に扱えるモジュールSQLeleが公開されました。データの保存・読み込みに費やしていた労力を大幅に削減することができるので、特にツール開発者の方々には重宝すると思います。
……ということで、初SQLele。1行だけの簡単な付箋を作成します。プライマリ・キーが1から始まることを利用し、ウィンドウIDを兼ねさせています。
CREATE TABLE実行時、主キー以外においてデータ型の宣言をしないように変更しました。(2007/09/19)
参考
- 日経ソフトウェア2007年10月号特集「データベース徹底入門」
- タイトルバー以外をドラッグして移動
// かんたん付箋ツール 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_mesx, 0 : 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 int( sql_v( "ID" ) ), ginfo_mesx, ginfo_mesy, 0, int( sql_v( "X" ) ), int( sql_v( "Y" ) )
oncmd gosub *move_flag, WM_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 hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
} else : if ( iparam == 3 ) {
// 右クリック → 付箋の廃棄
sql_q "DELETE FROM TAGS WHERE ID = " + ginfo_act
gsel ginfo_act, -1 // とりあえず非表示にする
}
return
// アプリケーション終了時、データベースをクローズ
*exit_flag
sql_close
end
4 件のコメント:
応用早いですね!それに付箋というアイディアがいいですね。
検索条件にマッチする付箋を点滅させたりとか、何かの条件でグループ化した付箋を
カードみたいに集合させたりとか、いろいろアイディアが出てきますね。
そういうサンプル考えればよかったかもorz
昨日はスクリを組んだだけで時間がなくなってしまったので、今日ご挨拶に行こうと思っていたのですが……逆に来ていただく形になってしまいましたね(^-^;
というわけで、まずはSQLele公開おめでとうございます。hspdbは敷居が高かったのですが、SQLeleはとても利用しやすくて助かっています。「SQL 文を書くことのみに注力できる楽な仕様」なのも、とっつきやすくていい感じです。
DBはデータ数が可変な時にそのメリットを強く活かせると考えたので、付箋を選びました。確かに色々と工夫できそうな気もしますね。
サンプルとしてはあの起動時間を記録するものがもっとも簡単ですし、読みやすく優れていると思います。
> hspdbは敷居が高かった
そうですね...hspdb は使うのに結構手間がかかるけど、カラム名を使って結果セットへアクセスすることができないし、元のデータの型もわからないので、ちょっと普通には使いにくいです。
SQLele は SQLite のローカル DB しか扱えないけど、なるべくなるべく楽に書けるようにしながら、いかにして BLOB 入出力やバインド変数をサポートするか、とか結構トリッキーに作ったので、見た目のシンプルさのわりには長く使えるのではないかと思います。
SQL、趣味のソフト作りにも情報屋さんの仕事にも大いに使えるので、HSP ユーザーも食わず嫌いせず使ってみて欲しいですね。
> HSPユーザーも食わず嫌いせず使ってみて欲しい
ここが問題ですよね……。HSPとは全く次元の異なる知識が必要になりますし、初心者の方々はもちろん中級者の方々でもRDBやSQLの存在を知る人は少ないのではないかと考えています。ちょっと本格的な勉強をしたことのある人でないとダメかな、と。
ちょうど今HSP掲示板でDBを使えば簡単にできる案件がひとつ出ているのですが、SQLeleを使ったサンプルを出すのは解決にならないよなぁ……と思ったり。
wikiに専用ページでも作ってみてもいいかも知れませんね。時間ができたら試してみます。
コメントを投稿