PDA

View Full Version : چطوري بايد يك كوئري را به اين صورت با كمك timer اجرا كنم



csharpprogramer88
شنبه 25 اردیبهشت 1389, 12:52 عصر
سلام به همه دوستان
من با دستور زير يك كوئري نوشتم كه با اون تعدادي ركورد را برمي گردونم و با ديتاريدر هر سطر را كه محتويات اون تصوير است را بر مي گردونم حالا سوال اينجاست كه من ميخوام برنامه طوري باشه كه هر ركود به مدت 10 يا 15 ثانيه به نمايش در بياد بعد از 10 ثانيه ركورد بعدي بياد و الي آخر . در برنامه از تايمر استفاده كردم و خاصيت interval آنرا برابر با 10000 قرار دادم برنامه اجرا ميشه ولي تمام تصاويري كه ديتاريدر برمي گردونه پشت هم بدون اينكه مكثي داشته باشد اجرا مي شود و تنها بعد از آخرين تصوير مكث 10 ثانيه انجام ميشود .
حالا بايد چيكار كنم تا هر تصوير بمدت 10 ثانيه نمايش داده شود.


private void timer1_Tick_1(object sender, EventArgs e)
{
for (int k = 0; k <= j - 1; k++)
{
cmd = new SqlCommand("select pic from pic where (id='" + arrpic[k].ToString() + "')", con);
if (con.State == ConnectionState.Closed)
{ con.Open(); }
dr = cmd.ExecuteReader();
int m = 0;
while (dr.Read())
{
m++;
this.pictureBox1.Refresh();
byte[] dss = (byte[])dr["pic"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
pictureBox1.Image = image;
System.Threading.Thread.Sleep(1000);

}
con.Close();
}


دوستان لصفا جواب بديد
با تشكر

M.YasPro
شنبه 25 اردیبهشت 1389, 13:00 عصر
سلام
شما بعد از استخراج عکس ها ، اونها رو توی یه لیست یا ... بریز و بعد شروع به slide show کن .
موفق باشید ./

Yasersadegh
شنبه 25 اردیبهشت 1389, 13:03 عصر
سلام دوست عزیز
در کدی که نوشتید مشکلی که وجود داره اینه که حلقه for نباید داخل این رویداد قرار بگیره!:اشتباه: یعنی اینکه شما باید متغیر K رو در رویداد load فرمتون مقدار دهی کنید یعنی k=0. بعد ابتدای رویداد تایمر با یه if شرط حلقه for رو بررسی کنید. اگه درست بود انجام بده و یکی به k اضافه کنه و اگه غلط بود تایمر رو غیر فعال کنه!



private void timer1_Tick_1(object sender, EventArgs e)
{
if( k <= j - 1)
{
cmd = new SqlCommand("select pic from pic where (id='" + arrpic[k].ToString() + "')", con);
if (con.State == ConnectionState.Closed)
{ con.Open(); }
dr = cmd.ExecuteReader();
int m = 0;
while (dr.Read())
{
m++;
this.pictureBox1.Refresh();
byte[] dss = (byte[])dr["pic"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
pictureBox1.Image = image;
System.Threading.Thread.Sleep(1000);

}
con.Close();
k++;
}
else
{
timer1.Enabled=false;
}
}


اینکار رو انجام بدید، به احتمال خیلی زیاد کاری که می خواهید انجام میشه!:متفکر:
موفق باشید:چشمک:

csharpprogramer88
شنبه 25 اردیبهشت 1389, 14:08 عصر
سلام دوست عزیز
در کدی که نوشتید مشکلی که وجود داره اینه که حلقه for نباید داخل این رویداد قرار بگیره!:اشتباه: یعنی اینکه شما باید متغیر K رو در رویداد load فرمتون مقدار دهی کنید یعنی k=0. بعد ابتدای رویداد تایمر با یه if شرط حلقه for رو بررسی کنید. اگه درست بود انجام بده و یکی به k اضافه کنه و اگه غلط بود تایمر رو غیر فعال کنه!


اینکار رو انجام بدید، به احتمال خیلی زیاد کاری که می خواهید انجام میشه!:متفکر:
موفق باشید:چشمک:

[/LEFT]

دوست من تشكر جواب دادي ولي خيلي گنگه برام و حدسم اينه كه جواب نده . اين امكان وجود داره كه پس از اينكه اولين ركورد را از ديتاريدر بازگشت داده شد به مدت ده ثانيه برنامه توقف كند و دوباره سطر بعد

csharpprogramer88
شنبه 25 اردیبهشت 1389, 22:02 عصر
دوستان يكي كمك كنه چون بدجوري توش موندم هركاري ميكنم به نتيجه مي رسم كه ديتاريدر تمام اطلاعات خودشو چاپ ميكنه

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 08:39 صبح
عزيزن چطوري بايد خود تصوير را با دستور سلكت از بانك بخونم و نتيجه حاصل را در آرايه بريزم

M.YasPro
یک شنبه 26 اردیبهشت 1389, 08:56 صبح
شما اشتباهت اینجاست که فرایند استخراج از دیتابیس رو با نمایش عکسهات قاطی می کنی .
شما باید ابتدا طی یک پروسه جدا عکس هات رو استخراج کنی ، بعد از استخراج عکس ها حالا شروع کنی به timer گذاشتن و عکس هات رو دونه دونه نمایش بدی .
برای نگهداشتن عکس هات می توننی از جنریک لیست ها استفاده کنی


List<Bitmap> imagelist=new List<Bitmaop>();

به جای اینکه توی while به pictuebox یه bitmap بدی :


listimage.Add(image )


بعد از تمام شدن اینا بیا توی یه تایمر دونه دونه نمایش بده .
سوالی بود مطرح کن .
موفق باشید ./

Yasersadegh
یک شنبه 26 اردیبهشت 1389, 09:11 صبح
سلام خدمت دوستان
دوست عزیز یه برنامه تستی برایه اینکه این کارو بکنه با دیتابیس اکسس نوشتم که اسامی رو میاره. شما اینو دانلود کن و تغییر بده تا عکس های دیتابیست رو نمایش بده!
امیدوارم مشکلت حل بشه:متفکر:
موفق باشید:چشمک:

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 09:29 صبح
شما اشتباهت اینجاست که فرایند استخراج از دیتابیس رو با نمایش عکسهات قاطی می کنی .
شما باید ابتدا طی یک پروسه جدا عکس هات رو استخراج کنی ، بعد از استخراج عکس ها حالا شروع کنی به timer گذاشتن و عکس هات رو دونه دونه نمایش بدی .
برای نگهداشتن عکس هات می توننی از جنریک لیست ها استفاده کنی


List<Bitmap> imagelist=new List<Bitmaop>();

به جای اینکه توی while به pictuebox یه bitmap بدی :


listimage.Add(image )


بعد از تمام شدن اینا بیا توی یه تایمر دونه دونه نمایش بده .
سوالی بود مطرح کن .
موفق باشید ./



List<Bitmap> imageList = new List<Bitmap>();

for (int k = 0; k <= j - 1; k++)
{
cmd = new SqlCommand("select pic from pic where (id='" + arrpic[k].ToString() + "')", con);
if (con.State == ConnectionState.Closed)
{ con.Open(); }
dr = cmd.ExecuteReader();
int m = 0;
while (dr.Read())
{
imageList.Add(dr["pic"].ToString());
}
con.Close();
}

دوست من چيزي كه گفتيد را بصورت بالا استفاده كردم ولي يك جاي كار ايراد داره يك بررسي بفرماييد لطفا

اروري را هم كه صادر شده اينه كه موقع اجرا برنامه مي گيره

M.YasPro
یک شنبه 26 اردیبهشت 1389, 09:33 صبح
داخل loop رو به این صورت تغییر بده


byte[] dss = (byte[])dr["pic"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
imagelist.Add(image);

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 10:17 صبح
داخل loop رو به این صورت تغییر بده


byte[] dss = (byte[])dr["pic"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
imagelist.Add(image);


دوست من اين مشكل برطرف شد ولي در تايمر با كد :


listimage.Add(image )

فراخواني مي كنم كه ارور ميده

M.YasPro
یک شنبه 26 اردیبهشت 1389, 10:24 صبح
خوب شما listImage رو توی اون تابع ندارید .
این متغیر رو به عنوان پارامتر به تابعی که قراره عکس هارو نشون بده بفرستید .


private void SlideShow(List<Bitmap> list)
{
//your codes
}

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 10:36 صبح
خوب شما listImage رو توی اون تابع ندارید .
این متغیر رو به عنوان پارامتر به تابعی که قراره عکس هارو نشون بده بفرستید .


private void SlideShow(List<Bitmap> list)
{
//your codes
}


دوست من خيلي شرمنده بازم برام گنگه و نميدونم چطوري بايد از اين قسمت استفاده كنم لطفا بيشتر توضيح بديد

M.YasPro
یک شنبه 26 اردیبهشت 1389, 10:45 صبح
به جای این کار شما listImage رو سراسری تعریف کن تا توی تابع تایمر قابل دسترس باشه .
در ضمن برای دسترسی به اعضای لیست باید از


listImage[index]

استفاده کنید.

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 11:02 صبح
به جای این کار شما listImage رو سراسری تعریف کن تا توی تابع تایمر قابل دسترس باشه .
در ضمن برای دسترسی به اعضای لیست باید از


listImage[index]

استفاده کنید.



public static List<Bitmap> imageList = new List<Bitmap>();
به اين صورت تعريف كردم نميدونم دسته يا نه
و اين شكلي در تايمر استفاده كردم ولي بازم ارور مي ده


imageList[1];

M.YasPro
یک شنبه 26 اردیبهشت 1389, 11:10 صبح
به این صورت بنویس:


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 WindowsFormsApplication1
{
public partial class Form2 : DevComponents.DotNetBar.Office2007Form
{
List<Bitmap> listImage = new List<Bitmap>();
public Form2()
{
InitializeComponent();
}
}
}


متن ارور رو هم بنویس

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 11:26 صبح
به این صورت بنویس:


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 WindowsFormsApplication1
{
public partial class Form2 : DevComponents.DotNetBar.Office2007Form
{
List<Bitmap> listImage = new List<Bitmap>();
public Form2()
{
InitializeComponent();
}
}
}


متن ارور رو هم بنویس

دوست من اونجايي كه گفتيد اضافه كردم و آخرين كد من اينه :


private void show_Load(object sender, EventArgs e)
{
for (int k = 0; k <= j - 1; k++)
{
cmd = new SqlCommand("select pic from pic where (id='" + arrpic[k].ToString() + "')", con);
if (con.State == ConnectionState.Closed)
{ con.Open(); }
dr = cmd.ExecuteReader();
int m = 0;
while (dr.Read())
{
byte[] dss = (byte[])dr["pic"];
MemoryStream stream = new MemoryStream(dss);
Bitmap image = new Bitmap(stream);
listImage.Add(image);

}
con.Close();
}

timer1.Enabled = true;
}

براي تايمر :


private void timer1_Tick_1(object sender, EventArgs e)
{
//for (int x = 0;x <= 4;x++)

//{
listImage.Add(listImage[i]);
// }
}
}

اروري نداره ولي خروجي نمي ده نمي دونم پاك گيج شدم كمكم كن

M.YasPro
یک شنبه 26 اردیبهشت 1389, 11:37 صبح
int current = 0;
private void timer1_Tick_1(object sender, EventArgs e)
{
//for (int x = 0;x <= 4;x++)

//{
pictureBox1.Image=listImage[current];
current++;

// }
}

csharpprogramer88
یک شنبه 26 اردیبهشت 1389, 11:54 صبح
int current = 0;
private void timer1_Tick_1(object sender, EventArgs e)
{
//for (int x = 0;x <= 4;x++)

//{
pictureBox1.Image=listImage[current];
current++;

// }
}


دوست من خيلي خيلي تشكر از زحمتي كه كشيدي تشكر از اينكه 2/5 از وقت گرانبهاي خودتو براي من گذاشتي مشكل من حل ولي يك سوال در مورد خود timer با توجه به اينكه تعداد عكس ها در هر سر متغيره يك دفعه ممكنه سه تا دفعه بعد 30 تا و ... چطوري ميتونم به تايمر بگم تازماني كه برنامه در حال اجراست تعداد عكس ها ي listImage را تكرار كنه يعني زماني كه به آخرين تصوير رسيد دوباره از اول شروع كنه

M.YasPro
یک شنبه 26 اردیبهشت 1389, 12:04 عصر
امتحان نکردم ولی فکر کنم جواب بده


int current = 0;
private void timer1_Tick_1(object sender, EventArgs e)
{
//for (int x = 0;x <= 4;x++)

//{
if (listImage.Count >= current)
{
pictureBox1.Image = listImage[current];
current++;
}
else
{
current = 0;
pictureBox1.Image = listImage[current];
}

// }
}


موفق باشید ./