Buildしたアプリケーションのファイルサイズが大きいことが気になっていましたが、Buildするとき、PPCモードでは圧縮のチェックが出来るようになりました、今までの60%くらいのサイズに出来るようです。
第14回 - フォルダー内にあるPICTファイルだけを読み込んで連続表示する -
前回のプログラムを使って一つのフォルダーに保存した複数のPICTファイルを、連続表示するものです。PICTファイルであれば、何で作ったものでも、アニメーションにしてしまいます。
前回の、プログラムでは、少し大き目の画像を計算し表示する為には相当に時間がかかり、イライラしました。そこで、暇なときに、画像を描いておき、PICTファイルにしたものを、必要なときに読み込んで、連続表示しようと思います。
連続表示させるための、もとの画像は、一つのフォルダーに入れておくと整理しやすいし、同じフォルダーに、条件を明記した説明書もつけると、あとから悩まずに済みます。そこで、プログラムの仕様としては、画像の入ったフォルダーを指定でき、その中のPICTファイルだけを全て連続表示できるようにします。
- - プログラムの手順 -
- Window1にフォルダー選択用のPushButton1、一時停止用のPushButton2、連続表示用のPushButton3、画像表示用のCanvas1、見かけを派手にするためのRectangle1、それと、画面を連続して描きなおすためのTimer1 を配置する。
- Window1:Events:Open には、Rectangle1の色を、Window1の色にそろえる命令と、Timer1を始め止めておく命令を、次のように書き込む。
rectangle1.fillcolor=backcolor timer1.mode=0- Window1:Events:Close には、ウィンドウの左上のチェックボックスをクリックしたとき、終了できるように、
quit
- グローバル変数(各コントロール間で使える変数)として、EditメニューのNewPropertyで、フォルダー内の全ファイル数を表すinteger型の「fcount」、フォルダー内のPICTファイルの数を表すinteger型の「pcount」、画像を連続表示するためのpicture型の配列「pic1(1)」(ここでの配列要素はとりあえず1にしておき、後から変更することにする)、folderitem型の「f」、さらにinteger型の「i」を宣言する。
- PushButton1 にフォルダーを選択して、フォルダー内の情報を読み込む、メインのプログラムを書き込む。
「f=SelectFolder」の部分が、フォルダー選択ダイアログを開いて、選択された、フォルダーの情報を「f」に代入する書式です。
この「f」はフォルダーの内部情報を集めたデータベースの名前とでも考えれば解りやすいと思います。フォルダー内の全ファイル数を知りたければ、「f.count」。フォルダー内の個々のファイル情報は「f.item( )」を先頭につけることで引き出せます。
「if f.item(n).mactype="PICT" then」の部分でフォルダー内にある、PICT形式のファイルをさがし出しています。
「f.item(n)」の「n」は、フォルダー内のファイル名の順番です。従って、表示されるファイルの順番は、ファイル名によって決まりますので、同一ファイル名で最後に数字を付けたものを用意すればその順番で表示することができます。
「Redim pic1(pcount)」の部分は、配列を再定義しています。これは、読み込むPICTファイルの数に合わせて配列の数を定義した方が、無駄な配列を作らずにすむからです。
「p=f.item(n).openaspicture」の部分は、PICT型のファイルを、プログラム内に、picture型の変数「p」として読み込んでいます。
「pic1(m)=newpicture(p.width,p.height,8)」の部分は、読み込んだ「p」のサイズと同じ領域を持つ、newpictureを定義しています。 「pic1(m)=f.item(n).openaspicture」の部分は、表示に使うための配列変数「pic( )」に、フォルダー内にある「f」、n番目のファイル「item(n)」の、PICT画像の情報「openaspicture」を代入しています。
選択したフォルダー内に、PICT形式のファイルが、1つもない場合の処理も必要です。
「pushbutton2.enabled=false」は表示ボタン類が機能しないようにするためのものです。
dim n,m as integer dim p as picture pcount=0 //pcountはPICTファイルの数。 f=SelectFolder //フォルダー選択ダイアログ内で //Cancelボタンが押されたときの処理。 if f=nil then return end if //fcountは全ファイル数。 fcount=f.count i=0 // i はtimer1内で使うカウンタ //ここで初期指定 for n =1 to fcount if f.item(n).mactype="PICT" then pcount=pcount+1 end if next if pcount<> 0then //PICTファイルの数だけNewPictureの配列を //宣言し直す。 Redim pic1(pcount) //配列 pic1( ) にPICTファイルの絵を //順番に代入。 m=1 for n =1 to fcount if f.item(n).mactype="PICT" then p=f.item(n).openaspicture //NewPictureのサイズを決めるために P に //予め読み込んでいる。 pic1(m)=newpicture(p.width,p.height,8) pic1(m)=f.item(n).openaspicture m=m+1 end if next pushbutton2.enabled=true pushbutton3.enabled=true MsgBox "このフォルダー内の ファイルの総数f.count= "+str(f.count)+chr(13)+"PICTファイルの数pcount= "+str(pcount)+chr(13)+"数が多いときはメモリーの割り当てを 多くして下さい。" else MsgBox "このフォルダーには PICTファイルは含まれていません。 フォルダーを選択し直して下さい。" //PICT形式のファイルがないときは、 //表示ボタン類が機能しないようにする。 pushbutton2.enabled=false pushbutton3.enabled=false end if
- Window1.Timer1.Action: は、「pic1( )」に読み込んだ、pictureを連続表示させる部分です。
「canvas1.graphics.drawpicture pic1(i),0,0,w,h,0,0,sw,sh」の命令は、表示させる元になる、「pic1( )」の必要な部分の領域(0,0,sw,sh)を指定すると、この部分を表示する領域(0,0,w,h)に合わせて、拡大縮小してくれます。
タイマー内での、カウントをとる変数「i」の初期化は、Timer1以外の場所でする必要がありますので、変数「i」は、グローバル変数とします。
dim w,h,sw,sh as integer w=canvas1.width h=canvas1.height i=i+1 sw=pic1(i).width sh=pic1(i).height //読み込んだPICTファイルの大きさを //Canvas1の大きさに拡大縮小してそろえる。 canvas1.graphics.drawpicture pic1(i),0,0,w,h,0,0,sw,sh // if i=pcount then //連続表示させています。 i=0 end if
- 以上のプログラムを「SelPicFile」としました。また、前回のプログラムを改造して、連続画像を自動的に、10枚のPICTファイルに書き出してしまうものを作りました。これで時間のかかる部分はあらかじめ、Macにまかせて、結果だけを使えるようになりました。これも、サンプルに付けました。
今回の「SelPicFile」と「干渉もよう連続保存」の ソースプログラムです
プロジェクトファイルのみです。REALbasicの最新バージョンが必要です。50 kバイト
ソースコードについての質問やご意見がありましたら以下のアドレスまでご連絡下さい。
koko-@mx2.tiki.ne.jp