MS Access Tips/Sample and VBA and Blog customize etc...

「レコード保存ボタン」クラスの改良

前回の記事 閉じるときに更新前処理をキャンセルすると出るメッセージを変更 の仕様を「レコード保存ボタン」クラスにも適用してみます。また、「閉じる」コマンドボタンも追加します。

CloseMsg.png

難易度:

「レコード保存ボタン」クラスの改良

クラスで自作イベントを実装する のサンプルを元に改良します。

上記サンプルのフォームにコマンドボタンを追加します。名前は「cmd閉じる」、標題は「閉じる」とします。

クラスモジュール(ClsSaveButton)を下記のように記述します。

フォームモジュールは下記のようになります。前回からの変更は7行目だけです。

加筆修正(2010/3/18): 新規レコードのとき、更新しても 保存ボタン、取り消しボタンが使用可能にならないという不具合がありました。対策として、挿入前処理のコードを追加しました。

これで、編集中に、「閉じる」ボタン、フォームタイトルバーのクローズボタン(×ボタン)、あるいはAccess本体のクローズボタン(×ボタン)、Alt+F4・・・・などでフォームを閉じようとすると下記のような確認メッセージが表示されて、「いいえ」をクリックすると閉じるのは中止されて編集状態に戻ります。

CloseMsg1.png

さて、ここで、このメッセージボックスと冒頭の画像のメッセージボックスを比べてみてください。冒頭のメッセージでは1行目が太字ですし、ボタンのデザインも違いますね。Accessの標準のMsgBox関数ではシステムのメッセージボックスとこのようにデザインが異なります。システムメッセージと同じデザインがいいと言う場合は、クラスモジュールの CloseConfirm関数を下記のように書きかえてください。
なお、この技はPicasoさんのブログ、Picasoのぴー: 太字のメッセージボックス の情報を参考にさせていただきました。

注: このクラスモジュールはAC2000以前には非対応となります。AC2000以前では、取り消し時イベントが未実装のためです。AC2000に対応させるためには、取り消し時イベントを削除して、また、影響も受ける部分も変更する必要があると思われますが、当方、AC2000環境を持ってないので、必要な方は各自で変更してください。

サンプルファイルが下記からダウンロードできます。
FrmSaveButtonClassWithEventKai_07.zip (Access 2007-2010 形式 - 35kb)
FrmSaveButtonClassWithEventKai.zip (Access 2002-2003 形式 - 34kb)

拍手する

-8 Comments

ななーし says..."分からない点があり、教えて頂けませんか?"

現在、SaveBtn_BeforeUpdateが動作せず苦戦しておりまして、質問させて頂きます。
プログラムのフォームモジュールでSaveBtn_BeforeUpdateという部分がありますが、これはどのような動作をしているのでしょうか?クラスの方でもMyfrm_BeforeUpdateもやっています。どのようにプログラムに組み込めばよいのでしょうか?
よろしくお願いします。

2015.12.07 14:00 | URL | #0ewLR0QE [edit]
hatena says..."re:分からない点があり、教えて頂けませんか?"

> 現在、SaveBtn_BeforeUpdateが動作せず苦戦しておりまして、質問させて頂きます。
> プログラムのフォームモジュールでSaveBtn_BeforeUpdateという部分がありますが、これはどのような動作をしているのでしょうか?クラスの方でもMyfrm_BeforeUpdateもやっています。どのようにプログラムに組み込めばよいのでしょうか?
> よろしくお願いします。

とりあえず下記のページを読んでください。

「レコード保存ボタン」クラスで入力チェック - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-165.html

クラスで自作イベントを実装する - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-174.html

簡単に説明すると、
「レコード保存ボタン」クラスでフォームの更新前処理をキャンセルしています。
なので、フォームの更新前処理での入力チェックはできません。
そこで、クラスで保存する前に独自のイベントを発生させます。
フォーム側で、その独自イベントに入力チェックを記述できるという仕組みになっています。

この辺りはかなりややこしいので、上記のページをサンプルを見ながら熟読すると理解できるかな。

