sample_02_memolite.hsp

sample\SQLele\sample_02_memolite.hsp » Plain Format

;============================================================
;                                                 2010/--/--
;	SQLele sample
;	memolite
;                               http://sprocket.babyblue.jp/
;============================================================
/*
 memolite (SQLele を使った簡単なアプリ)

 時刻つきメモ帳 (日記帳?) のサンプルです。登録時刻ごとにメモが作成されます。
 データは、memolite.db に保存されます。動作には、sqlite3.dll が必要です。

 使い方
・新しいメモの登録
 [新規作成] ボタンを押して、メモを書いて [登録/更新] ボタンを押す
・メモの閲覧
 メモの一覧からメモを選択し、[開く] ボタンを押す
・メモの更新
 メモを開いた状態でメモを編集し、[登録/更新] ボタンを押す
・メモの削除
 メモの一覧からメモを選択し、[削除] ボタンを押す
・メモの検索
 画面右上の欄に検索キーワードを入力して [検索] ボタンを押す

*/

#include "sqlele.hsp"

	;--------------------------------------------------
	; ステータス変数の初期化

	lst = -1	; 現在選択された過去メモリストのインデックス
	curid = -1	; 現在選択されたレコードの ID (新規作成時は -1)
	srch = ""	; 検索文字列

	srchbuf = "" ; 検索ボックス用バッファ
	sdim memobuf, 32768 ; メモ内容バッファ


	;--------------------------------------------------
	; 画面作成

	title "memolite"

	; 背景表示
	font "MS ゴシック", 13
	color 222,222,111 : boxf 440-2, 0, 640, 80
	color : pos 440, 0 : mes "メモを検索"

	; left gui-object
	pos 0, 20 : objsize 100, 20 : button "新規作成", *new
	pos 0, 40 : mesbox memobuf, 440-4, 400, 1 : idmes = stat
	pos 170, 440 : objsize 100, 20 : button "登録/更新", *update

	; right-top
	pos 440, 20 : objsize 200-4, 20 : input srchbuf : idsrch = stat
	pos 500, 45 : objsize 70, 20 : button "検索", *search
	pos 580, 45 : objsize 50, 20 : button "リセット", *reset

	; right-btm
	pos 440, 100 : objsize 200-4, 300 : listbox lst, 0, memobuf : idlst = stat
	pos 500, 400 : objsize 70, 20 : button "開く", *open
	pos 580, 400 : objsize 50, 20 : button "削除", *dels

	objsel idmes


	;--------------------------------------------------
	; DB オープン

	sql_open "memolite.db"

	; TMemo テーブルがなければ新たに作成
	sql_q "CREATE TABLE IF NOT EXISTS TMemo (ID INTEGER PRIMARY KEY, Date, Memo, Upd)"

	; TMemo テーブルのフィールド
	; ID    自動連番ID
	; Date  メモの登録日
	; Memo  メモ内容
	; Upd   メモの最終更新日


	;--------------------------------------------------
	; 画面更新

	gosub *editor_renew_sub
	gosub *list_renew_sub
	stop



;============================================================
; サブルーチン

; エディタ領域の更新
*editor_renew_sub

	; ID = curid のレコードを読み出し
	sql_q "SELECT * FROM TMemo WHERE ID=" + curid

	if stat {
		; 現在のレコード ID が有効な場合 メモ内容を取り出す
		memobuf = sql_v("Memo")
		objprm idmes, memobuf

		; 画面更新
		color 222,222,222 : boxf 0, 0, 440-2, 480
		color : pos 0, 0 : mes sql_v("Date") + " のメモを編集 (更新 " + sql_v("Upd") + ")"

	} else {
		; 現在のレコード ID が無効の場合 新規作成
		memobuf = ""
		objprm idmes, memobuf

		; 画面更新
		color 222,222,222 : boxf 0, 0, 440-2, 480
		color : pos 0, 0 : mes "新規作成"
	}

	return

