ページ 24

まだ

Posted: 2006年3月08日(水) 18:23
by 雷電
まだおかしい点があったので質問します。
またも、アクセス違反が起きてしまいました。
なぜか原因を探しています。
皆さんも手伝ってくれませんか?

Re: まだ

Posted: 2006年3月08日(水) 19:09
by 7
> またも、アクセス違反が起きてしまいました。
> なぜか原因を探しています。
提出されたコードだけでは面倒でデバッグする意欲が湧きません...。
プロジェクトファイルごと、例えばYahoo!ブリーフケースにて公開するなどしてくれれば別ですが。

コードを見た所、もっと簡単にできますね。
プロシージャごとに"Dim hEdit As Long"が宣言されてEditBox1のハンドルが格納されていますが、これはグローバル変数にhEditを宣言してMainWnd_Create()関数実行時にEditBox1のハンドルを格納してしまえば楽です。

コード: 全て選択

Dim hEdit As Long'もしくはHWND
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	hEdit=GetDlgItem(hMainWnd,EditBox1)
あと、「新規作成」の動作ですが、ユーザーがファイル1を弄っていてファイル2を作る為に「新規作成」を選び「上書き保存」を選択したらファイル1に上書きされてしまいます。
グローバル変数file_pathも初期化する必要があります。

コード: 全て選択

'hEditはグローバル変数
Sub MainWnd_IDM_NEW_MenuClick()
	'hEditとファイルパスの初期化
	file_path=""
	SetWindowText(hEdit,"")
End Sub
あと失礼ですが、コードがすごいツギハギですね...。
こういうファイルはMainWnd.sbp一つに書くのではなく、もっとバラした方が後々楽だと思いますよ。
ツールバーに関する関数を集めたファイル、ToolBar.abp、
ステータスバーに関する関数を集めたファイル、StatusBar.abp、
ファイルの読み書きに関する関数を集めたファイル、FileEvent.abp、
メニューに関する関数を集めたファイル、MenuEvent.abp、などなど...。

やはり

Posted: 2006年3月08日(水) 20:57
by 雷電
何か問題があるのに気がつきました。
ツールバーのところでひっかかるのがわかりました。
どうすればいいのか検討中です。
何かいい考えありませんか?
私も、検討しますが。

追記

Posted: 2006年3月08日(水) 21:02
by 雷電
検討の結果、ファイルパスに原因があるらしいので、検査してもらえませんか?
自分でも一応しますが、まだ素人なので、あまり良くわかりません。

Re: 追記

Posted: 2006年3月08日(水) 23:29
by 7
> 検討の結果、ファイルパスに原因があるらしいので、検査してもらえませんか?
ツールバーの所でひっかかる、っていうので気付いたのですが、Win32プログラミング講座のツールチップに関するコードと違うので講座通りに直してみました。 デバッグしてないので動くか、解決するか、も分かりませんが。

ファイルパスについてですが、どうしてファイルパスが怪しいと思ったのでしょう?
コードを見た限りでは、ファイルを読み込む時にBytePtr型を使っていて、書き込む時はString型を使っている、file_pathが使われていない、ぐらいしか思わなかったのですが...。
自分が気付いてないかもしれないので、教えてくれるとありがたいです。

やりましたが

Posted: 2006年3月09日(木) 15:58
by 雷電
やはり、デバッグに失敗します。
多分、というか、

コード: 全て選択

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
で引っかかるのですが、気のせいですか?

Posted: 2006年3月09日(木) 18:27
by M.S.
僕が投稿した症状と同じなので、書かせてもらいます。

それは、グレースケールのビットマップの方が、
「16 色ビットマップ」になっていないからだと思います。

もしこれで治らないなら、
グレースケール16 色ビットマップ、
カラースケール24 色ビットマップにしてみてください。

これで治るはずです。[/b]

Posted: 2006年3月09日(木) 20:46
by 雷電
どういう意味でしょうか?
グレースケールというのは?

Posted: 2006年3月09日(木) 21:32
by M.S.
灰色 50%、灰色 25%、白

が、主に使われている画像のことです。

Posted: 2006年3月09日(木) 21:41
by 雷電
しましたが、変わりはありません。やはりおきてしまいます。
なぜでしょうか?

Posted: 2006年3月09日(木) 22:02
by 雷電
できました。
話を振り出しに戻します。
上書きのコードを前にも書いてもらいましたが、
完全なコードがほしいのですが。
書いていただけますか?
書いていただいたら、こちらで作っているヘルプファイルに名前を入れさせていただきたいと思っています。
もちろん、今までにコードを書いていただいた方全員です。
よろしくお願いします。

Posted: 2006年3月10日(金) 08:12
by 7
> 上書きのコードを前にも書いてもらいましたが、
> 完全なコードがほしいのですが。
一応完全のつもりで書いたのですが...(^-^;)
読み込み書き込み上書きを、クラス化してしまうと楽かもしれませんね。

ファイルを開く時と保存する時にfile_pathにファイルパスを保存してますか?
file_pathに文字列が入っていないと上書きはされませんよ。

Posted: 2006年3月10日(金) 13:28
by 雷電
前に書いてもらったコード

コード: 全て選択

Sub file_OverWrite()
    Dim hEdit As HWND
    Dim hFile As HFILE
    Dim pStr As BytePtr
    Dim length As DWord
    Dim dwAccessByte As DWord

    hEdit=GetDlgItem(hMainWnd,EditBox1)
    length=GetWindowTextLength(hEdit)+1
    pStr=calloc(length)
    GetWindowText(hEdit,pStr,length)

    If file_path[0]=0 Then
        '名前を付けて保存か、名前を付けて保存する関数の呼び出し
    Else
        '上書き
        hFile=CreateFile(file_path,GENERIC_WRITE,NULL,ByVal 0,
                CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)
        If hFile<>INVALID_HANDLE_VALUE Then
            WriteFile(hFile,pStr,length-1,VarPtr(dwAccessByte),ByVal 0)
            CloseHandle(hFile)
        Else
            MessageBox(hMainWnd,"ファイルオープンに失敗",
                "AppendMissionEditor",MB_OK or MB_ICONEXCLAMATION)
        End If
    End If

    free(pStr)
End Sub
を、どこに入れればいいですか?

Posted: 2006年3月10日(金) 13:37
by 7
> を、どこに入れればいいですか?
どういうことでしょう...?

例えばメニューから「上書き保存」を選択してファイルを上書きしたい場合は、

コード: 全て選択

'IDは適当
Sub MainWnd_IDM_FILE_OVERWRITE_MenuClick()
	file_OverWrite()
End Sub
と書くだけで良いのですが。

Posted: 2006年3月10日(金) 13:52
by 雷電
うまく動作しないのですが・・・
なぜでしょうか?
もう一度、前のように、コードを書いておきます。 お願いします。
間違っているところを見つけてください・・・。