Microsoft Access2003

Page 3 (2005/01)

Page1で作ったフォームを改良
最初に作ったフォーム frmDVD は、データの表示、修正、新規登録ができるのですが、登録されたデータの数が増えてくると、特定のデータを探すのが面倒になって来ます。データの入力が問題なくできるようになったので、今度はデータの検索です。
改めて検索のためのフォームを作るまでもないので、最初のフォームのなかに検索操作をするコントロールを追加しました。
左の図がそれですが、データの表示部は折り畳んであります。元のフォームの一番下に追加しただけです。
あまり意味のないことですけど、フォーム・フッターの部分に追加してみました。

最初は検索ボタンを作ったのですが、検索用のコンボボックスに値を入れると自動的にデータを検索するようにしました。
検索といっても、目的のデータは複数になるので、フォームにフィルターをかけるだけですが。
そのため、最初に作った登録ボタンを「フィルター解除」ボタンに変更しました。
監督名検索と出演者検索のふたつのコンボボックスは、上にあるコンボボックスをコピーしてから、テーブルへの連結を外した非連結コントロールです。
出演者はフィールド「出演者1」から「出演者5」までのどのフィールドに登録されていても検索できるようにしました。
監督名と出演者名の両方で検索はしないと思うので対応は止めました。追加したコードは下の通りです。
Private Sub cbo監督名検索_AfterUpdate()
  If Not IsNull(cbo監督名検索) Then
    Me.Filter = "[監督名]=" & cbo監督名検索
    Me.FilterOn = True
  End If
End Sub

Private Sub cbo出演者検索_AfterUpdate()
  If Not IsNull(cbo出演者検索) Then
    Me.Filter = "[出演者1]=" & cbo出演者検索 & " or [出演者2]=" & cbo出演者検索 & _
    " or [出演者3]=" & cbo出演者検索 & " or [出演者4]=" & cbo出演者検索 & " or [出演者5]=" & cbo出演者検索
    Me.FilterOn = True
  End If
End Sub

Private Sub cmdフィルタ解除_Click()
  If Me.FilterOn = True Then
    Me.FilterOn = False
    cbo監督名検索 = Null
    cbo出演者検索 = Null
    MsgBox "フィルターを解除しました"
  End If
End Sub
二つのコンボボックスのAfterUpdataイベントのなかで、フォームのFilterプロパティに検索条件の文字列をセットしてからFilterOnプロパティをTrueにするというだけの処理です。
フィルターを解除するボタンこの逆の処理です。
Filterプロパティにセットする値は文字列。今回のケースの場合、監督名も出演者名も表示されるのはテキストですが、実際にコントロールに入る値はオートナンバー型の数値ですから、これの扱いには注意が必要です。

例えば、cbo監督名検索で選択した監督名IDが 15 とすると、Me.Filterに入る値は "[監督名] = 15" という文字列になります。
検索するフィールドが数値型ではなく、文字型の場合の条件式は以下のようになります。

Me.Filter = "[監督名]=' " & cbo監督名検索 & "' "

監督名IDフィールドが文字型とすると、検索する監督名IDの値は "15" と仮定すると、Filterの値は "[監督名] = '15' " という具合になります。
( コードのなかの & は連結記号です)。値が文字列の場合は「'」で囲んで文字列であることを明示しなければなりません。
ハイパーリンク・フィールド
今回、映画のデータを入力するのにAllCinema online というホームページのデータを参照しました。
で・・・、思い立ってテーブルに「ハイパーリンク型」のフィールドを追加しました。いままで何に使うのか分からなかったのですが、この際使ってみようかな?という好奇心だけでフィールドを追加しました。表示項目が増えてきたのでフォームの幅も広げました。

URLは該当ページを表示してURLをコピー&ペーストするだけです。これだけでallcinema_URLのコントロールをクリックするだけでページへジャンプできます。
さっそく新規登録フォームfrmNewDataにもコントロールを追加したのですが、こちらから入力すると、見た目にはちゃんとURLが入っているのですが、クリックしてもジャンプしません。
こちらのフォームはテーブルにリンクしていないので、入力するコントロールはテキスト・コントロールです。
つまり、URLは単なるテキストとしてハイパーリンク型フィールドに入力されるだけで、リンクはしていない・・ということでした。

