PDA

View Full Version : سوال: حرکت دادن یک کنترل با روشی غیر از تایمر



mehran788
پنج شنبه 12 مرداد 1391, 09:49 صبح
با سلام
آیا راه دیگه ای به جز تایمر هست که بشه با اون یک کنترل رو در فرم بصورت متحرک در آورد.یعنی آروم آروم از یک جا به جای دیگه بره؟
ممنون

مهرداد صفا
پنج شنبه 12 مرداد 1391, 10:24 صبح
سلام
میتوانید از یک حلقه استفاده کنید و در هر بار اجرا ادامه برنامه را برای مدت کوتاهی متوقف کنید که بهتر است از چند thread استفاده کنید تا کار برنامه مختل نشود. به این کد دقت کنید:

void MoveButton1()
{
for (int i = 0; i < System.Windows.Forms.Screen.PrimaryScreen.Bounds.W idth; i++)
{
button1.Left = i;
System.Threading.Thread.Sleep(10);
}
}

mehran788
پنج شنبه 12 مرداد 1391, 14:43 عصر
به نظر شما بهترین راه واسه اینکار چیه؟تایمر طوری که می خوام عمل نمی کنه.وقتی inteval رو پایین ترین مقدار می دم باز هم سرعتش پایین تر از اون چیزیه که من می خوام.وقتی هم در اون interval از مکان باتون را چند تا چند تا عوض می کنم به صورت تکه تکه تغییر مکان میده و دیگه حالت روان حرکت کردن نداره.

the king
پنج شنبه 12 مرداد 1391, 16:00 عصر
به نظر شما بهترین راه واسه اینکار چیه؟تایمر طوری که می خوام عمل نمی کنه.وقتی inteval رو پایین ترین مقدار می دم باز هم سرعتش پایین تر از اون چیزیه که من می خوام.وقتی هم در اون interval از مکان باتون را چند تا چند تا عوض می کنم به صورت تکه تکه تغییر مکان میده و دیگه حالت روان حرکت کردن نداره.

بهترین شیوه رو M.safa نوشتند، اما اگر کار دیگری در حین این انتقال باید انجام بشه که با این روند تداخل داره، از BackgroundWorker کمک بگیرید.

90629

mehran788
شنبه 14 مرداد 1391, 11:03 صبح
سلام.
من کد زیر رو تو backgroundworker نوشتم و خطا داد.میشه راهنمایی کنید که مشکل از کجاست

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (backgroundWorker1.CancellationPending == false)
{
backgroundWorker1.ReportProgress(0);
System.Threading.Thread.Sleep(speed);
}
}


private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (lbc.Text == "0")
{
if (panel1.Location.X > 4)
{
Point p = new Point();
p.X = panel1.Location.X - 5;
p.Y = panel1.Location.Y;
panel1.Location = p;
p.X = txtname.Location.X - 5;
p.Y = txtname.Location.Y;
txtname.Location = p;
p.X = lbname.Location.X - 5;
p.Y = lbname.Location.Y;
lbname.Location = p;
}
else
timer1.Enabled = false;
}
if (lbc.Text == "1")
{
if (panel2.Location.X > 4)
{
Point p = new Point();
p.X = panel2.Location.X - 2;
p.Y = panel2.Location.Y;
panel2.Location = p;
p.X = lbsq1.Location.X - 2;
p.Y = lbsq1.Location.Y;
lbsq1.Location = p;
p.X = txtsq1.Location.X - 2;
p.Y = txtsq1.Location.Y;
txtsq1.Location = p;
}
else
timer1.Enabled = false;
}
}

و خطای زیر رو داد
This BackgroundWorker states that it doesn't report progress. Modify WorkerReportsProgress to state that it does report progress.

the king
شنبه 14 مرداد 1391, 13:25 عصر
سلام.
من کد زیر رو تو backgroundworker نوشتم و خطا داد.میشه راهنمایی کنید که مشکل از کجاست
This BackgroundWorker states that it doesn't report progress. Modify WorkerReportsProgress to state that it does report progress.
توی فرم تون اون کنترل backgroundWorker1 رو انتخاب کرده و در پنجره Properties مشخصه هایش را ببینید، یک مشخصه WorkerReportsProgress
داره که الان مقدارش False ئه، تا وقتی False باشه رخداد ProgressChanged قابل استفاده نیست، مقدارش رو به True تغییر دهید.

mehran788
یک شنبه 15 مرداد 1391, 10:45 صبح
واقعا ازتون ممنون