それで希望のことがうまくいかないということなら、
希望のことと書いてみたコードを提示してください。

2015.12.08 16:41 | URL | #5uE6dEgY [edit]
ななーし says...""

回答ありがとうございます。
やはり、Myfrm側はキャンセル動作なので必須なのですね。Savebtnの動作がまだわからないので熟読します。またわからなければ改めて質問します。
ありがとうございました!

2015.12.09 08:29 | URL | #0ewLR0QE [edit]
ななーし says..."解決しました!ありがとうござました。"

原因は教えて頂いたSavebtn_BeforeUpdateの前に入力が必須なものを動作させてエラーしているというものでした。順番を変えたことで解決しました。自分で関数定義もできるようになったことで汎用性も上がったのでいろんなことをクラス化できればいいなと思います。(複数あるものが今回多いのでクラスが使えるといいなと思いまして、1つのものは今まで通りでいきます)
ありがとうございました!

2015.12.10 14:45 | URL | #0ewLR0QE [edit]
名無し says...""

こんにちは。いつも参考にさせていただいております。

サブフォームを使う形ではどのようにすればよいでしょうか。
上記のまま使ってみたところ、親フォームを編集すると
保存ボタンを押すまでサブフォームを編集できなくなります。
サブフォーム_Enter のときボタンをクリックするという動作を入れてもできなかったため質問させていただきます。
お忙しいところ恐縮ですがよろしくお願いいたします。

2017.04.04 18:28 | URL | #v0W2OX1k [edit]
hatena says..."re:"

> サブフォームを使う形ではどのようにすればよいでしょうか。
> 上記のまま使ってみたところ、親フォームを編集すると
> 保存ボタンを押すまでサブフォームを編集できなくなります。
> サブフォーム_Enter のときボタンをクリックするという動作を入れてもできなかったため質問させていただきます。

このページの方法が使えるのは単票フォームのみです。

参照整合性の関係で、メインフォームを保存しないと、サブフォームは入力できないという仕様です。

希望のことを実現するには、サブ側のフォームはサブフォームではなく別フォームにして、なおかつワークテーブルを使うという、かなり高難度もものになります。

2017.04.04 21:06 | URL | #5uE6dEgY [edit]
名無し says..."re:"

ご回答いただきありがとうございます。
単票フォームのみでしたか…。
メインフォームとサブフォームの入力チェックを行いたいと考えているのですが
その場合はこちらの方法の方が目的に合っていますでしょうか。
http://hatenachips.blog34.fc2.com/blog-entry-507.html
更新直前に行いたいのですが、Form_Unloadと同じ内容をForm_BeforeUpdateでも行い、
サブフォームはサブフォームコントロールのフォーカス喪失時にチェックを行う...という処理で大丈夫でしょうか。
何卒、よろしくお願いいたします。

2017.04.06 00:40 | URL | #- [edit]
hatena says..."re:re:"

> メインフォームとサブフォームの入力チェックを行いたいと考えているのですが
> その場合はこちらの方法の方が目的に合っていますでしょうか。
> http://hatenachips.blog34.fc2.com/blog-entry-507.html
> 更新直前に行いたいのですが、Form_Unloadと同じ内容をForm_BeforeUpdateでも行い、
> サブフォームはサブフォームコントロールのフォーカス喪失時にチェックを行う...という処理で大丈夫でしょうか。

前のレスと重複しますが、
メインフォームを更新してからでないとサブフォームの入力はできない、
また、サブフォームでも一レコードを更新しないと次レコードへ移動できない、
という仕様ですので、
それぞれを同時に入力を行ってから保存ということはできません。

メインフォームで単独の入力チェックを行ってから更新後、
サブフォームを入力。
サブフォームでも1レコードごとに入力チェックを行って更新ということになります。

帳票フォームの複数レコードで未入力項目のチェック - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-507.html

の方法はあくまで、保存後の複数レコードの入力内容をチェックするもので、
更新直前にチェックを行うものではありません。

2017.04.06 15:52 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/181-2fc8a522
該当の記事は見つかりませんでした。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。