<AccessのForm .Pictureプロパティで画像参照>
こんにちは、三流プログラマーKen3です。 今回は、 Access Form .Pictureプロパティ です。 気楽に読んでください。 /* * 1.問合せメールで意外と多いのが */ 問合せメールで意外と多いのが、 1999/12/05に愚痴系のメルマガで作成した、 Access97 画像リンク処理(埋め込みでMDB肥大を防止?) http://www.ken3.org/backno/backno_guchi06.html#28 http://www.ken3.org/backno/hosoku/028/index.html ←画像付き と <Access97 Pictureプロパティ> http://www.ken3.org/backno/hosoku/e010/index.html の Accessで画像関係の処理です。 /* * 2.仕様を考える */ CD−RやDVD〜が普及してるから、 画像はMDBとは別のエリアにあると仮定して、 設定テーブルを作って、画像保存ディレクトリを管理するか。 で、データファイルには、画像のファイル名を入力して、 画像保存ディレクトリ+画像ファイルで処理するかな。 う〜ん、いつもながら、アバウトな仕様だね(適当?) /* * 3.保存ディレクトリの管理 */ 保存ディレクトリの管理どうしようかなぁ、 DNAじゃなくて、レジストリに書くなんてカッコイイことしなくてイイヤ。 (オイオイ、だったら、レジストリなんて単語書くなよ、混乱するだろ) テーブルを1つ作ります。 名前は、保存場所でイイヤ。 で、中身のフィールドは、GPATHでいっかな。 テーブルの新規作成 ^^^^^^^^^^^^^^^^^^ GPATHとフィールド名を入力、 保存ボタンを押してと、 テーブル名を聞いてくるから、保存場所にしてと。 何?主キー?が設定されてない?勝手にやれよとOKを押す。 メニュー兼画像ディレクトリ入力のフォームを作成 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 簡単に画面を作る方法を1つ(ウイザードの紹介だけどね) フォームの新規作成を押します。 フォームウィザードとテーブルを選択します(テーブルは先ほど作った保存場所) 表示したいフィールドを聞いてくるので、 GPATHを選択してます(IDは、使わないのでほっときましょう) 次へを押してと、 すると、フォームの表示形式を聞いてくるので、 単票を選択します。 次は画面スタイルかぁ、まぁ何でもいいんだけど無難な標準で。 最後に保存名称を聞かれるので、メニューと入れました。 完了(完成しました) うわ、小さい(笑) デザインモードで、変更するから、いっか。 落ち着いて、閉めてと。 空のデータを1行作る ^^^^^^^^^^^^^^^^^^^^ フォームを修正する前に、テーブルに空のデータを入れておきます。 まぁ理由は今は気にしないで、空データとでも入れて下さい。 (たいした理由じゃないけど) フォームの修正 ^^^^^^^^^^^^^^ 大枠は、ウィザードで作ってもらったから、フォームを変更します。 ここでのポイントは、 ・更新オンリーにする(追加、削除をいいえの禁止にする) ・レコードセレクタを消す かなぁ まず、更新オンリーにするには、 フォームのプロパティのデータを選択して、 削除の許可をいいえ 追加の許可をいいえ にします。 えっ、何で更新のみにするかって? 設定レコードを消されるのがイヤ(削除の禁止)、 レコードを増やされるとどっちをみるかわからないので(追加の禁止) してます。 早い話、設定用のテーブルなので1つのレコードが必要なので。 次は、見た目の問題なんだけど、 レコードセレクタと移動ボタンを消します まぁ、あってもいいんだけど(笑) あとは、ラベルを画像保存場所とか修正して、 タイトルも入れとくか。 /* * 4.こっちが本題、画像付きのフォームを作成 */ なんか、マスター画面作りで疲れてしまった。 フォーム作り講座とわかり易く分けろよな、まったく三流作者は。 例題は、読者の皆さんもお疲れだと思うので、軽く。 テーブルの作成 ^^^^^^^^^^^^^^ データは、テーブル名を安易に画像リスト フィールドは、 ID オートナンバー型 F_TITLE テキスト型 画像のタイトルを入れます F_GFILENAME テキスト型 画像ファイル名(001.jpgとフォルダー抜きのファイル名) F_MEMO メモ型 コメントなど にします。 フォームを作成 ^^^^^^^^^^^^^^ テーブルを作ったら、ウィザードで単票フォームでも作るか。 大枠を作ってもらったから、細部を追加しないとね。 デザインの編集モードにしてと 非連結のイメージ ^^^^^^^^^^^^^^^^ コントロールのイメージを選択、 表示エリアを作成します。 イメージを選べって言ってくるので、適当に選びます。 プロパティのピクチャタイプを 埋めこみ から リンクに直します。 次に、適当に選んだファイル名を削除します。 すると、背景のグラフィックを消すか?としつこく確認来るので、 うるせぇとつぶやきながら「はい」を選択します。 ↑独り言はまわりに迷惑だし、さびしいのでやめましょう(笑) オブジェクトの名前、イメージ10とかだと、イヤなので、 画像とかオブジェクトの名前を変えます (今回は、名前の規則守ってないけど、規則を作ったほうがいいですよ) やっと、フォームも完成しましたね。 よし、実行。あれ?ファイル名入れても画像表示されないよ。 笑わせないでよ(笑) だって、処理を書いてないでしょ、処理を。 フォーム作っただけで、思ったように動いたら苦労しないって。 動的に画像を入れかえるプロパティを探る ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ プロパティには、 値の取得のみ可能、値の取得および設定ともに可能 と2パターンあります。 なんて説明を、 /vba/backno/vba036.html [No.36 オブジェクトのプロパティについて] プロパティを調べる方法は、 http://www.ken3.org/vba/excel-help.html で いろいろと書いてたけど、 フォームのエディターって便利だよね、 だって、オブジェクト(コントロールなど)選択すると、 プロパティが表示されてるので、 知りたいプロパティの場所でF1(ヘルプ)を押すと、 簡単にヘルプが表示される。 ピクチャーの部分でF1(ヘルプ)を押すと、 グラフィックスのパスと名前を含む文字列式を、次の例のように使うことができます。 btnShowLogo.Picture = "c:\Windows\Winlogo.bmp" と書いてあります。 なるほどね、 .Picture = "画像ファイル名の文字列" で、できそうですね。 イベントを探る ^^^^^^^^^^^^^^ やりたいことは、 .Picture = "画像ファイル名の文字列" あとは、処理を入れるタイミングかぁ。 イベント処理については、 /vba/backno/vba035.html で軽く書いてたけど、 フォームのエディターって便利だよね(またかよ) オブジェクトを選択すると、あれ発生するイベントが書いてある。 私が今やりたいのは、 ・画像ファイル名が入力されたら、画像を表示。 ・次のレコードや前のレコードにデータが移動されたら の2つのタイミングで、画像を表示したいので、イベントを探る。 テキストボックスをクリックして、イベントを見る。 更新後処理ってのが怪しそうなので、そこでF1(ヘルプ)を押す。 BeforeUpdate、AfterUpdate イベント AfterUpdate コントロールまたはレコードで変更されたデータが更新された直後に発生します。 よし、まず1つは、テキストボックスのAfterUpdate イベント 次は、次のレコードや前のレコードにデータが移動されたらのイベントを探るか。 フォームを選択して、イベントを見る。 おっ、レコード移動時って見たまんまがあるよ、これ使ってみるか。 コードを書く ^^^^^^^^^^^^ ここまで来て、やっとコードを書けるよ(長かった) コードを記述するには、レコード移動時を選択すると右側にある..を押すと、 ビルダが出てくるので、コードを選択が一番簡単かなぁ。 Private Sub Form_Current() End Sub と表示されるので、ここに、 オブジェクト.Picture = "画像ファイル名の文字列" を書けばいいのかぁ。 画像のファイル名は、 メニュー画面で作った、設定のGPATH と フォーム内の画像ファイル名を入れるF_GFILENAME を足したものだから、 私はあまり使わないけど右クリックのビルドを選択すると、 オブジェクトの一覧がでます。 全てのフォームからForms![メニュー]![GPATH] 読み込まれたフォームから、Me![F_GFILENAME] と探すことも出来ます(これは、また補足で発行数稼ぐのでその時にでも) Private Sub Form_Current() Dim strFNAME As String '画像ファイル名 'ファイル名フルパスを作成 strFNAME = Forms![メニュー]![GPATH] & Me![F_GFILENAME] End Sub ファイル名が作成できたら、何しよう? あっ、そのファイルが存在するか、いつものDir関数でチェックかな。 その後、.Picture にセットかな。 Private Sub Form_Current() Dim strFNAME As String '画像ファイル名 'ファイル名入力済みかチェック(新規、未入力、クリアを考慮する) If Len(Me![F_GFILENAME] & "") = 0 Then Me![画像].Picture = "" Exit Sub 'ここから後ろは処理しないので抜ける End If 'ファイル名フルパスを作成 strFNAME = Forms![メニュー]![GPATH] & Me![F_GFILENAME] 'ファイルの存在をチェックする If Dir(strFNAME) = "" Then Me![画像].Picture = "" 'ファイルが見つからないので画像は無しにする Else Me![画像].Picture = strFNAME '画像ファイル名をセットする End If End Sub 同じのコピーして、テキストボックスの更新後にも入れてと、 Private Sub F_GFILENAME_AfterUpdate() Dim strFNAME As String '画像ファイル名 Me![F_GFILENAME] = Trim(Me![F_GFILENAME]) 'スペースを取り除く 'ファイル名入力済みかチェック(新規、未入力、クリアを考慮する) If Len(Me![F_GFILENAME] & "") = 0 Then Me![画像].Picture = "" Exit Sub 'ここから後ろは処理しないので抜ける End If 'ファイル名フルパスを作成 strFNAME = Forms![メニュー]![GPATH] & Me![F_GFILENAME] 'ファイルの存在をチェックする If Dir(strFNAME) = "" Then Me![画像].Picture = "" 'ファイルが見つからないので画像は無しにする MsgBox strFNAME & "は、見つかりません" Else Me![画像].Picture = strFNAME '画像ファイル名をセットする End If End Sub 違いは、入力したファイルが無い時は、メッセージを表示したぐらいかなぁ。 *レコード移動時に出ると、うざったいので。 Forms![メニュー]![GPATH] を 参照しているので、 テストの時、メニューが立ち上がってないとエラーが発生します。 マスター管理は違う方法のほうがいいのかも。 これも別の機会に。 /* * 5.おわりの挨拶 */ 今回は、 ・Accessフォームをウィザードで作る ・.Pictureで画像の管理 でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba041.lzh に db041.mdb(Access97で作成)が保存されています。 .jpgや.bmpを指定して、遊んでみてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]