; リスト領域の更新
*list_renew_sub

	if srch ! "" {
		; 画面更新
		color 111,222,222 : boxf 440-2, 80, 640, 480
		color : pos 440, 80 : mes "'" + srch + "' 検索結果"

		; 検索文字列がある場合
		sql_q "SELECT ID, Date, substr(replace(Memo,'\n',''),0,100) as subMemo FROM TMemo WHERE Date like '%"+sqesc(srch)+"%' OR Memo like '%"+sqesc(srch)+"%' ORDER BY ID DESC"

	} else {
		; 画面更新
		color 111,222,222 : boxf 440-2, 80, 640, 480
		color : pos 440, 80 : mes "メモの一覧"

		; 全件抽出
		sql_q "SELECT ID, Date, substr(replace(Memo,'\n',''),0,100) as subMemo FROM TMemo ORDER BY ID DESC"
	}

	count = stat
	astr = ""
	lst = -1
	repeat count
		list_ids(cnt) = sql_i("ID")			; リストボックスのインデックスと レコード ID との変換テーブル
		if curid = sql_i("ID") : lst = cnt	; 現在のレコードがあれば選択状態にする

		astr += sql_v("Date") + "  " + sql_v("subMemo") + "\n"
		sql_next
	loop

	objprm idlst, astr	; 内容更新
	objprm idlst, lst	; 選択インデックス更新

	return



;============================================================
; ボタンを押した時の動作

; 新規作成ボタン
*new
	; 新規作成モードへ (現在の選択 ID を無効値に設定)
	curid = -1
	gosub *editor_renew_sub
	objsel idmes
	stop

; 開くボタン
*open
	; メモ内容の変更確認
	yes = 1
	sql_q "SELECT Memo FROM TMemo WHERE ID=" + curid
	if stat {
		if (sql_v("Memo") ! memobuf) : yes = 0
	} else {
		if memobuf ! "" : yes = 0
	}
	if yes = 0 {
		dialog "内容は変更されています。保存せずにメモを開きますか?", 2
		if stat = 6 : yes = 1
	}

	; 新しい curid を設定してエディタ部を更新
	if yes {
		curid = list_ids(lst)
		gosub *editor_renew_sub
	}
	stop

; 登録/更新ボタン
*update
	dialog "内容を登録/更新します。", 2
	if stat = 6 {
		; レコードの挿入 or 更新
		if curid >= 0 {
			; 現在の ID が有効な場合 : 既存レコード更新
			sql_q "UPDATE TMemo SET Memo=" + prm_text(memobuf) + ", Upd=datetime('now','localtime') WHERE ID="+curid
		} else {
			; 現在の ID が無効な場合 : 新規レコード 挿入
			sql_q "INSERT INTO TMemo (Date, Memo) VALUES (datetime('now','localtime'), " + prm_text(memobuf) + ")"

			; 挿入したレコードの ID を調べる
			sql_q "SELECT last_insert_rowid() AS ID"
			curid = sql_i("ID")
		}
		gosub *list_renew_sub
		gosub *editor_renew_sub
	}
	stop

; 検索ボタン
*search
	; srch を設定してリストを再表示させる
	srch = srchbuf
	gosub *list_renew_sub
	stop

; 検索リセットボタン
*reset
	; srch をクリアしてリストを再表示
	srch = ""
	gosub *list_renew_sub
	stop

; 削除ボタン
*dels
	if lst >= 0 {
		sql_q "SELECT * FROM TMemo WHERE ID=" + list_ids(lst)
		dialog sql_v("Date") + " のメモを削除しますか?", 2

		if stat = 6 {
			; 削除対象が現在のレコードの場合 現在のレコード ID を無効化
			if list_ids(lst) = curid : curid = -1

			; レコード削除
			sql_q "DELETE FROM TMemo WHERE ID=" + list_ids(lst)

			gosub *list_renew_sub
		}
	}
	stop