ページ 1 / 1
同期
Posted: 2006年3月27日(月) 20:27
by GTR
今、以前の投稿の”初歩的”というページを見て上書きのコードを書き込んでコンパイルしました。しかし、上書きをしているのに、×を押したときにまた上書きをするか聞いてくるのですが、同期させるにはどうすれば良いでしょう?
Re: 同期
Posted: 2006年3月27日(月) 21:48
by hira
フラグ変数を使ってみるといいでしょう。
グローバル領域に
コード: 全て選択
Dim fChanged As Long
そして、
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
ファイルの内容を変更したような場合には、例えばテキストエディタならばEditBoxのChangeイベントで fChanged=1(上書き確認) を代入します。
また、上書き or 名前を付けて保存時には fChanged=0 を代入します(名前を付けて保存の場合、キャンセル時には代入してはいけないことに注意。また、何らかの事情で保存が失敗したときも代入しないようにしましょう)。
こうして、×を押したとき(QueryCloseイベント)に fChanged=1 ならば上書きするかを尋ねればOKです。
ちなみに、
- 上書き確認で「キャンセル」が押されたとき
- そのファイルがまだ保存されていない場合に「はい」が押されたので「名前を付けて保存」ダイアログを出したが、そこで「キャンセル」が押されたとき
には、QueryCloseイベント内で cancel=1 として終了を阻止しなければならないことに注意してください。
Posted: 2006年3月28日(火) 20:01
by GTR
もう少し詳しく教えていただけませんか?
グローバルに入力しました。
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
というのは、Subの中に書くのですか?
あと、不適切なコードでコンパイルしましたら、起動して、保存しようとしたときに、上書きと、ダイアログボックスを表示するのですが、上書きはできますが、保存のダイアログボックスが表示されずに、ファイルのオープンに失敗、と出るのですが、間違いなく失敗です。
全体的にもう少し詳しくお願いします。
Posted: 2006年3月28日(火) 21:22
by hira
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
というのは、Subの中に書くのですか?
そうです。
ファイルを開くことに成功したとき・新規作成を行ったとき・プログラムを起動したタイミングで fChanged=0 の1行を入力してくだされば結構です。
あと、不適切なコードでコンパイルしましたら、起動して、保存しようとしたときに、上書きと、ダイアログボックスを表示するのですが、上書きはできますが、保存のダイアログボックスが表示されずに、ファイルのオープンに失敗、と出るのですが、間違いなく失敗です。
新規作成したファイルか、一度以上保存したファイル(開いたファイル)どうかで場合分けしなければなりません。
GTRさんが参考にされたスレッドのコードを流用しているのであれば、file_pathが空白であるかどうかで判断すればいいでしょう。
空白であれば、まだ一度も保存されていないファイルですから「名前を付けて保存」ダイアログを表示し、ファイル名が取得できたらそこに保存するようにします。
空白でなければ、file_pathが現在のファイル名を表すためそのファイル名で保存するようにします。
まだわかりにくいということであれば、どの辺がわからないか書いていただければ。
Posted: 2006年4月01日(土) 16:47
by GTR
例えばのコードで言いますが、
コード: 全て選択
Sub MainWnd_EditBox1_Change()
fChanged=1
fChanged=0
End Sub
こういうのでいいんですか?
if文とかで分けなくてはいけないのでしょうか?
Posted: 2006年4月01日(土) 18:17
by うぱ
> 例えばのコードで言いますが、
>
コード: 全て選択
Sub MainWnd_EditBox1_Change()
> fChanged=1
> fChanged=0
> End Sub
>
> こういうのでいいんですか?
> if文とかで分けなくてはいけないのでしょうか?
そういう感じでいいと思います。(そのままではいけませんが…)
一応言っておくと、変更があったときは1を代入するだけでいいです。
If文は、終了時などに変更がある(fChanged=1)かどうかを調べたり、
変更があったとき、さらにファイルが開かれた状態(file_pathが空ではない)かを調べたりするときに使用します。
そして、上書き保存やら名前をつけて保存やらをするだけです。
そういえば、EM_GETMODIFYっていうのがあったから、
アレ使えば、フラグ立てなくてもよさそうな気がする…(^^;)
Posted: 2006年4月02日(日) 12:11
by GTR
例えばの例で良いですが、EditBoxのChangeイベントでどう書けば良いでしょう?前に投稿したやつの正しいコードで結構です。
時間ないからこんなもので許してください…
Posted: 2006年4月02日(日) 13:40
by うぱ
コード: 全て選択
Sub MainWnd_EditBox1_Change()
fChanged=1
End Sub
これでいいのではないでしょうか…
Changeイベントを使わない方法
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
SendMessage(hWnd, EM_GETMODIFY, 0, 0)
を使えば、変更されたかどうかは、わかります。
変更されていないときは、0が返り、変更されているときは、0以外が返ってきます。
保存したときに自動で0に戻るかどうか忘れたけど、0に戻らないようなら、
EM_SETMODIFYを送ればいいです。
(WPARAM に 0 を入れて)
注:もっと上級者の方の意見を参考にした方がいいかもしれません…
Posted: 2006年4月07日(金) 18:30
by GTR
よく分からないので、もう一度教えてもらえませんか?
Posted: 2006年4月07日(金) 22:23
by hira
MainWnd_Create()イベント内に
MainWnd_EditBox1_Change()イベント内に
ファイルを開いたとき・保存に成功したとき・新規作成を選んだとき
これだけでOKのはずです(グローバルに Dim fChanged As Long を入力すること)。
EM_GETNOTIFYを使う方法は省略(うぱさんの説明を参考にしてください)。
Posted: 2006年4月07日(金) 23:26
by GTR
いわれたようにってみました。
すると、いい感じにながれたのですが、閉じようとしたときに、何も聞いてきません。
コードがおかしいと思うので改良してみました。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
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
しかし、こういうコードにすると、逆にまた聞かなくなります。
改善点を教えてください。
Posted: 2006年4月08日(土) 09:53
by hira
SendMessageでやるか、フラグ変数でやるかは揃えたほうがいいでしょう。
この場合だと
コード: 全て選択
If SendMessage(hMainWnd, EM_GETMODIFY, 0, 0) <> 0 Then
ここの部分を
コード: 全て選択
If fChanged Then
と変えてください。
Posted: 2006年4月08日(土) 12:04
by GTR
できました。
hiraさん、うぱさん、ありがとうございました