PDA

View Full Version : اين شرط را چطور بنويسم



csharpprogramer88
شنبه 16 مرداد 1389, 17:37 عصر
سلام به دوستان
من با دستور زير تعدادي عكس را كه كيفيت اون بالاست را در بانك ذخيره كردم (خود عكس را نه آدرس آنرا ) را در يك ليست ريختم اين عكس حدود 300 تاست اگر همه اينها رو در ليست بريزم ممكنه در رم مشكل ايجاد كنه .
من چطوري ميتونم در 5 دقيقه اول مثلا 15 تصوير را نشان بدم و در 5 دقيقه ديگه 15 تصوير بعدي و همينطور تا به آخر البته ممكنه با حذف و درجي كه كاربر ميكنه تعداد عكس ها هم متغير باشه
كدي كه خودم نوشتم


private void show_Load(object sender, EventArgs e)
{
int i=0;

for (i= 1; i<=15; i++)
{
con.Close();
cmd = new SqlCommand("select pic from pic where (id='" +i + "')", 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(object sender, EventArgs e)
{
timer1.Start();
if (timer1.Interval == 10000)// نشان دادن ساعت
{
if (numsaat == 12)
{
numsaat = 1;
}
else { numsaat++; };
saat frm = new saat();
frm.Show();
timer1.Interval = 15000;
}
else if (timer1.Interval == 15000) // فرم تاريخ
{
saat.ActiveForm.Hide();
frmdate frm = new frmdate();
frm.Show();
timer1.Interval = 16000;
}
else if (timer1.Interval == 16000)
{
saat.ActiveForm.Hide();
if (listImage.Count > current)
{
animationControl1.AnimatedImage = listImage[current];
animationControl1.AnimationType = Animation.AnimationTypes.Fade2Images;
animationControl1.Animate(40);
current++;
timer1.Interval = 10000;
}
else
{
current = 0;
animationControl1.AnimatedImage = listImage[current];
}


البته اين كد فقط براي 15 تاي اول هست براي 15 تاي دوم به بعد نميدونم چيكار كنم

حجتی نیا
شنبه 16 مرداد 1389, 18:00 عصر
حدود 300 تاست اگر همه اينها رو در ليست بريزم ممكنه در رم مشكل ايجاد كنه .

شما اول آدرس اونارو بخون داخل یه لیست بریز، بعدا یکی یکی از لیست اونارو بخون و عکس رو نمایش بده اینجوری لازم به 15دقیقه نیست
یا مثلا هر 10ثانیه از دیتابیس یه آدرس رو بخون و اونو نمایش بده (هر10ثانیه مراجعه به دیتابیس باعث کندشدن نمیشه)

csharpprogramer88
شنبه 16 مرداد 1389, 18:00 عصر
دوستان لود شدن حجم زياد اين همه عكس كه كيفييت همه هم بالاست در سيستم مشكلي بوجود نمياره بخصوص رم

csharpprogramer88
شنبه 16 مرداد 1389, 18:02 عصر
شما اول آدرس اونارو بخون داخل یه لیست بریز، بعدا یکی یکی از لیست اونارو بخون و عکس رو نمایش بده اینجوری لازم به 15دقیقه نیست
یا مثلا هر 10ثانیه از دیتابیس یه آدرس رو بخون و اونو نمایش بده (هر10ثانیه مراجعه به دیتابیس باعث کندشدن نمیشه)

دوست من مشكلي كه قبلا هم با همكاري شما انجام دادم حل شد ولي تصوير را بصورت تار نشان ميداد كه اصلا بيخيال آدرس شدم .

M.YasPro
شنبه 16 مرداد 1389, 18:12 عصر
سلام
چرا شما 15 بار میخواید برید به دیتابیس و برگردید؟!!
به جای کوئری فعلی از این کوئری استفاده کنید :


SELECT pic FROM pic
WHERE id
BETWEEN 1 AND 15


با اینکار متغیر listImage یکباره پر میشه .
حالا برای اینکه هر 5 دقیقه یکبار listImage رو پر کنید میتونید تایمر رو روی 20 ثانیه ست کنید و بعد از 15 بار اجرا شدن تایمر(با یک if چک کنید ) دوباره به دیتابیس ارجاع کنید و 15 تای بعدی رو از دیتابیس استخراج کنید .
برای اینکه بدونید از شماره چند تا چند رو استخراج کنید میتونید یه متغیر public در سطح فرم داشته باشید که با هر بار(15تا 15تا) بعلاوه یک بشه تا هر بار بدونید از چند تا چند رو باید select کنید مثلا اگر متغیر سراسری برابر با 5 بود :
5منهای 1 میشه4
4ضرب در 15 میشه 60
5ضرب در 15 میشه 75
حالا میدونید که از 60 تا 75 رو باید select کنید .

کار سختی نیست پس واسه خودت سخت نگیر .
موفق باشید .

csharpprogramer88
شنبه 16 مرداد 1389, 18:22 عصر
سلام
چرا شما 15 بار میخواید برید به دیتابیس و برگردید؟!!
به جای کوئری فعلی از این کوئری استفاده کنید :


SELECT pic FROM pic
WHERE id
BETWEEN 1 AND 15


با اینکار متغیر listImage یکباره پر میشه .
حالا برای اینکه هر 5 دقیقه یکبار listImage رو پر کنید میتونید تایمر رو روی 20 ثانیه ست کنید و بعد از 15 بار اجرا شدن تایمر(با یک if چک کنید ) دوباره به دیتابیس ارجاع کنید و 15 تای بعدی رو از دیتابیس استخراج کنید .
برای اینکه بدونید از شماره چند تا چند رو استخراج کنید میتونید یه متغیر public در سطح فرم داشته باشید که با هر بار(15تا 15تا) بعلاوه یک بشه تا هر بار بدونید از چند تا چند رو باید select کنید مثلا اگر متغیر سراسری برابر با 5 بود :
5منهای 1 میشه4
4ضرب در 15 میشه 60
5ضرب در 15 میشه 75
حالا میدونید که از 60 تا 75 رو باید select کنید .

کار سختی نیست پس واسه خودت سخت نگیر .
موفق باشید .

دوست من در مورد خود تايمر بايد چيكار كنم چون من دستور سلكت را در پيج لود دارم و دستورات مربوط به تايمر را در timer1_Tick حالا چطوري بايد به پيج لود برم

حجتی نیا
شنبه 16 مرداد 1389, 18:41 عصر
من دستور سلكت را در پيج لود دارم و دستورات مربوط به تايمر را در timer1_Tick حالا چطوري بايد به پيج لود برم

show_load(sender,e);
متد لود رو فراخوانی میکنه

M.YasPro
یک شنبه 17 مرداد 1389, 07:06 صبح
private void show_Load(object sender, EventArgs e)
{
Load();
}

private void Load()
{
int i=0;

for (i= 1; i<=15; i++)
{
con.Close();
cmd = new SqlCommand("select pic from pic where (id='" +i + "')", 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(object sender, EventArgs e)
{
Tick();
}

private void Tick()
{
timer1.Start();
if (timer1.Interval == 10000)// نشان دادن ساعت
{
if (numsaat == 12)
{
numsaat = 1;
}
else { numsaat++; };
saat frm = new saat();
frm.Show();
timer1.Interval = 15000;
}
else if (timer1.Interval == 15000) // فرم تاريخ
{
saat.ActiveForm.Hide();
frmdate frm = new frmdate();
frm.Show();
timer1.Interval = 16000;
}
else if (timer1.Interval == 16000)
{
saat.ActiveForm.Hide();
if (listImage.Count > current)
{
animationControl1.AnimatedImage = listImage[current];
animationControl1.AnimationType = Animation.AnimationTypes.Fade2Images;
animationControl1.Animate(40);
current++;
timer1.Interval = 10000;
}
else
{
current = 0;
animationControl1.AnimatedImage = listImage[current];
}
}


موفق باشید .

csharpprogramer88
دوشنبه 18 مرداد 1389, 18:29 عصر
سلام
من برنامه را طبق پست 5 شرط گذاشتم وطبق پست 8 تغيير دادم ولي الان مشكلي كه وجود داره اينه كه مرحله اول (به جاي 15 تاي قبلي فعلا گذاشتم 3 تا تا راحت تر باشم ) محتويات ليست خونده ميشه و با كدي كه توي تايمر نوشتم (فرم تاريخ و ساعت ) هم درست اجرا ميشه ولي براي خوندن مرحله تصوير دوم با اينكه برنامه را تست كردم و مقادير اون درسته ولي صفحه تصاوير نشان داده نميشه و فقط فرم ساعت و تاريخ مياد
آخرين كد من



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.Data.SqlClient;
using System.Globalization;
using System.IO;

namespace lcd
{
public partial class show : Form
{
List<Bitmap> listImage = new List<Bitmap>();

SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;

public show()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=lcd;Integrated Security=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();
}
public static int numsaat = 0;//براي انتخاب شماره ساعت ها در فرم ساعت

private int getmaxnumber()
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
string strmax = "select max(id) from pic ";
cmd = new SqlCommand();
cmd.CommandText = strmax;
cmd.Connection = con;
try
{
return ((int)cmd.ExecuteScalar());
}
catch
{
return 1;
}
con.Close();
}
public static int sarasari = 1;// شمارنده تصاوير براي 15 تا 15 كردن
public static int temp1 = 1;// شمارنده تصاوير براي 15 تا 15 كردن از
public static int temp2 = 3;// شمارنده تصاوير براي 15 تا 15 كردن تا

int current = 0;
int i = 0;
int j = 0;
int t = 0;

private void Loadsafhe()
{
con.Close();
cmd = new SqlCommand("SELECT pic FROM pic WHERE (id BETWEEN '"+temp1+"' AND '"+temp2+"')", con);
if (con.State == ConnectionState.Closed)
{ con.Open(); }
dr = cmd.ExecuteReader();
int m = 0;
listImage.Clear();
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 Tick()
{
timer1.Start();
if (timer1.Interval == 3000)// نشان دادن ساعت
{
if (numsaat == 12)
{
numsaat = 1;
}
else { numsaat++; };
saat frm = new saat();
frm.Show();
timer1.Interval = 2010;
}
else if (timer1.Interval == 2010) // فرم تاريخ
{
// saat.ActiveForm.Hide();
frmdate frm = new frmdate();
frm.Show();
timer1.Interval = 2015;
}
else if (timer1.Interval == 2015) //نشان دادن فرم تصوير
{
// saat.ActiveForm.Hide();
if (listImage.Count > current)
{
animationControl1.AnimatedImage = listImage[current];
animationControl1.AnimationType = Animation.AnimationTypes.Fade2Images;
animationControl1.Animate(40);
current++;
timer1.Interval = 3000;
}
else
{
current = 0;
int t1;
sarasari =sarasari +1; //تشخيص مرحله اجرا

t1 = sarasari - 1;
temp1 = t1 * 3;

temp2 = sarasari * 3; //ta

// animationControl1.AnimatedImage = listImage[current];
Loadsafhe();
}
}
}

public Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;

float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;

nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);

if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;

int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);

Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQua lityBicubic;

g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();

return (Image)b;
}

private void show_Load(object sender, EventArgs e)
{
Loadsafhe();
}

private void timer1_Tick(object sender, EventArgs e)
{
Tick();
}
}
}


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