1.1 アニメーションさせるには
イメージコントロール
を使ってフォーム上に配置した画像をアニメーション表示したい思ったことはありませんか?ちなみに、ここで言うアニメーションとは、ドラえもんやサザエさんのことではなく、右の図のように絵を連続で切り替えて、画が動いているように見せることを言います。
もし、何らかの理由で
イメージコントロールに表示している画を素早く切り替えたい
ときは、表示されている画のデータ(コントロールが読み込んだデータ)を扱うためのプロパティ「
PictureData
」を使って画像の切り替えを行いましょう。
※
こちらのサンプルファイル
もご利用ください。MDBファイルと画像ファイルが含まれています。
アニメーションさせる他の方法
アニメーションさせる(画像を連続で切り替える)方法には、「あらかじめ画像の種類だけイメージコントロールを配置し、Visibleプロパティを使って表示・非表示を切り替える」方法や、「Pictureプロパティを使って、イメージコントロールに表示している画像を切り替える」といった方法があります。
しかし、コントロールをたくさん配置するとmdbファイルが重くなったり、Visibleプロパティといえども数が増えるとそれだけ処理効率が落ちたりします。また、Pictureプロパティを切り替える方法では、配置するイメージコントロールの数は少なくて済みますが、画像ファイルを毎回ディスクから読み込むため処理効率が良いわけがありません。
とにかく、どちらにも共通して言えることは
画像の切り替えが遅い
という点です。ただし、これらの方法が悪いというわけではありません。高速で画像を切り替えたいなら、
PictureData
プロパティを使う方法が最も効率がよいというだけで、どの方法を選択するかは
どんな状況で使用するか
によります。
基本1/画像データを変数に保存する
アニメーションさせるには、最初に使用する全ての画像データを準備(読み込み)しておかなくてはなりません。また、その画像データは変数へ保存しておきます。
まずは、使用する変数のデータ型と形式です。画像データは
PictureData
プロパティから取得しますが、このプロパティから取得したデータは
バイナリ形式
です。というわけで、変数には
Byte
型(1バイトの情報を保存できる型)の変数を使用します。また、画像はたくさんの情報が集まって一つの絵になっています。そのため、画像データを保存する変数は
Byte
型かつ
配列の変数
にしておきます。このとき、画像の大きさはに関わらずデータを保存できるように、変数の宣言時に
配列の要素数は指定しません
。
変数を準備したら、
PictureData
から次のように画像データを保存します。この例では、最初に保存する画像を読み込み(
Picture
プロパティへ画像ファイルのパスとファイル名を設定)した後、
PictureData
から画像データを変数に取り込んでいます。もちろん、事前にカラのイメージコントロールをフォーム上に配置しておきましょう。
Option Compare Database
Option Explicit
'変数の準備(Byte型で配列、ただし要素数は未指定)
Dim
bytPictData
() As Byte
Private Sub コマンド1_Click()
'イメージコントロールに画像を設定
'画像はMDBファイルと同じフォルダに配置
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict01.bmp"
'設定した画像データを変数へ取り込み
bytPictData
= Me.イメージ1.
PictureData
End Sub
※このコードは、ボタンのクリックイベントへ記述した例です
基本2/画像データを番号指定で扱えるようにする
「基本1/画像データを変数に保存する」のコードを実行すると、変数
bytPictData
に画像データが保存されますが、実はこのままではとても扱いにくいのです。というのも、アニメーションさせるときは複数の画像を使い、さらにそれらの画像(画像データ)を1番目の画像、2番目の画像…のように、
番号で指定
できたほうが便利だからです。
画像を番号で指定
するときは、
配列の変数を使って要素数を指定する方法
が思い浮かびますが、変数
bytPictData
は既に配列で、なにより
Byte
型という各要素に1バイトしか保存できない変数です。しかし、どうしても画像を番号で指定できるようにしたいのです。そこで、
bytPictData
を構造体の中へ入れてしまいます。もちろん、
画像データを保存する変数の型には構造体を指定
し、さらに配列にして
要素数は扱う画像の数
を指定します。
次の例では、構造体を使って4種類の画像を番号で指定できるようにしています。ちなみに、実際に画像データが保存されるのは、構造体のメンバ
PictData
の中です。
Option Compare Database
Option Explicit
'画像データを保存するための構造体
Private Type
PictData
Data
() As Byte
'←実際に画像データを保存する場所はココ
End Type
'変数の型には構造体、配列の要素数は扱う画像の数
Dim typPictData(1 To 4) As
PictData
Private Sub コマンド1_Click()
'1番目の画像を変数へ保存
'画像はMDBファイルと同じフォルダに配置(以下同じ)
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict01.bmp"
typPictData(
1
).
Data
= Me.イメージ1.PictureData
'2番目の画像を変数へ保存
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict02.bmp"
typPictData(
2
).
Data
= Me.イメージ1.PictureData
'3番目の画像を変数へ保存
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict03.bmp"
typPictData(
3
).
Data
= Me.イメージ1.PictureData
'4番目の画像を変数へ保存
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict04.bmp"
typPictData(
4
).
Data
= Me.イメージ1.PictureData
End Sub
※このコードは、ボタンのクリックイベントへ記述した例です
アニメーションさせてみよう
画像データを変数に保存したら、あとはデタラメな間隔なり、一定間隔なりで
PictureData
プロパティへ必要な画像データを設定すればOKです。ただし、このときにフォームの再表示を行うのを忘れないで下さい。フォームの再表示をするには、
DoEvents
で溜まったイベントを実行するか、フォームの
Repaint
メソッドを実行する方法があります。フォームの書き換えだけを行いたいのであれば、
Refresh
メソッドを使う方が高速です。
次の例では、フォーム上のボタンを押したときに、画像を変数へ保存し、その後10秒間アニメーションさせています。
ちなみに、一定間隔で画像の切り替え(アニメーション)るには
タイマーイベント
を使うと簡単ですが、ここではあえて使っていません。タイマーイベントと似た処理を強引に行っています。というのも、ゲームなんかを造るときは便利なんですよ、こっちの方法が…(爆)
Option Compare Database
Option Explicit
'画像データを保存するための構造体
Private Type
PictData
Data
() As Byte
'←実際に画像データを保存する場所はココ
End Type
'変数の型には構造体、配列の要素数は扱う画像の数
Dim typPictData(1 To 4) As
PictData
Private Sub コマンド1_Click()
Dim lngBeforeTime As Long
'処理時刻の保存用
Dim lngCount As Long
'処理回数制御用
Dim i As Long
'画像番号制御用
'1番目の画像を変数へ保存
'画像はMDBファイルと同じフォルダに配置(以下同じ)
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict01.bmp"
typPictData(
1
).
Data
= Me.イメージ1.PictureData
'2番目の画像を変数へ保存
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict02.bmp"
typPictData(
2
).
Data
= Me.イメージ1.PictureData
'3番目の画像を変数へ保存
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict03.bmp"
typPictData(
3
).
Data
= Me.イメージ1.PictureData
'4番目の画像を変数へ保存
Me.イメージ1.Picture = Application.CurrentProject.Path & "\pict04.bmp"
typPictData(
4
).
Data
= Me.イメージ1.PictureData
i = 1
lngCount = 0
lngBeforeTime = 0
'lngCountは1/100毎に1ずつカウントアップするため100が約10秒
Do Until lngCount = 100
'前回処理を行ったときから1/10秒経過したら処理を行う
If GetTickCount - lngBeforeTime >= 100 Then
Me.イメージ1.PictureData = typPictData(i).Data
Me.Repaint
'画像番号の更新。4を超えたら1から
i = i + 1
If i > 4 Then
i = 1
End If
'回数の更新
lngCount = lngCount + 1
'処理時刻の保存
lngBeforeTime = GetTickCount()
End If
Loop
End Sub
※エクセルスマイルの「
5.1 速度調整
」もどうぞ。速度調節の理屈が書いてあります。
Access VBA Tips+α
コントロール活用編/パート1
◆テキストボックスを活用する
カーソルの位置を調べる・任意の位置に移動する/SelStart
テキストの任意の部分を選択する・字数を調べる
/SelLength
入力中のテキストを参照する・テキストを編集する/Text
入力内容をハイパーリンク化する/IsHyperLink
◆コンボ/リストボックスを活用する
コンボボックスをドロップダウン表示する/DropDown
選択項目が何個あるかを求める/ListCount
何番目の項目が選択されているかを求める/ListIndex
コンボ/リストボックスの任意の行や列を参照する/Column
連結列の指定した行の値を求める/ItemData
リストボックスで選択した複数のデータを扱う
/ItemsSelected
指定した行が選択されているかを調べる/選択する
/Selected
コンボ/リストボックスを最新の状態に更新する/Requery
値のリストに新しい項目を追加する/AddItem
値のリストの項目を削除する/RemoveItem
レコードセットを使って値のリストを作成する/Recordset
コンボ/リストボックスの基データを設定する/RowSource
コンボ/リストボックスの基データの種類を設定する
/RowSourceType
◆その他
画像をアニメーションさせるには
■DAOデータアクセス編
■ADOデータアクセス編
■クエリー(SQL)編
■フォーム・サブフォーム編
■レポート編
■Printerオブジェクト編
■コントロール基本編
■テキスト/コンボ/リストボックス活用編
■メニューバー・ツールバー編
■マクロ(DoCmd)編
■複数値と添付ファイル編
■Accessの操作と便利な機能編
■プログラミングサンプル編
■番外編1.HTTPやFTPを使うには
■サイト内を検索
Happy! Happy! Islandその他のコンテンツ
■
VBAプログラミング系
Access VBAのTipsとサンプル
Excel VBA(エクセルマクロ)のTipsとサンプル
VBScript/JScriptのTipsとサンプル
プログラミング基礎・入門
■
入門と使い方
Access入門と使い方講座97~2003/2007/2010/2013
Access VBAプログラミング入門 2013/2010/2007/2003
Excel入門と使い方講座2013/2010/2007
■
ダウンロードコーナー
AccessとExcelのフリーソフト
■
その他
質問受け付けコーナー「管理人に聞いてみよう♪」
BBS過去ログ広場
HTMLの書き方
管理人プロフィール
┗
twitter(外部サイト)
管理人へメール
■
別館(海外向けサイト)
Excel Games and Access Games
VBAプログラミング&Tips集の
"Happy! Happy! Island"トップページへ
[PR]管理人が心を込めて書いた本
■
最速攻略 AccessVBAサンプル大全集
Access 2013/2010/2007対応版
■
速効!ビジネスPC Accessマクロ&VBA
Access2013/2010/2007対応
■
最速攻略Accessクエリ テクニック大全集
Access2013/2010/2007対応
■
AccessVBAマクロ超入門講座 Access2010/2007対応
■
ExcelVBA超入門講座 Excel2010/2007対応
■
ExcelVBAでできる RPGゲーム作成入門
■
[改訂新版]実践COBOLプログラミング入門
■
最速攻略 VBScriptサンプル大全集
Windows7/Vista/XP/2000対応
(
アマゾン
へジャンプします)
[PR]注目の情報
転職成功の秘訣はサイトに公開されない求人にあった
採用人数が少ない・専門性が高い・競合他社に知られたくないなど、魅力的な求人情報ほど一般には公開できないのです。
株デビューするなら SBI証券!
業界屈指の格安手数料と業界最高水準のサービスで口座数はネット証券 No.1!口座開設料・管理料は無料。
GDOゴルフショップ
ゴルフ用品のオンラインメガストア。品揃え10万点!
アスタリフトコラーゲンドリンク
毎日続けるものだから・・まとめ買いで最大10%OFF!集中コラーゲンケアで、ハリと潤いの溢れる毎日へ。
[リンク]IT関連情報サイトなど
gihyo.jp
技術評論社提供のIT関連コンテンツサイト
Copyright(C) 1999-2015
結城圭介
(Ver.3.51) All rights reserved