HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0407
umetaro&umekosample_02_memolite.hspのエラー6解決


umetaro&umeko

リンク

2015/4/7(Tue) 17:11:23|NO.68414

サンプルスクリプトの
「sample_02_memolite.hsp」について質問です。
起動して、何も選択せずに「開く」ボタンをおすと
<配列の要素が無効です。>
とエラーが出てきてしまいました。
どうすれば解決できますか?



この記事に返信する


kanahiron

リンク

2015/4/7(Tue) 18:09:43|NO.68415

新規作成ボタンを押したあと、登録更新ボタンを押すと一覧に反映されます
一覧から開きたいものを選択した後に、開くボタンを押します

エラーが出ないようにするには、174行目に以下を追加します

; メモ内容の変更確認 if lst < 0{ dialog "開くメモが選択れていません" stop }



umetaro&umeko

リンク

2015/4/7(Tue) 20:20:55|NO.68420

ありがとうございます!!
でも今度は少し遊びでこのスクリプトを改造していたのですが(ソフトとして使うかも?)
なにも表示されなくなってしまいました何が問題なんでしょうか?

#include "sqlele.hsp"


#include "mod_menu.as";メニューを使用するために必要
#define CMD_NEW 1
#define CMD_HIRAKU 2
#define CMD_UWAGAKi 3
#define CMD_NAMESAVE 4
#define CMD_SEARCH 5
oncmd gosub *OnCommand, WM_COMMAND
//サブメニューの設定(追加可)
newmenu diary,1
addmenu diary, "新規作成(&N)", CMD_NEW
addmenu diary, "txtファイルを開く(&O)", CMD_HIRAKU
addmenu diary, "上書き保存(&S)", CMD_UWAGAKI
addmenu diary, "内容をtxtファイルとして保存(&A)", CMD_NAMESAVE
addmenu diary, "検索(&W)...", CMD_SEARCH
//トップメニュー(追加可)
newmenu dmenu,0
addmenu dmenu, "ファイル(&F)", diarymenu, 0x10
stop
;-------------------------------------------------------------------------------;
;OnCommandラベル。メニューはどういう働きをするのかの設定 ;
;-------------------------------------------------------------------------------;
*OnCommand
cmd=wparam & 0xFFFF
if cmd=CMD_NEW {
goto *new
}
if cmd=CMD_HIRAKU {
goto *txtopen
}
if cmd=CMD_NAMESAVE {
goto *txtsave
}
if cmd=CMD_SEARCH {
goto *search
}

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

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

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







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

title "windows DiaryEX"

; 背景表示
font "MS ゴシック", 13
color 222,222,111 : boxf 440-2, 0, 640, 80

; left gui-object

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



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

; メモ内容の変更確認

if lst < 0{
dialog "開くメモが選択れていません"
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

;/////////////////////////////////////////////////////////////////////////////////
;ここから下txt関係のスクリプト
*txtsave
dialog "txt",17,"txtファイル"
if stat==0:stop
fairuname=refstr
fairuName=getpath(fairuName,1)+".txt" ;拡張子付け直し
notesel tomo
notesave fairuname
stop
*txtopen
dialog "txt",16,"txtファイル"
if stat==0:stop
if getpath(refstr,2+16)!=".txt"{ ;読み込もうとしたファイルがテキストファイルでなければ
dialog "txtファイル以外は開けません。\ntxtファイルを選択してください",1,"読み込み"
stop
}
fairuName=refstr ;ファイル名を取得
notesel tomo ;対象指定
noteload fairuname ;ロード
objprm 0,tomo ;内容更新
stop
コメントは・・・気にしないでください^-^



umetaro&umeko

リンク

2015/4/7(Tue) 20:37:10|NO.68421

ごめんなさいスクリプト見ずらかったですね
どうやってpre?にするのですか?



umetaro&umeko

リンク

2015/4/7(Tue) 21:13:01|NO.68423

テスト


dsfjhkdfaslkjhadsfkfadsjhdfakljdfashkdlasfjhsadkl;



umetaro&umeko

リンク

2015/4/7(Tue) 21:14:35|NO.68424

あ、なるほどじゃあ見やすいスクリプト

#include "sqlele.hsp" #include "mod_menu.as";メニューを使用するために必要 #define CMD_NEW 1 #define CMD_HIRAKU 2 #define CMD_UWAGAKi 3 #define CMD_NAMESAVE 4 #define CMD_SEARCH 5 oncmd gosub *OnCommand, WM_COMMAND //サブメニューの設定(追加可) newmenu diary,1 addmenu diary, "新規作成(&N)", CMD_NEW addmenu diary, "txtファイルを開く(&O)", CMD_HIRAKU addmenu diary, "上書き保存(&S)", CMD_UWAGAKI addmenu diary, "内容をtxtファイルとして保存(&A)", CMD_NAMESAVE addmenu diary, "検索(&W)...", CMD_SEARCH //トップメニュー(追加可) newmenu dmenu,0 addmenu dmenu, "ファイル(&F)", diarymenu, 0x10 stop ;-------------------------------------------------------------------------------; ;OnCommandラベル。メニューはどういう働きをするのかの設定 ; ;-------------------------------------------------------------------------------; *OnCommand cmd=wparam & 0xFFFF if cmd=CMD_NEW { goto *new } if cmd=CMD_HIRAKU { goto *txtopen } if cmd=CMD_NAMESAVE { goto *txtsave } if cmd=CMD_SEARCH { goto *search } ;-------------------------------------------------- ; ステータス変数の初期化 lst = -1 ; 現在選択された過去メモリストのインデックス curid = -1 ; 現在選択されたレコードの ID (新規作成時は -1) srch = "" ; 検索文字列 srchbuf = "" ; 検索ボックス用バッファ sdim memobuf, 32768 ; メモ内容バッファ tomo="" ;-------------------------------------------------- ; 画面作成 title "windows DiaryEX" ; 背景表示 font "MS ゴシック", 13 color 222,222,111 : boxf 440-2, 0, 640, 80 ; left gui-object 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 ;============================================================ ; サブルーチン ; メモ内容の変更確認 if lst < 0{ dialog "開くメモが選択れていません" 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 ;///////////////////////////////////////////////////////////////////////////////// ;ここから下txt関係のスクリプト *txtsave dialog "txt",17,"txtファイル" if stat==0:stop fairuname=refstr fairuName=getpath(fairuName,1)+".txt" ;拡張子付け直し notesel tomo notesave fairuname stop *txtopen dialog "txt",16,"txtファイル" if stat==0:stop if getpath(refstr,2+16)!=".txt"{ ;読み込もうとしたファイルがテキストファイルでなければ dialog "txtファイル以外は開けません。\ntxtファイルを選択してください",1,"読み込み" stop } fairuName=refstr ;ファイル名を取得 notesel tomo ;対象指定 noteload fairuname ;ロード objprm 0,tomo ;内容更新 stop



umetaro&umeko

リンク

2015/4/8(Wed) 17:20:13|NO.68448

ありがとうございました



ONION software Copyright 1997-2021(c) All rights reserved.