同期
Re: 同期
フラグ変数を使ってみるといいでしょう。
グローバル領域に
そして、
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
ファイルの内容を変更したような場合には、例えばテキストエディタならばEditBoxのChangeイベントで fChanged=1(上書き確認) を代入します。
また、上書き or 名前を付けて保存時には fChanged=0 を代入します(名前を付けて保存の場合、キャンセル時には代入してはいけないことに注意。また、何らかの事情で保存が失敗したときも代入しないようにしましょう)。
こうして、×を押したとき(QueryCloseイベント)に fChanged=1 ならば上書きするかを尋ねればOKです。
ちなみに、
グローバル領域に
コード: 全て選択
Dim fChanged As Long
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
ファイルの内容を変更したような場合には、例えばテキストエディタならばEditBoxのChangeイベントで fChanged=1(上書き確認) を代入します。
また、上書き or 名前を付けて保存時には fChanged=0 を代入します(名前を付けて保存の場合、キャンセル時には代入してはいけないことに注意。また、何らかの事情で保存が失敗したときも代入しないようにしましょう)。
こうして、×を押したとき(QueryCloseイベント)に fChanged=1 ならば上書きするかを尋ねればOKです。
ちなみに、
- 上書き確認で「キャンセル」が押されたとき
- そのファイルがまだ保存されていない場合に「はい」が押されたので「名前を付けて保存」ダイアログを出したが、そこで「キャンセル」が押されたとき
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
そうです。ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
というのは、Subの中に書くのですか?
ファイルを開くことに成功したとき・新規作成を行ったとき・プログラムを起動したタイミングで fChanged=0 の1行を入力してくだされば結構です。
新規作成したファイルか、一度以上保存したファイル(開いたファイル)どうかで場合分けしなければなりません。あと、不適切なコードでコンパイルしましたら、起動して、保存しようとしたときに、上書きと、ダイアログボックスを表示するのですが、上書きはできますが、保存のダイアログボックスが表示されずに、ファイルのオープンに失敗、と出るのですが、間違いなく失敗です。
GTRさんが参考にされたスレッドのコードを流用しているのであれば、file_pathが空白であるかどうかで判断すればいいでしょう。
空白であれば、まだ一度も保存されていないファイルですから「名前を付けて保存」ダイアログを表示し、ファイル名が取得できたらそこに保存するようにします。
空白でなければ、file_pathが現在のファイル名を表すためそのファイル名で保存するようにします。
まだわかりにくいということであれば、どの辺がわからないか書いていただければ。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
> 例えばのコードで言いますが、
>
>
> こういうのでいいんですか?
> if文とかで分けなくてはいけないのでしょうか?
そういう感じでいいと思います。(そのままではいけませんが…)
一応言っておくと、変更があったときは1を代入するだけでいいです。
If文は、終了時などに変更がある(fChanged=1)かどうかを調べたり、
変更があったとき、さらにファイルが開かれた状態(file_pathが空ではない)かを調べたりするときに使用します。
そして、上書き保存やら名前をつけて保存やらをするだけです。
そういえば、EM_GETMODIFYっていうのがあったから、
アレ使えば、フラグ立てなくてもよさそうな気がする…(^^;)
>
コード: 全て選択
Sub MainWnd_EditBox1_Change()
> fChanged=1
> fChanged=0
> End Sub
> こういうのでいいんですか?
> if文とかで分けなくてはいけないのでしょうか?
そういう感じでいいと思います。(そのままではいけませんが…)
一応言っておくと、変更があったときは1を代入するだけでいいです。
If文は、終了時などに変更がある(fChanged=1)かどうかを調べたり、
変更があったとき、さらにファイルが開かれた状態(file_pathが空ではない)かを調べたりするときに使用します。
そして、上書き保存やら名前をつけて保存やらをするだけです。
そういえば、EM_GETMODIFYっていうのがあったから、
アレ使えば、フラグ立てなくてもよさそうな気がする…(^^;)
時間ないからこんなもので許してください…
コード: 全て選択
Sub MainWnd_EditBox1_Change()
fChanged=1
End Sub
Changeイベントを使わない方法
[ここをクリックすると内容が表示されます]
を使えば、変更されたかどうかは、わかります。
変更されていないときは、0が返り、変更されているときは、0以外が返ってきます。
保存したときに自動で0に戻るかどうか忘れたけど、0に戻らないようなら、
EM_SETMODIFYを送ればいいです。
(WPARAM に 0 を入れて)
注:もっと上級者の方の意見を参考にした方がいいかもしれません…コード: 全て選択
SendMessage(hWnd, EM_GETMODIFY, 0, 0)
変更されていないときは、0が返り、変更されているときは、0以外が返ってきます。
保存したときに自動で0に戻るかどうか忘れたけど、0に戻らないようなら、
EM_SETMODIFYを送ればいいです。
(WPARAM に 0 を入れて)
MainWnd_Create()イベント内に
MainWnd_EditBox1_Change()イベント内に
ファイルを開いたとき・保存に成功したとき・新規作成を選んだとき
これだけでOKのはずです(グローバルに Dim fChanged As Long を入力すること)。
EM_GETNOTIFYを使う方法は省略(うぱさんの説明を参考にしてください)。
コード: 全て選択
fChanged=0
コード: 全て選択
fChanged=1
コード: 全て選択
fChanged=0
EM_GETNOTIFYを使う方法は省略(うぱさんの説明を参考にしてください)。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
いわれたようにってみました。
すると、いい感じにながれたのですが、閉じようとしたときに、何も聞いてきません。
コードがおかしいと思うので改良してみました。
改善点を教えてください。
すると、いい感じにながれたのですが、閉じようとしたときに、何も聞いてきません。
コードがおかしいと思うので改良してみました。
[ここをクリックすると内容が表示されます]
しかし、こういうコードにすると、逆にまた聞かなくなります。コード: 全て選択
Sub MainWnd_QueryClose(ByRef cancel As Integer)
' エディットボックスの内容が変更されているかどうか
If SendMessage(hMainWnd, EM_GETMODIFY, 0, 0) <> 0 Then
' 保存するかユーザーに訊く。
Dim ret As Long
ret = MessageBox(hMainWnd, "内容が変更されています。保存しますか?", "", MB_YESNOCANCEL or MB_ICONEXCLAMATION)
Select Case ret
Case IDYES
file_OverWrite()
Case IDNO
Exit Sub
Case IDCANCEL
cancel = 1
End Select
End If
End Sub
改善点を教えてください。
SendMessageでやるか、フラグ変数でやるかは揃えたほうがいいでしょう。
この場合だと
ここの部分を
と変えてください。
この場合だと
コード: 全て選択
If SendMessage(hMainWnd, EM_GETMODIFY, 0, 0) <> 0 Then
コード: 全て選択
If fChanged Then
[hira]
http://hira.hopto.org/
http://hira.hopto.org/