さらに調べてみると、テキスト・コントロールのプロバティのなかには、「IsHyperlink/ハイパーリンクあり」 プロパティというのがあるのでした。
これは値がTrue/FalseのBoolean型。デフォルト値はFalse。
この値をTrueにすることで多分解決するのでは・・・と(。。;)ゞ思ったのだけど、これが甘かった。
これは連結コントロールでないとダメという記述を見つけたのだけど、連結コントロールでこの値をどちらにしても変わりはないのでした。
意味の分からないプロパティ。
いずれにしても、非連結のテキストボックスに入力したURLをハイパーリンク型フィールドに代入してもリンクが成立しない原因を見つけるのにはしばらく時間がかかりそうです。

その後、いろいろ調べたり試してみたりした結果、URLを書き込んだテキストボックスの値をフィールドに代入するときに、頭に "#" を付け加えてみたところ、目的通りリンクするようになりました。これはたぶんどの解説書にも書かれていないかも。

!allcinema_URL = "#" & txtAllCinema_URL

あまり使うものではないけど、これで一件落着です。
このハイパーリンクはwwwへのリンクだけではなく、他のソフト、実行中のAccessアプリの他のオブジェクトへのリンクなどもできるらしいので、高度な使い道であるとは言えそうです。
リンクされたウェブページへのジャンプはテキストボックスのなかのURLをクリックすればいい訳ですが、ボタンでジャンプするには・・とやってみました。
コマンドボタンやイメージ・コントロールなどにはHyperlinkAddress /ハイパーリンクアドレス というプロパティがあります。
ここに文字列としてのURLを代入すればいいわけですが、ハイパーリンク型のフィールドに入っている値は "#"記号で挟んであるのでこのままだと機能しないので、先頭の#だけを取り除くと問題なく動作しました。

Private Sub Form_Current()
   Me.cmdhyperlink.HyperlinkAddress = Mid(allcinema_URL, 2)
End Sub

フォームのレコードをスキップする度にURLをボタンにリンクさせるために Current イベントに1行追加するだけです。先頭の一字を取り除くためにMid()関数を使いました。URLに値がないときはボタンを使用不可にしてしまう・・のもいいかもしれませんね。
ラベル・コントロールにもこのHyperlinkAddressプロパティはあるということですが、上の図のようなテキストコントロールに付属するラベルではなく、単独で作成したラベルだけのようです。
画像データも使ってみる
DVDのライブラリデータとしては画像はさほど必要ではないけど、今まで扱ったことのないフィールド形式も試してみようということで、メモ型フィールドの「コメント」とイメージ・コントロールを追加してみました。
またフォームが煩雑になって来ましたが、いずれ整理します。

画像データはこのフォームよりはむしろ俳優名のフォームに使った方がいいかも。
今のところ、データを直接テーブルに書き込んで、レコードを移動する度に画像が切り替わるのを確認しただけで、データの登録部はまだこれからです。
画像の扱いですが、mdbのなかに画像データを取り込んでしまう方法と、外部に置いた画像ファイルへリンクさせで表示する方法とあるようですが、このケースでは後者でやってみました。
そのため、新しく追加したフィールドはテキスト型で画像のファイル名が格納されているだけです。

フィールド名は「image」、フォームに追加したイメージ・コントロールの名前は自動的に付けられた「イメージ31」です。
コードはレコードを移動するたびに発生するCurrentに以下のように追加しました。
これはサンプルデータ、NorthWind.mdbを参考にして簡略化しただけのものです。

Private Sub Form_Current()
'all_cinema_URLにデータが入っているときはボタンを有効にして、アドレスの値をボタンに設定する
  Dim strPATH As String       '画像ファイルの保存されているパスを受け取るための文字型変数の宣言と値の代入です
  strPATH = CurrentProject.Path  'CurrentProject.Pathが値を返します。
  
  If IsNull(allcinema_URL) Then   'ボタンを有効にしたり無効にしたりする処理
    Me.cmdhyperlink.Enabled = False
  Else
    Me.cmdhyperlink.Enabled = True
    Me.cmdhyperlink.HyperlinkAddress = Mid(allcinema_URL, 2)   'この部分はボタンへURLを設定しています。
  End If
  '画像を表示させる
  If IsNull(Me![Image]) Then
     Me.イメージ31.Picture = ""   '画像が登録されていないレコードのめにこの処理は必要
  Else
    Me.イメージ31.Picture = strPATH & "\" & Me![Image]   'ここでファイル名とフルパス名を連結してPictureプロパティに値をセットしています。
  End If
End Sub


Page Topへ戻る