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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1226
EmilioEmily.notesaveの挙動に付いて。2解決


EmilioEmily.

リンク

2010/12/26(Sun) 19:00:27|NO.36375

 重ねて失礼します。
 パターンエディタを作っています。
 現在メモリノートパッド機能を使って自身の環境を書き出す所まで実装出来たのです
が、動作に不安定な所があるので検証していました。

# 実行前にカラのファイル test.iniを用意する必要があります。


#const TRUE 1 #const FALSE 0 #const MAIN (0) #const DATA (1) #const FRAME (2) #const TARGET (3) #const DISPO (4) ;-------------------------------------------------------------------------------------------- #module #deffunc nop return #defcfunc box int sx ,int sy ,int ex ,int ey line ex,sy ,sx,sy : line ex,ey : line sx,ey : line sx,sy return 0 ; ----- #deffunc white color 0xf0,0xf0,0xf0 return #deffunc black color 0,0,0 return #global ;-------------------------------------------------------------------------------------------- ptnfile="" targetsx=0 : targetsy=0 ; ----- onexit goto *ediv ;-------------------------------------------------------------------------------------------- screen MAIN ,800,600 ,0 ,0,32,800,600 buffer DATA ,800,600 ,0 buffer FRAME ,800,600 ,0 gsel MAIN : cls 4 gsel DATA : cls 4 gsel FRAME : cls 4 white ;-------------------------------------------------------------------------------------------- gsel FRAME i=box(16-1,552-1 ,16+(32*12)+1,552+32+1) cx = 16 : cy = 552 ; ----- gsel MAIN objsize 32,32,0 pos 16+(32),552 : button gosub "load" ,*ptnload pos 16+(32*8),552 : chkbox "ptn表示" ,prnallptnF ;-------------------------------------------------------------------------------------------- gosub *sdiv ;-------------------------------------------------------------------------------------------- repeat gsel MAIN wait 2 getkey key_esc,27 : if (key_esc) : goto *ediv ; 終了。 ; マウス座標。 msx = mousex : msy = mousey ; ----- gsel MAIN redraw 0 pos 0,0 ; (超重要)ラストポイントが動くので、操作画面の座標をイニシャライズ。 gmode 0 : gcopy FRAME ,0,0,800,600 white : pos 512,560 : mes "X:"+msx +" Y:"+msy ; ----- ; パターンデータ表示/非表示。 if (prnallptnF != prnallptn_stat) { if (prnallptnF != FALSE) { gsel TARGET ,1 : prnallptn_stat = TRUE } if (prnallptnF == FALSE) { gsel TARGET,-1 : prnallptn_stat = FALSE } } gsel MAIN redraw 1 loop *ende end ;-------------------------------------------------------------------------------------------- *ediv sdim ptndata,1024 ; 変数内容を初期化しないと、以前の内容に追記される。 notesel ptndata noteadd "[test]" gsel TARGET ; TARGET面の座標を記録するので、絶対必要。 noteadd "TARGETx="+str(ginfo_wx1) noteadd "TARGETy="+str(ginfo_wy1) noteadd "pal=data" notesave "test.ini" ; 書き込めない? 事がある??? dialog "notesave:" +strsize noteunsel goto *ende ;-------------------------------------------------------------------------------------------- *sdiv notesel ptndata noteload "test.ini" noteget readline,0 if (readline == "[test]") { repeat notemax if (cnt==0) : continue ; 0行目は直前に読んでいるので、スキップ。 noteget readline ,cnt split readline,"=" ,_item ,_data if (_item=="TARGETx") : targetsx=int(_data) if (_item=="TARGETy") : targetsy=int(_data) if (_item=="pal") : nop loop screen TARGET ,32,32,0+screen_hide+screen_tool ,targetsx,targetsy,32,32 gsel TARGET : cls 4 } else { dialog "設定ファイルを読めませんでした。" } noteunsel return ;-------------------------------------------------------------------------------------------- *ptnload dialog "bmp" ,16 ,"パターンファイル" if (stat == TRUE) { ptnfile = refstr celload ptnfile ,DISPO ,0 ; BMPファイルを読む。 gsel TARGET : targetsx=ginfo_wx1 : targetsy=ginfo_wy1 gsel DISPO : x=ginfo_winx : y=ginfo_winy screen TARGET ,x,y,screen_normal+screen_hide+screen_tool ,targetsx,targetsy ,x,y gsel TARGET : gmode 0 : gcopy DISPO ,0,0,x,y } return

 何故か、最後のサブルーチン*ptnloadを通して終了すると、*edivの
notesave命令が機能しません。
 その直後のdialog命令ではちゃんとstrsizeバイト書き出している様に
見えるのですが、実際には動作していません。
 最初に通る*sdivは不安定動作もなく問題ないのですが、*edivに問題が。
*ptnloadを通らないとちゃんと動作するので、*ptnload内で一つずつ
コメントアウトしたりと確認取ってみたのですが、問題は変わらず。

 特定の手順で再現出来ると言う事は、何かポカミスしているのかな・・・とは
思うのですが、煮詰まってしまいました。 ご助力をお願いします。



この記事に返信する


info

リンク

2010/12/26(Sun) 22:06:16|NO.36384

dialog で ファイルのフルパスを取得する際に、クライアントディレクトリ が変わっているようです。
おそらく、notesave されたファイルは ロードした画像のあるディレクトリに保存されているはずです。

もし、実行ファイルの有るディレクトリに向かって保存したいのなら。

dir_exe または dir_cur で 実行ファイルの場所を変数名に代入して。

その場所へ保存すべきです。



;■ ;■実行する前に好きなの場所に保存してくださいな。 ;■ // iniファイルの名前を設定 #define txt_fname "クライアントディレクトリテスト.ini" // 実行ファイルのフルパスを取得 ;!!注意!! ; debug時は、dir_cur ; 実行ファイル化された後は dir_exe ; を実行ファイルのある場所とする。 #ifdef _debug txt_ExeFilePath = dir_cur #else txt_ExeFilePath = dir_exe #endif // settingファイルのフルパスを作成 txt_SettingFileFullPath = txt_ExeFilePath+"\\"+txt_fname // ファイルを開く dialog "bmp",16,"ビットマップ" if stat!1:end screen 0 picload refstr // ファイルを保存 notesel add add = "addadddaddddd" notesave txt_SettingFileFullPath // View txt = strf("保存したい場所 %s\n" , txt_ExeFilePath ) txt += strf("保存されてしまう場所 %s\n" , dir_cur ) dialog txt end



EmilioEmily.

リンク

2010/12/26(Sun) 22:39:23|NO.36385

>info様
 迅速なお答え有難うございます。

 え、まさか、ファイルダイアログでカレントが動く訳・・・とか
思ってしまいましたが、実際動いていますね。
 今まで使っていて気が付いていなかっただなんて、間抜けな限りです。

 どうもありがとうございました。



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