Aoi32(0, 0, 6, 2/Osaki #61) -閉じた時に保存するかどうか確認するダイアログとその処理.

閉じる時に変更されていた場合、保存するかどうかの確認ダイアログを出して、「はい」なら保存して閉じる、「いいえ」なら保存しないで閉じる、「キャンセル」ならそもそも閉じない、という処理にする。

MainWindow.cppで、

OnCloseで変更状態ならフラグを立てて、"変更内容を保存しますか?"とYESNOCANCELなダイアログを表示。
「はい」を選んだ場合、すでに既存のファイルを開いている場合は、ファイルダイアログを表示せずに上書き保存して、0を返してウィンドウを閉じる。
ファイルを開いていない場合は、ファイルダイアログが表示され、ファイル名を付けることになる。ファイル名を指定したら、保存をして0を返して閉じるが、キャンセルの場合は-1を返してウィンドウを閉じない。
「いいえ」の場合は、もちろん保存しないで0を返してウィンドウを閉じる。
「キャンセル」の場合は、-1を返してウィンドウを閉じない。

開く
開く

ファイルを開いて、

初期状態
初期状態

こうなっているとする。

追加入力
追加入力

このように追加入力する。
閉じようとすると、

終了確認
終了確認

こうなるので「OK」
すると、

保存確認
保存確認

こうなる。
これで「はい」を選択すると、上書き保存されて終了するので、

次開いた時
次開いた時

次に開いた時、

保存されてる
保存されてる

保存されてる。

さらに追加
さらに追加

さらに追加をして、閉じようすると、

終了確認
終了確認

これが出て、「OK」を押すと、

保存確認
保存確認

これが出るので、今度は「いいえ」にすると終了する。

次に開いた時
次に開いた時

次に開いた時、

保存されてない
保存されてない

今度は保存されてない。

入力して
入力して

入力して、

終了確認
終了確認

終了確認で「OK」で、

キャンセル
キャンセル

今度はここで「キャンセル」を押すと、

閉じない
閉じない

閉じない。

今度は、

開いて
開いて

開いて、

このまま閉じる
このまま閉じる

こうなっているものをこのまま閉じると、

終了確認
終了確認

終了確認は出るが、これで「OK」を押しても、変更されていないのでこのまま閉じる。

新規に起動
新規に起動

今度は、新規に起動して、

入力
入力

入力して、

終了確認
終了確認

閉じるとこれが出て、「OK」を押すと、

保存確認
保存確認

保存確認ダイアログが出る。「はい」を押すと、

名前を付けて保存
名前を付けて保存

既存のファイルではなく、新規のファイルなので、「名前を付けて保存」ダイアログが出る。

名前を付ける
名前を付ける

名前を付けて、保存する。

今度開いたときは、

ファイルができてる
ファイルができてる

ファイルができてるので、

読み込める
読み込める

読み込める。

新規
新規

新規に作ろうとして、

終了確認
終了確認

ここで「OK」で、

保存確認
保存確認

ここでも「はい」で、

ファイル名指定
ファイル名指定

ファイル名を指定せずキャンセルをすると、保存されないがウィンドウも閉じない。(保存確認のキャンセルと同じ)

-閉じた時に保存するかどうか確認するダイアログとその処理. · bg1bgst333/Aoi32@9a69756 · GitHub

DroidKaigi 2019に初参加してきました(2日目)

DroidKaigi 2019 2日目

なんと朝食があるらしいので早めに。

で2日目スタート。

droidkaigi.jp

最初は音声認識の話。
Dialogflow使ってみよう。

そいえば朝からWiFiの障害が。

droidkaigi.jp

次のセッションは既存プロダクトの設計改良の話。
苦手なところなので勉強になる。

そしてランチ。

droidkaigi.jp

2日目のメイン、カスタムブラウザの話。
WebViewじゃなくてFirefoxChromiumなどの話だったんだけど、わりと簡単にビルドできるらしいので、今度試してみよう。
dynamisさんとオフィスアワーで話してたので、

droidkaigi.jp

少し遅れて立ち見でAndroidStudioの設定の話。

droidkaigi.jp

DI初心者講習

で、このあとは、

droidkaigi.jp

soranakkさんのWiFi Direct + VpnServiceの話が気になってたが、

キャンセルとのことで残念。

droidkaigi.jp

代わりにAPKはどうやって作られるのかと高速化の話を同時通訳で。

droidkaigi.jp

そのあと、またWebViewネタ。といってもメールアプリ、ニュースアプリ、独特の世界で、そういう世界もあるんだなあっておもった。

droidkaigi.jp

またまたWebView、以前調べていたSafe Browsingについて。
この辺使っても良かったのかなあとかいろいろ巡らせる。

droidkaigi.jp

最後はBLEの話。
IrDAのことを思い出した。

2日目は総じて、WebViewの話が多くて、スピーカーの方とも、いろいろお話しできて楽しかった。
来年もぜひDroidKaigiに参加したいと思いました。

ちょっとセッションというのも考えたけど恐れ多い・・・。

ひとまず、来年までに人並みの開発はできるように修行してきます・・・。

追伸:

障害の犯人www

DroidKaigi 2019に初参加してきました(1日目)

以前から、行きたいとおもっていたDroidKaigiに初参加してきました。

droidkaigi.jp


DroidKaigiに来た
DroidKaigiに来た

オープニングのセッションはマルチモジュールの話

droidkaigi.jp

モジュール化することで再利用きくとか。

droidkaigi.jp

続いて、マルチモジュールでDIの話。
でも、私DI初心者マン。

翌日、初心者セッションもあるとのことで安心。

ランチ
ランチ

ここでランチ。

droidkaigi.jp

DDDで設計して実装する話。
設計しないマンなのでこういうの凄い参考になる。

droidkaigi.jp

続いて、テーマとかスタイルとかについてあまり知らなかったので。
意味が少しわかった。

droidkaigi.jp

1日目で一番気になった僕にとってこの日のメイン。Chrome Custom Tabsの話。
OHMAE Ryosukeさんともオフィスアワーでちょっと話した。今度使ってみよう。

このあと展示を見てたら、mhidakaさんのセッションが満杯で断念。

droidkaigi.jp

次まで展示見てた・・・。

ノベルティたくさんもらった
ノベルティたくさんもらった

そしてノベルティたくさんもらった。

droidkaigi.jp

クロスプラットフォームの話。
Cordovaやってたときのこと思い出す・・・。

パーティー
パーティー

夜はパーティー・・・。
amay077さん、Nkznさん、Fumiya_Kumeさん、yanzmさんに挨拶できた。

1日目、今後強化していかないといけない課題ばかりで、勉強になりました。

追伸:

アンケート・・・。
星が背景の赤で隠れてしまってる・・・。

Aoi32(0, 0, 6, 1/Osaki #60) -変更されたかどうかのフラグを追加. etc...

変更されたかどうかのフラグを追加し、ファイルを開いた時やウィンドウを閉じた時に、EM_GETMODIFYでエディットコントロールの状態をチェックしてみた結果、システムからの変更(今回は読み込み時のSetWindowTextのみだが)はEM_GETMODIFYの対象外であることがわかった。

MainWindow.hで、

CMainWindowに、変更されたかどうかのフラグm_bModifiedを追加。
(当初、CTextFileかなとおもったが、あちらはファイルを管理するものだからそこではない。ただ、だったらCEditかなともおもうが、文字コードや改行コードなどのメニューで切り替えられる状態もあるので、ちょっとそれも今のところは違うかなとおもっている。)

MainWindow.cppでは、

コンストラクタやデストラクタでm_bModifiedをFALSE。

OnCreate、OnDestroyでもFALSE。

OnFileOpenでファイルを読み込み、エディットコントロールにセットした後で、EM_GETMODIFYで変更状態をチェック。

閉じる時も、EM_GETMODIFYでチェックをする。

開く
開く

ファイルを開くと、

Not Modified!
Not Modified!

何もないエディットコントロールに読み込んだテキストがセットされたのだから、変更されたフラグが立つものだとおもったら、"Not Modified!"。
システムというかAPIであるSetWindowTextでの変更は対象外だということがわかる。

確認
確認

閉じようとすると、確認ダイアログが出るので、ここでOKを押すと、

ここでも
ここでも

当然、ここでのチェックも"Not Modified!"となる。

開く
開く

改めて、もう一度テストしてみる。また、開くと、

Not Modified
Not Modified

当然、"Not Modified!"。

手入力変更
手入力変更

読み込んだら、今度は手入力で変更してみる。
これで閉じると、

確認
確認

これが出て、OKを押すと、

Modified!
Modified!

今度は"Modified!"になっている。
つまり、手入力で変更された時のみ、フラグが立つようになっている。

-変更されたかどうかのフラグを追加. · bg1bgst333/Aoi32@7946784 · GitHub

Aoi32(0, 0, 6, 0/Osaki #59) -アプリケーション終了確認ダイアログの表示.

「アプリケーションを終了しますか?」というようなアプリケーション終了確認のダイアログを表示していなかったので、それを実装する。
まず、ウィンドウの破棄の時であるWM_DESTROYではなく、ウィンドウを閉じる時のWM_CLOSEの処理がなかったので、それを追加する。

Window.hで、

OnCloseを追加。

Window.cppで、

DynamicWindowProcでWM_CLOSEの時、OnCloseが0以外を返した時に、0を返してウィンドウを閉じないようにしている。
(フラグを逆にしているので、ちょっとややこしいので注意!)
つまり0ならウィンドウは閉じる。

基本的には0を返すので、普通に閉じる。

MainWindow.hで、

ここにもOnCloseを追加。

MainWindow.cppで、

OnCloseで、OKCancelなメッセージボックスを出して、IDOKなら0を返してウィンドウを閉じる。
IDCANCELなどそれ以外なら、-1を返してウィンドウを閉じない。

起動時
起動時

起動時、この状態で、

閉じるボタン
閉じるボタン

閉じるボタンを押すと、

アプリケーション終了確認ダイアログ
アプリケーション終了確認ダイアログ

アプリケーション終了確認ダイアログを表示。

キャンセル
キャンセル

キャンセルだと、

閉じない
閉じない

ウィンドウを閉じないが、

OK
OK

OKだと、ウィンドウを閉じて、アプリケーションが終了する。

-アプリケーション終了確認ダイアログの表示. · bg1bgst333/Aoi32@3c43c54 · GitHub

EM_SETMODIFY

EM_GETMODIFYで変更されたかどうかが取得できるわけだが、テキストファイルを保存した直後はそのテキストファイルとエディットコントロールの入力内容は同じなので、変更されていないという状態に戻さないといけない。
EM_SETMODIFYで変更状態のフラグを設定できる。

EM_SETMODIFY message - Windows applications | Microsoft Docs

resource.hで、

リソースIDのID_ITEM_RESET_MODIFYを追加。

EM_SETMODIFY.rcで、

メニューアイテムに”Reset Modify”を追加し、ID_ITEM_RESET_MODIFYを割り当てる。

EM_SETMODIFY.cppでは、

”Reset Modify”が選択されたら、SendMessageの第3引数にFALSEを指定して、EM_SETMODIFYを送る。
これで、変更された状態でもフラグを降ろして、変更されていない状態になる。

起動時
起動時

起動時、この状態で、

Check Modify
Check Modify

"Check Modify"を選択しても、変更されていないので、当然何も起こらない。

"ABCDE"と入力
"ABCDE"と入力

"ABCDE"と入力してから、

Check Modify
Check Modify

"Check Modify"を選択すると、

Modify!
Modify!

変更された状態なので"Modify!"が表示される。

Reset Modify
Reset Modify

ここで、"Reset Modify"を選択してから、

Check Modify
Check Modify

"Check Modify"を選択すると、

何も起こらない
何も起こらない

何も起こらない。
変更状態のフラグが降ろされているからである。
このままウィンドウを閉じても、"Modify!"は表示されない。

Sample/winapi/EM_SETMODIFY/EM_SETMODIFY/src/EM_SETMODIFY at master · bg1bgst333/Sample · GitHub

EM_GETMODIFY

テキストエディタや、なんらかの入力項目を持つアプリで、入力内容に変更があったら、アプリ終了時に内容の保存を促すダイアログが表示されることがあるだろう。
入力内容に変更があったのかどうかを取得するには、EM_GETMODIFYメッセージを使う。

EM_GETMODIFY message - Windows applications | Microsoft Docs

resource.hでは、

今回は、ボタンじゃなくてエディットコントロールなので、ID_EDIT1。

EM_GETMODIFY.rcでは、

リソースIDはID_ITEM_CHECK_MODIFYで、"Check Modify"という表示名のアイテムを用意。

EM_GETMODIFY.cppでは、

WM_CREATEで、リソースIDがID_EDIT1のエディットコントロール作成。

"Check Modify"のアイテムが選択されたら、GetDlgItemでhEditを取得。
SendMessageでhEditにEM_GETMODIFYを送ると、戻り値としてエディットコントロールの内容に変更があったかどうかが返ってくる。
変更されたら"Modify!"と表示する。

WM_CLOSEの時も、同じ処理をする。

実行時は、

実行時
実行時

この状態。

Check Modify
Check Modify

"Check Modify"を選択しても何も起きない。

閉じるボタン
閉じるボタン

閉じるボタンを押しても、何も起きず、ウィンドウは閉じてしまう。

内容変更
内容変更

"ABCDE"を入力して、内容を変更してから、

Check Modify
Check Modify

"Check Modify"すると、

Modify!
Modify!

"Modify!"と表示される。

閉じるボタン
閉じるボタン

閉じるボタンでも、

"Modify!"
"Modify!"

"Modify!"と表示される。

Sample/winapi/EM_GETMODIFY/EM_GETMODIFY/src/EM_GETMODIFY at master · bg1bgst333/Sample · GitHub