ページ 14

初歩的

Posted: 2006年2月22日(水) 14:29
by 雷電
初歩的なのですが、上書きをするときに、どういうコードを入力すればいいですか?
教えてください。コードも書いてください。お願いします。

Re: 初歩的

Posted: 2006年2月22日(水) 16:55
by 7
> 初歩的なのですが、上書きをするときに、どういうコードを入力すればいいですか?
メモ帳でファイルを上書きする為には、あらかじめファイルを開くか保存するかしてからじゃないと上書きできませんよね?

グローバルな所に変数file_pathを宣言しておきます。
で、ファイルを開いた時、あるいは、ファイルを保存した時にファイルのパスをfile_pathに格納しておきます。
ユーザーが上書きを押した時file_pathが空だった場合、名前を付けて保存、空じゃなければfile_pathに格納されているパスに保存することで上書きが可能です。

ユーザーが新規作成を押した場合、エディットボックスの内容を空にするのと一緒にfile_pathも空にしなければいけません。

Win32プログラミング講座「Step11. テキスト エディタを作る」を参考にすると分かりやすいかもしれません。
ファイルオープン、ファイルへ保存する時のofn.lpstrFileという変数がありますが、これをグローバル変数に格納しておくんですね。

意味はOK

Posted: 2006年2月23日(木) 15:49
by 雷電
意味はわかりました。しかし、グローバルのところに記入する場合は、Subで入力するのか、Dim命令で入力するのかどちらなのでしょうか?
そこだけがわかりません。 このコードを、どうやって格納したらいいですか?
お願いします、教えてください。

Posted: 2006年2月23日(木) 16:49
by hira
file_pathはグローバルですから

コード: 全て選択

Dim file_path As String
はグローバル領域に書けばいいです。
次に各メンバに代入している箇所ですが、GetSaveFileName関数を呼び出す直前のタイミングがベストです。このとき、関数(SubとかFunctionとか)の中で格納コード+GetSaveFileNameを呼び出すといいでしょう。
このとき、ofnはグローバルにする必要はありません。

コード: 全て選択

Dim ofn As OPENFILENAME
は関数の中に書くといいでしょう。
但し、ローカルに

コード: 全て選択

Dim FileName As String
の宣言も必要です。
なお、よく質問板に来るつまずき例として「バッファを確保し忘れた」というケースがありますので、そこにはご注意を。FillMemoryのコードを書く直前に

コード: 全て選択

FileName=ZeroString(MAX_PATH)
を追加しておかなければなりません。
GetSaveFileName関数を呼び出したら、キャンセルされるケースも考慮して関数の戻り値で分岐してください。特に、

×ボタンをクリックして「保存しますか」のダイアログ→「はい」をクリック→「名前を付けて保存」ダイアログ→「キャンセル」をクリック→そのままプログラム終了

にというとんでもないフリーソフトに遭遇し、ひどい目に遭った記憶があります。その辺の処理にご注意ください。

戻り値が0以外である(=「保存」が選択された)ときには

コード: 全て選択

file_path=MakeStr(FileName)
を呼び出すことも忘れずに(このコードで作業中のファイル名が反映される)。必要に応じてこのタイミングでタイトルバーの文字列を変更するなどしてください。

OKです。

Posted: 2006年2月24日(金) 14:46
by 雷電
わかりました、初歩的な質問ですいません・・。
7さん、hiraさん、ありがとうございました。
上書きについては、うまくいきましたが、hiraさんの使ったフリーソフトというのは?
戻り値で、×を押したときに、変更されたかという確認のコードは、

http://www.discoversoft.net/forum/viewtopic.php?t=692

というので出てましたが(ここにも質問してしまった。。。情けない。)そのあとに、戻り値を使ってどういうふうに戻り値を利用したらいいのかわかりません。
教えてください。そのことは、↑のページに書き込んでもらったら結構です。

Posted: 2006年2月24日(金) 16:46
by 7
EM_GETMODIFYをエディットボックスに送ると、内容が変更されているなら0以外の値、変更されていないなら0が返ってきます。
この戻り値を判定してソフトウェアを終了するかどうかを決定します。

「×」を押した時にエディットボックスにEM_GETMODIFY送信、戻り値が0なら終了、0以外なら終了しない(保存するかどうか)、という感じですね。

すごく手抜きコードですがこんな感じです。

わー!

Posted: 2006年2月24日(金) 17:19
by 雷電
上書きのところをやってたら、なんかこんがらがってきた。
どうしてもこの機能をつけたいんだけどなーー。
サンプルの上書きのコードありませんか?

Re: わー!

Posted: 2006年2月24日(金) 18:32
by 7
> サンプルの上書きのコードありませんか?
今、プログラミング環境が無いのでちゃんとしたコードは書けません...。
Win32プログラミング講座「Step11. テキスト エディタを作る」のファイルへ保存の動作を理解してますか?
ファイルへ保存のコードを応用するだけで上書き保存は実装可能ですよ。

名前を付けて保存は、「ファイルの保存」ダイアログボックスを表示してユーザーが指定したファイルのパスを取得して、そのファイルパスとCreateFile()関数を使ってファイルをオープンする訳ですが、
上書き保存は、「ファイルの保存」ダイアログボックスを表示せず、グローバル変数に保存してあるファイルパスとCreateFile()関数を使ってファイルをオープンする訳です。

あとは名前を付けて保存も上書き保存もWriteFile()関数、CloseHandle()関数でお仕舞いです。

Re: わー!

Posted: 2006年2月24日(金) 19:16
by 7
晩御飯は久しぶりの出前でカツ丼でした(^_^)

上書き部分だけのコードですが書いてみました。
あらかじめファイルを開くか保存する時にfile_pathにファイルパスを格納しておく必要があります。

Posted: 2006年2月24日(金) 19:40
by hira
hiraさんの使ったフリーソフトというのは?
何だったかはよく覚えていません(^^; ゲームの記録か何かだったかと思うのですが、そんなに重要ではなかったので問題なし。でもバグはバグ。

Posted: 2006年2月27日(月) 18:04
by 雷電
返信ありがとうございます。
上書きのコードを早速入力してみたわけですが、なぜかデバッグしてみても、
スレッド(&HB40)でアクセス違反がありました(EPI=&H5AB77F36)。
とでてしまいました[/quote]

Posted: 2006年2月27日(月) 20:07
by 7
>
スレッド(&HB40)でアクセス違反がありました(EPI=&H5AB77F36)。
こちらは問題なく上書きされるのですが...。
アクセス違反があった時どんな関数が強調表示されましたか?

Posted: 2006年3月07日(火) 16:56
by 雷電
問題を発見。
MainWnd.sbp(76) - "CreateToolbarEx" のパラメータ指定が間違っています
MainWnd.sbp(76) - 型が違います
とのことです。
問題が発見されましたが、一応、そこのところのコードを書いておきます。

Posted: 2006年3月07日(火) 21:06
by 7
> 問題を発見。
>
MainWnd.sbp(76) - "CreateToolbarEx" のパラメータ指定が間違っています
これは...。
16,15 _ 'ビットマップサイズ
気付きにくいかもしれませんが、CreateToolbarEx()関数の第11引数が間違っています。正しくは16,15, _で、雷電さんのコードではコンマ(,)が足りていません。
「"CreateToolbarEx" のパラメータ指定が間違っています」と答えがでてるんですからもうちょっと注意して欲しかったです。

まだ

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