同期

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
GTR

同期

#1 投稿記事 by GTR »

今、以前の投稿の”初歩的”というページを見て上書きのコードを書き込んでコンパイルしました。しかし、上書きをしているのに、×を押したときにまた上書きをするか聞いてくるのですが、同期させるにはどうすれば良いでしょう?
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

Re: 同期

#2 投稿記事 by hira »

フラグ変数を使ってみるといいでしょう。
グローバル領域に

コード: 全て選択

Dim fChanged As Long
そして、
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
ファイルの内容を変更したような場合には、例えばテキストエディタならばEditBoxのChangeイベントで fChanged=1(上書き確認) を代入します。
また、上書き or 名前を付けて保存時には fChanged=0 を代入します(名前を付けて保存の場合、キャンセル時には代入してはいけないことに注意。また、何らかの事情で保存が失敗したときも代入しないようにしましょう)。
こうして、×を押したとき(QueryCloseイベント)に fChanged=1 ならば上書きするかを尋ねればOKです。
ちなみに、
  • 上書き確認で「キャンセル」が押されたとき
  • そのファイルがまだ保存されていない場合に「はい」が押されたので「名前を付けて保存」ダイアログを出したが、そこで「キャンセル」が押されたとき
には、QueryCloseイベント内で cancel=1 として終了を阻止しなければならないことに注意してください。
GTR

#3 投稿記事 by GTR »

もう少し詳しく教えていただけませんか?
グローバルに入力しました。
ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。
というのは、Subの中に書くのですか?
あと、不適切なコードでコンパイルしましたら、起動して、保存しようとしたときに、上書きと、ダイアログボックスを表示するのですが、上書きはできますが、保存のダイアログボックスが表示されずに、ファイルのオープンに失敗、と出るのですが、間違いなく失敗です。
全体的にもう少し詳しくお願いします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#4 投稿記事 by hira »

ファイルを開いたとき・新規作成・起動時に fChanged=0(上書き確認不要) を代入するコードを追加します。

というのは、Subの中に書くのですか?
そうです。
ファイルを開くことに成功したとき・新規作成を行ったとき・プログラムを起動したタイミングで fChanged=0 の1行を入力してくだされば結構です。
あと、不適切なコードでコンパイルしましたら、起動して、保存しようとしたときに、上書きと、ダイアログボックスを表示するのですが、上書きはできますが、保存のダイアログボックスが表示されずに、ファイルのオープンに失敗、と出るのですが、間違いなく失敗です。
新規作成したファイルか、一度以上保存したファイル(開いたファイル)どうかで場合分けしなければなりません。
GTRさんが参考にされたスレッドのコードを流用しているのであれば、file_pathが空白であるかどうかで判断すればいいでしょう。
空白であれば、まだ一度も保存されていないファイルですから「名前を付けて保存」ダイアログを表示し、ファイル名が取得できたらそこに保存するようにします。
空白でなければ、file_pathが現在のファイル名を表すためそのファイル名で保存するようにします。

まだわかりにくいということであれば、どの辺がわからないか書いていただければ。
GTR

#5 投稿記事 by GTR »

例えばのコードで言いますが、

コード: 全て選択

Sub MainWnd_EditBox1_Change()
	fChanged=1
	fChanged=0
End Sub
こういうのでいいんですか?
if文とかで分けなくてはいけないのでしょうか?
うぱ
記事: 4
登録日時: 2006年4月01日(土) 18:00
連絡する:

#6 投稿記事 by うぱ »

> 例えばのコードで言いますが、
>

コード: 全て選択

Sub MainWnd_EditBox1_Change()
> 	fChanged=1
> 	fChanged=0
> End Sub
>
> こういうのでいいんですか?
> if文とかで分けなくてはいけないのでしょうか?

そういう感じでいいと思います。(そのままではいけませんが…)
一応言っておくと、変更があったときは1を代入するだけでいいです。

If文は、終了時などに変更がある(fChanged=1)かどうかを調べたり、
変更があったとき、さらにファイルが開かれた状態(file_pathが空ではない)かを調べたりするときに使用します。
そして、上書き保存やら名前をつけて保存やらをするだけです。

そういえば、EM_GETMODIFYっていうのがあったから、
アレ使えば、フラグ立てなくてもよさそうな気がする…(^^;)
GTR

#7 投稿記事 by GTR »

例えばの例で良いですが、EditBoxのChangeイベントでどう書けば良いでしょう?前に投稿したやつの正しいコードで結構です。
うぱ
記事: 4
登録日時: 2006年4月01日(土) 18:00
連絡する:

時間ないからこんなもので許してください…

#8 投稿記事 by うぱ »

コード: 全て選択


Sub MainWnd_EditBox1_Change() 
     fChanged=1 
End Sub
これでいいのではないでしょうか…

Changeイベントを使わない方法 注:もっと上級者の方の意見を参考にした方がいいかもしれません…
GTR

#9 投稿記事 by GTR »

よく分からないので、もう一度教えてもらえませんか?
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#10 投稿記事 by hira »

MainWnd_Create()イベント内に

コード: 全て選択

fChanged=0
MainWnd_EditBox1_Change()イベント内に

コード: 全て選択

fChanged=1
ファイルを開いたとき・保存に成功したとき・新規作成を選んだとき

コード: 全て選択

fChanged=0
これだけでOKのはずです(グローバルに Dim fChanged As Long を入力すること)。
EM_GETNOTIFYを使う方法は省略(うぱさんの説明を参考にしてください)。
GTR

#11 投稿記事 by GTR »

いわれたようにってみました。
すると、いい感じにながれたのですが、閉じようとしたときに、何も聞いてきません。
コードがおかしいと思うので改良してみました。 しかし、こういうコードにすると、逆にまた聞かなくなります。
改善点を教えてください。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#12 投稿記事 by hira »

SendMessageでやるか、フラグ変数でやるかは揃えたほうがいいでしょう。
この場合だと

コード: 全て選択

If SendMessage(hMainWnd, EM_GETMODIFY, 0, 0) <> 0 Then
ここの部分を

コード: 全て選択

If fChanged Then
と変えてください。
GTR

#13 投稿記事 by GTR »

できました。
hiraさん、うぱさん、ありがとうございました
返信する