C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: c# フォームアプリケーションでの画像の連続表示


(過去ログ 107 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■63648 / inTopicNo.1)  c# フォームアプリケーションでの画像の連続表示
  
□投稿者/ poigumi (1回)-(2012/09/21(Fri) 20:13:03)

分類:[.NET 全般] 

Microsoft visual studio 2010のC#のWindowsフォームアプリケーションであるフォルダ内の画像を1秒ごとに一つのPictureBoxに表示するプログラムを作りたいのですが、上手く行きません。下にソースコードを書きます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;


namespace 表示
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private string[] s = new string[1000];

        private void button1_Click(object sender, EventArgs e)
        {
            
            string[] files = System.IO.Directory.GetFiles(@"C:\Users\Ryouhei\Pictures\新しいフォルダー", "*.jpg", System.IO.SearchOption.AllDirectories);

            listBox1.Items.AddRange(files);

            int _Count = listBox1.Items.Count;
            textBox1.Text = _Count.ToString();

            for (int i = 0; i < _Count; i++)
            {
                s[i] = listBox1.Items[i].ToString();
            }

            for (int i = 0; i < _Count; i++)
            {
                pictureBox1.Refresh();
                pictureBox1.ImageLocation =s[i];
                Thread.Sleep(1000);
            }
        }
    }
}

この状態でデバックするとフォルダ内の画像が10枚だとだいたい10秒後にlistBoxにフォルダ内のjpgのファイルのアドレス、textBoxにファイルの数、PictureBoxに一番最後の画像が表示されるという状態になってしまいます。どう改善すればいいか教えて下さい。

引用返信 編集キー/
■63649 / inTopicNo.2)  Re[1]: c# フォームアプリケーションでの画像の連続表示
□投稿者/ ズッカ (1回)-(2012/09/21(Fri) 20:27:33)
System.Windows.Forms.Timerを使ってはどうでしょう。
TimerのIntervalを1000ミリ秒にして、TickイベントでpictureBox1に画像をセットし、カウントを行い、
規定回数になったらTimerをStop()すればいいでしょう。

なお、UIスレッドでThread.Sleepを行うのは意味がありません。
スレッドが停止してしまうのですが、その間スレッドはビジー状態となります。
UIスレッドでのThread.Sleepの弊害については、ググればたくさんヒットするでしょう。

引用返信 編集キー/
■63650 / inTopicNo.3)  Re[2]: c# フォームアプリケーションでの画像の連続表示
□投稿者/ poigumi (2回)-(2012/09/21(Fri) 20:37:12)
No63649 (ズッカ さん) に返信
> System.Windows.Forms.Timerを使ってはどうでしょう。
> TimerのIntervalを1000ミリ秒にして、TickイベントでpictureBox1に画像をセットし、カウントを行い、
> 規定回数になったらTimerをStop()すればいいでしょう。
> 
> なお、UIスレッドでThread.Sleepを行うのは意味がありません。
> スレッドが停止してしまうのですが、その間スレッドはビジー状態となります。
> UIスレッドでのThread.Sleepの弊害については、ググればたくさんヒットするでしょう。
> 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 表示
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private string[] s = new string[1000];

        private void button1_Click(object sender, EventArgs e)
        {
            string[] files = System.IO.Directory.GetFiles(@"C:\Users\Ryouhei\Pictures\新しいフォルダー", "*.jpg", System.IO.SearchOption.AllDirectories);

            listBox1.Items.AddRange(files);

            int _Count = listBox1.Items.Count;
            textBox1.Text = _Count.ToString();

            for (int i = 0; i < _Count; i++)
            {
                s[i] = listBox1.Items[i].ToString();
            }

            for (int i = 0; i < _Count; i++)
            {
                pictureBox1.Refresh();
                pictureBox1.ImageLocation =s[i];
                timer1.Start();
            }
        }
  
        private void timer1_Tick(object sender, EventArgs e)
        {   
           
        }

    }
}

timerののIntervalを1000ミリ秒にしてみたのですが、これだとすぐ最後の画像が表示されてしまいました。自分が勉強不足だとは分かっているのですが、よくわからないのでソースコードを書いていただけないでしょうか?よろしくお願いします。

引用返信 編集キー/
■63651 / inTopicNo.4)  Re[3]: c# フォームアプリケーションでの画像の連続表示
□投稿者/ 魔界の仮面弁士 (60回)-(2012/09/21(Fri) 21:26:39)
No63650 (poigumi さん) に返信
> timerののIntervalを1000ミリ秒にしてみたのですが、これだとすぐ最後の画像が表示されてしまいました。
そもそも、ループ処理は使いません。

timer1.Start(); を一回呼べば、その後、1000 ミリ秒ごとに
>         private void timer1_Tick(object sender, EventArgs e)
>         {   
>            
>         }
のイベントが定期的に呼び出されますので、そこで画像を一つだけ表示させます。

1 回目に呼ばれた Tick イベントでは、1つ目の画像を。
2 回目に呼ばれた Tick イベントでは、2つ目の画像を。
n 回目に呼ばれた Tick イベントでは、nつ目の画像を。

最後の画像まで表示した時に、1つ目の画像を表示するのか、
それとも timer1.Stop(); で止めてしまうのかはお好みで。


> よくわからないのでソースコードを書いていただけないでしょうか?

using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string[] files = { };
        private int fileIndex = -1;

        private void button1_Click(object sender, EventArgs e)
        {
            string picPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
            files = Directory.GetFiles(picPath, "*.jpg", SearchOption.AllDirectories);

            listBox1.DataSource = files.Select(f => Path.GetFileName(f)).ToArray();

            if (files.Length == 0)
            {
                fileIndex = -1;
                MessageBox.Show("ファイルがありません。", "",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                fileIndex = 0;
                timer1.Interval = 1000;
                timer1.Start();
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (fileIndex >= files.Length)
            {
                timer1.Stop();
            }
            else
            {
                listBox1.SelectedIndex = fileIndex;

                pictureBox1.LoadAsync(files[fileIndex]);
                fileIndex++;
            }
        }
    }
}

引用返信 編集キー/
■63652 / inTopicNo.5)  Re[4]: c# フォームアプリケーションでの画像の連続表示
□投稿者/ poigumi (3回)-(2012/09/21(Fri) 21:31:26)
No63651 (魔界の仮面弁士 さん) に返信
ありがとうございました。本当に色々と教えていただき大変助かりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -