//xmemo2 feat,sqlite 0.33 //memoListはメモのリストを提供します。 //memoTextはメモのテキストデータ自体を格納するテーブルです。 !母艦設計=「母艦の可視はオフ」 !APPタイトル=「きゅーめも」 !APP_VER=0.33 INIファイル=「qmemo_settings.ini」 DBハンドルとは整数 メモIDリストとは配列 メモ日付リストとは配列 編集IDとは整数 編集タイトルとは文字列 選択DBとは文字列=「qmemo_db1.qmd」 編集フラグとは整数=0 新規フラグとは整数=0 変更フラグとは整数=1 降順フラグとは整数=0 日付とは文字列=「」 選択指定とは文字列=「」 順序指定とは文字列=「」 /*以下 UI定義*/ ステータスとはステータスバー ステータスの可視はオフ 更新タイマーとはタイマー その値は500 機能タブとはタブページ 機能タブについて レイアウトは「全体」 「メモ」をタブ追加 「リスト」をタブ追加 機能タブの表示タブは0 メモエリアとはメモ メモエリアについて 親部品は機能タブ レイアウトは「全体」 文字サイズは10 文字書体は「MS Pゴシック」 機能タブの表示タブは1 メモリストとはリスト メモリストについて 親部品は機能タブ レイアウトは「全体」 母艦について Wは370 Hは260 タイトルはAPPタイトル 背景色はウィンドウ背景色 終了可能はオフ リストステータスとはパネル リストステータスについて 親部品は機能タブ レイアウトは「上」 Hは22 スタイルは「枠なし」 可視はオフ ライク解除ボタンとは画像ボタン ライク解除ボタンについて 親部品はリストステータス レイアウトは「右」 Wは25 フラットはオン 文字書体は「webdings|9|太字」 ヒントは「絞込みを解除 (Ctrl+X)」 テキストは「r」 機能タブの表示タブは0 「,mf,ファイル(&F) -,f1,新規(&N),F8,,新規作成 -,f2,クリップボードから取り込み(&I),F7,,新規クリップ -,fb_1,-,,, -,f3,削除(&D),F12,,データ削除 -,fb_2,-,,, -,fd1,データベース変更(&O)...,,,データベース切り替え -,fb_3,-,,, -,fp1,メモを簡易印刷(&P)...,Ctrl+P,,メモエリアのテキストを簡易文字列印刷 -,fp2,リストを簡易印刷(&L)...,Ctrl+L,,メモリストのアイテムを簡易文字列印刷 -,fb_4,-,,, -,fx,閉じる(&X),ESC,,終わる ,me,編集(&E) -,eu,戻す(&Z),Ctrl+Z,,メモエリアをUNDO -,er,やり直す(&Y),Ctrl+Y,,メモエリアをREDO -,eb_1,-,,, -,ea,すべて選択(&A),Ctrl+A,,エリア全選択 -,eb_2,-,,, -,et,タブ切り替え(&T),Ctrl+SPACE,,タブ切り替え ,mv,表示(&V) -,vre,リストの更新(&R),F5,,DBハンドルのリスト取得 -,vb_0,-,,, -,vs1,リストを作成日時順に並び替え(&S),Ctrl+D,,日時ソート -,vs2,リストをタイトル順に並び替え(&T),Ctrl+T,,タイトルソート -,vb_1,-,,, -,vf1,データベースを検索(&F)...,Ctrl+F,,DBハンドルのデータ検索 -,vx1,検索表示を解除(&U),Ctrl+X,,選択指定解除 -,vb_2,-,,, -,v1,ステータスバー(&S),,,ステータス表示切替 ,mh,ヘルプ(&H) -,hq,SQL文でSQLiteへ問い合わせ(&Q)...,,,SQL入力 -,hb_1,-,,, -,h1,{APPタイトル}について(&A),,,アバウト」をメニュー一括作成 /*以上 UI定義*/ 母艦の閉じた時は 終了処理 終わる メモエリアの変更した時は 機能タブの表示タブは0 編集フラグ=1 変更フラグ=1 更新タイマーの時満ちた時は もし変更フラグが1ならば 変更フラグ=0 メモエリアでタイトル更新 メモリストのダブルクリックした時は (メモリストの値)のデータ読み込み メモリストのキー離した時は もしメモリストの押された仮想キーが13ならば、 (メモリストの値)のデータ読み込み ライク解除ボタンのクリックした時は 選択指定解除 //以下 SQL関連------------------------------------------------ ●DB取得(Fを) ステータス=「データベースを検査中です」 Hとは整数=FをSQLITE開く それ=Hで「 BEGIN TRANSACTION 'starter' ON CONFLICT ROLLBACK; SELECT count(*) FROM sqlite_master WHERE type='table' AND name='memoList'; END TRANSACTION 'starter'; 」をSQLITE実行 もしそれ[1]が0ならば ステータス=「データベースを設定中です」 Hで「 BEGIN TRANSACTION ON CONFLICT ROLLBACK; CREATE TABLE memoList (ID INTEGER PRIMARY KEY,date,title,modified_on); CREATE TABLE memoText (ID INTEGER PRIMARY KEY,memo); COMMIT TRANSACTION; 」をSQLITE実行 ステータス=「データベースを設定しました」 違えば ステータス=「データベースを認識しました」 ここまで Hを戻す ●DB解放(Hの) HのSQLITE閉じる //リスト関連命令 ●日付リスト取得(Hの) SQL_Rとは文字列=Hで「 SELECT date FROM memoList {選択指定} {順序指定}; 」をSQLITE実行 Lとは配列=SQL_Rを表CSV変換 Lの0を配列削除 Lを戻す ●IDリスト取得(Hの) SQL_Rとは文字列=Hで「 SELECT ID FROM memoList {選択指定} {順序指定}; 」をSQLITE実行 Lとは配列=SQL_Rを表CSV変換 Lの0を配列削除 Lを戻す ●タイトルリスト取得(Hの) SQL_Rとは文字列=Hで「 SELECT title FROM memoList {選択指定} {順序指定}; 」をSQLITE実行 Lとは配列=SQL_Rを表CSV変換 Lの0を配列削除 Lを反復 L[回数-1]=それの記号改行無し還元 Lを戻す ●リスト取得(Hの) ステータス=「リストを取得しています」 メモIDリスト=HのIDリスト取得 メモ日付リスト=Hの日付リスト取得 メモリストのアイテム=Hのタイトルリスト取得 もし選択指定が空ならば リストステータスの可視はオフ vf1→チェックはオフ 違えば リストステータスの可視はオン vf1→チェックはオン 機能タブの表示タブは1 ステータス=「リストを作成しました。全{メモ数}件」 //リスト関連命令終わり ●メモ数 SQL_Rとは文字列=Hで「 SELECT count(*) FROM memoList {選択指定} {順序指定}; 」をSQLITE実行 SQL_R[1]を戻す //メモ操作関連命令 ●メモ追加({参照渡し}Titleの{参照渡し}TextをHへ) ステータス=「メモを追加しています」 Title=Titleの記号置換 Text=Textの記号置換 SQL_Rとは文字列=Hで「 BEGIN TRANSACTION ON CONFLICT ROLLBACK; INSERT INTO memoList VALUES(NULL,'{日付}','{Title}','{今日}-{今}'); INSERT INTO memoText VALUES(NULL,'{Text}'); COMMIT TRANSACTION; 」をSQLITE実行 DBハンドルのリスト取得 ●メモ修正(HのIDを{参照渡し}Titleで{参照渡し}Textに) ステータス=「メモを修正しています」 Title=Titleの記号置換 Text=Textの記号置換 SQL_Rとは文字列=Hで「 BEGIN TRANSACTION ON CONFLICT ROLLBACK; UPDATE memoList SET title='{Title}',modified_on='{今日}-{今}' WHERE ID='{ID}'; UPDATE memoText SET memo='{Text}' WHERE ID='{ID}'; COMMIT TRANSACTION; 」をSQLITE実行 DBハンドルのリスト取得 ●メモ削除(HのIDを) ステータス=「メモを削除しています」 SQL_Rとは文字列=Hで「 BEGIN TRANSACTION ON CONFLICT ROLLBACK; DELETE FROM memoList WHERE ID='{ID}'; DELETE FROM memoText WHERE ID='{ID}'; COMMIT TRANSACTION; 」をSQLITE実行 DBハンドルのリスト取得 ●メモ取得(HのIDを) ステータス=「メモを呼び出しています」 SQL_Rとは文字列=Hで「 BEGIN TRANSACTION; SELECT memo FROM memoText WHERE ID='{ID}'; END TRANSACTION; 」をSQLITE実行 SQL_Rの「{\n}」まで切り取る SQL_R=SQL_Rの「"」を「」に置換 SQL_R=SQL_Rの記号還元 SQL_Rを戻す //メモ操作関連命令終わり //以上 SQL関連---------------------------------------------------- //文字列関連 ●記号置換(Sの) S=SをHTMLエンティティ変換 S=Sの「,」を「,」に置換 S=Sの「'」を「"e;」に置換 S=Sの「"」を「&dquote;」に置換 S=Sの「{\t}」を「&tab;」に置換 S=Sの「{\n}」を「&br;」に置換 Sを戻す ●記号還元(Sの) S=Sの「&br;」を「{\n}」に置換 S=Sの「&tab;」を「{\t}」に置換 S=Sの「"e;」を「'」に置換 S=Sの「,」を「,」に置換 S=Sの「&dquote;」を「"」に置換 S=SをHTMLエンティティ復号 Sを戻す ●記号改行無し還元(Sの) S=Sの「&br;」を「」に置換 S=Sの「&tab;」を「」に置換 S=Sの「"e;」を「'」に置換 S=Sの「,」を「,」に置換 S=Sの「&dquote;」を「"」に置換 S=SをHTMLエンティティ復号 Sを戻す //以上 文字列関連 //ユーザーフロントエンド関連 ●タイトル更新(Tで) 作業エリアとは文字列=T 作業エリア=作業エリアの「{\n}」まで切り取る もし作業エリアが空ならば 作業エリアは日付 編集タイトルは作業エリア もし((新規フラグ==0)&&(編集フラグ==1))ならば 母艦は「"{作業エリア}..."* - {APPタイトル}」 違えばもし((新規フラグ==0)&&(編集フラグ==0))ならば 母艦は「"{作業エリア}..." - {APPタイトル}」 違えばもし((新規フラグ==1)&&(編集フラグ==1))ならば 母艦は「新規"{作業エリア}..."* - {APPタイトル}」 違えば 母艦は「新規 - {APPタイトル}」 //ステータス=「ID:{メモID} - {今日}-{今}」 ●新規作成 もし((メモエリア!=空)&&(編集フラグ==1))ならば もし編集IDが空ならば 編集タイトルのメモエリアをDBハンドルへメモ追加 違えば DBハンドルの編集IDを編集タイトルでメモエリアにメモ修正 機能タブの表示タブは0 メモエリア=「」 編集ID=空 編集フラグ=0 新規フラグ=1 日付=「{今日}-{今}」 ステータス=「新しいメモを開きました」 ●新規クリップ 新規作成 メモエリア=クリップボード取得 ステータス=「クリップボードを新しいメモに貼り付けました」 ●データ読み込み(Nの) もし(N>-1)ならば もし(メモIDリスト[N]!=空)ならば 新規作成 編集ID=メモIDリスト[N] 日付=メモ日付リスト[N] メモエリア=DBハンドルの編集IDをメモ取得 編集フラグ=0 新規フラグ=0 ステータス=「ID:{編集ID} のメモを読み込みました」 違えば 機能タブの表示タブは0 ステータス=「メモがありません」 ●データ削除 ダイアログタイトル=「{編集タイトル}の削除」 もし編集IDが空ならば 「現在編集中の新しい記事{~}" {編集タイトル} "を削除します。{~}よろしいですか?」と二択 違えば 「現在編集中のメモID:{編集ID}番の記事{~}”{編集タイトル}”を削除します。{~}よろしいですか?」と二択 もし((それ=はい)&&(新規フラグ=0))ならば DBハンドルの編集IDをメモ削除 メモエリア=空 新規作成 違えばもし(それ=はい)ならば メモエリア=空 新規作成 ダイアログタイトル=空 ●エリア全選択 機能タブの表示タブは0 メモエリアを全選択 ●タブ切り替え 機能タブの表示タブはNOT(機能タブの表示タブ) ●データベース切り替え "きゅーめもデータベース(*.qmd)|*.qmd;|SQLiteデータベース(*.db)|*.db;|全てのファイル(*.*)|*;"のファイル選択 もしそれが空でなければ 選択DB=それ 新規作成 DBハンドルのDB解放 DBハンドル=選択DBをDB取得 DBハンドルのリスト取得 ●終了処理 新規作成 DBハンドルのDB解放 母艦を元通り 母艦パスに作業フォルダ変更 「{作業フォルダ}{INIファイル}」のINI開いてテキストハンドルに代入。 テキストハンドルで「ヘッダ」の「このINIを利用するプログラム」にAPPタイトルをINI書く テキストハンドルで「ウィンドウ」の「X」に母艦のXをINI書く テキストハンドルで「ウィンドウ」の「Y」に母艦のYをINI書く テキストハンドルで「ウィンドウ」の「W」に母艦のクライアントWをINI書く テキストハンドルで「ウィンドウ」の「H」に母艦のクライアントHをINI書く テキストハンドルで「ファイル」の「場所」に選択DBをINI書く テキストハンドルのINI閉じる 母艦の終了可能はオン ●開始処理 INIファイルが存在 もし、それが1ならば エラー監視 「{作業フォルダ}{INIファイル}」のINI開いてテキストハンドルに代入 テキストハンドルで「ウィンドウ」の「X」をINI読んで母艦のXに代入 テキストハンドルで「ウィンドウ」の「Y」をINI読んで母艦のYに代入 テキストハンドルで「ウィンドウ」の「W」をINI読んで母艦のクライアントWに代入 テキストハンドルで「ウィンドウ」の「H」をINI読んで母艦のクライアントHに代入 テキストハンドルで「ファイル」の「場所」をINI読んで選択DBに代入 テキストハンドルのINI閉じる エラーならば 「設定ファイルを正常に読み込めませんでした。」と言う 違えば 空を「{INIファイル}」に保存 母艦の可視はオン DBハンドル=選択DBをDB取得 DBハンドルのリスト取得 更新タイマーの開始 新規作成 機能タブの表示タブは0 メモエリアに注目 ●アバウト ダイアログタイトル=「{APPタイトル}について」 「{APPタイトル} (xmemo2 ver {APP_VER}){\n} 現在のデータベース:{選択DBのファイル名抽出}{\t} {メモ数}件のメモを保持しています SQLiteを利用したメモ帳です。 保存操作の必要がありません。 作成したメモはリストタブに一覧表示されます。 (c)2008 canot」という ダイアログタイトル=空 //以上 ユーザーフロントエンド関連 //追加機能 ●SQL入力 ステータス=「SQL文で直接データベースに問い合わせることが出来ます。」 ダイアログタイトル=「{APPタイトル} - クエリ編集」 SQL_Rとは文字列=Hで「SELECT sql FROM sqlite_master WHERE type='table';」をSQLITE実行 SQL_R=SQL_Rの「sql{\n}」を空に置換 SQL_R=SQL_Rの「"CREATE TABLE 」を空に置換 SQL_R=SQL_Rの「"{\n}」を「{\n}」に置換 SQL_R=「/*SQLite2.1 現在データベース内に存在するテーブル: {SQL_R} 決定すると記入内容が消え、結果表示に変わるので 長い文の場合、決定前に保存することをオススメします */ select * from memoList;{~}」をメモ記入 もしSQL_Rが空でなければ ステータス=「SQLを実行中...」 エラー監視 SQL_R=DBハンドルでSQL_RをSQLITE実行 ステータス=「SQLを実行しました」 エラーならば BEEP エラーメッセージを反復 もし((対象で「SQLITE実行」を文字検索)!=0)ならば SQL_R=「ERROR:」 & 対象の「。」から「{\n}」まで範囲切り取る ダイアログタイトル=「{APPタイトル} - クエリ実行結果」 SQL_Rとメモ記入 DBハンドルのリスト取得 違えば ステータス=「SQLの入力をキャンセルしました」 ダイアログタイトル=空 ●データ検索(Hの) 検索テキストとは文字列 ダイアログタイトル=「{APPタイトル} - だいたい全文検索」 検索テキスト=「メモデータをアバウトに全文検索します。{\n}以下に検索したい語句を記入してください。{\n}大文字小文字は区別されません。」で尋ねる もし検索テキストが空でなければ ステータス=「リストを取得しています」 実際検索文とは文字列=検索テキストの記号置換 SQL_Rとは文字列=Hで「 SELECT ID FROM memoText where memo like '%{実際検索文}%'; 」をSQLITE実行 該当カウントとは整数=0 SQL_R2とは文字列 SQL_Rを反復 もしSQL_R[回数]が""でなければ もしSQL_R2が空でなければ SQL_R2=「{SQL_R2} OR 」 SQL_R2=「{SQL_R2}ID={SQL_R[回数]}」 該当カウント=該当カウント+1 もしSQL_R2が空でなければ 選択指定=「where {SQL_R2} GROUP BY date,title,ID」 リストステータス=「"{検索テキスト}"で絞り込み中 全{該当カウント}件」 違えば 選択指定=空 BEEP 「"{検索テキスト}"{\n}を含むメモは見つかりませんでした」という DBハンドルのリスト取得 ステータス=「"{検索テキスト}"を含むメモ:{該当カウント}件」 違えば ステータス=「データ検索をキャンセルしました」 ダイアログタイトル=空 ●日時ソート vs1→チェックはオン vs2→チェックはオフ もし降順フラグがオンならば 順序指定=「ORDER BY date ASC」 降順フラグ=オフ 違えば 順序指定=「ORDER BY date DESC」 降順フラグ=オン DBハンドルのリスト取得 ステータス=「作成日時順でソートしました。」 ●タイトルソート vs1→チェックはオフ vs2→チェックはオン もし降順フラグがオンならば 順序指定=「ORDER BY title ASC」 降順フラグ=オフ 違えば 順序指定=「ORDER BY title DESC」 降順フラグ=オン DBハンドルのリスト取得 ステータス=「タイトル順でソートしました。」 ●選択指定解除 選択指定=空 DBハンドルのリスト取得 ●ステータス表示切替 ステータスの可視=NOT(ステータスの可視) v1→チェックは(ステータスの可視) ステータスの可視を戻す 開始処理