PDA

View Full Version : تغییر location (حرکت) یک label !!



zayens
چهارشنبه 12 مهر 1391, 13:01 عصر
عجله نکنین! سوالم تکراری نیست!

من یه فرم درست کردم که یه pictureBox و یه Button داره
سوالم اینه:
میخوام هربار که روی باتن کلیک میکنم یه لیبل ایجاد بشه و بوسیله timer حرکت کنه. همین!

خود من از کدهای زیر استفاده کردم اما مشکل اینه که لیبل حرکت نمیکنه بلکه در location جدید کپی میشه !
مثلا وقتی سه بار روی باتن کلیک میکنم انتظار دارم که سه تا لیبل ایجاد بشه و با تایمر هم این سه لیبل به سمتی حرکت کنن

private void btnAdd_Click(object sender, EventArgs e)
{
Label lbl = new Label();
lbl.Text = "A";
lbl.ForeColor = Color.Red;
lbl.BackColor = Color.Transparent;
lbl.Location = new Point(100,100);
Picbox.Controls.Add(lbl);
//
Timer tm = new Timer();
tm.Interval = 100;
tm.Tick += new EventHandler(tm_Tick);
tm.Start();
}
و کد تایمر:

private void tm_Tick(object sender, EventArgs e)
{
Label lbl = new Label();
lbl.Text = "A";
lbl.ForeColor = Color.Red;
lbl.BackColor = Color.Transparent;
lbl.Location = new Point(x, y);//x = 100, y = 100;
Picbox.Controls.Add(lbl);
x += 20;
y += 20;
}
البته میدونم که این کد غلطه
خواهشا راهنمایی فرمایید
ممنون

m0hammad_01
چهارشنبه 12 مهر 1391, 13:29 عصر
سلام
مشکل کدتون اینجاست که شما در هر تیک تایمر میاین دوباره یه Label میسازین.یعنی به جای اینکه حرکت کنه، یه جدیدش رو میسازین.درون رویداد تیک تایمرتون فقط باید Label رو حرکت بدین.
مساله دیگه اینکه اگه در هر بار زدن دکمه قراره یه دونه Label بسازین، برای اینکه روی هم نیافتن باید Location شون رو مدیریت کنین.بعنی مثلا هر کدوم که جدید اضافه شد، یه مقدار از قبلیش پایینتر باشه.البته من نمی دونم میخواین با Label ها چه کاری انجام بدین.فقط گفتم که یادتون نره.

zayens
چهارشنبه 12 مهر 1391, 14:58 عصر
سلام
مشکل کدتون اینجاست که شما در هر تیک تایمر میاین دوباره یه Label میسازین.یعنی به جای اینکه حرکت کنه، یه جدیدش رو میسازین.درون رویداد تیک تایمرتون فقط باید Label رو حرکت بدین.
مساله دیگه اینکه اگه در هر بار زدن دکمه قراره یه دونه Label بسازین، برای اینکه روی هم نیافتن باید Location شون رو مدیریت کنین.بعنی مثلا هر کدوم که جدید اضافه شد، یه مقدار از قبلیش پایینتر باشه.البته من نمی دونم میخواین با Label ها چه کاری انجام بدین.فقط گفتم که یادتون نره.

خیلی ممنون
اینایی که فرمودید را که میدونستم!
سوالم اینه که چطور باید location را تو تایمر تغییر بدم بدون اینکه دوباره ساخته بشه؟!!!
خواهشا با کد راهنماییم کنین
مشکل اینه که من توی رویداد باتن یه لیبل میسازم و اگر تنها از

private void tm_Tick(object sender, EventArgs e)
{
lbl.Location = new Point(x, y);
x += 20;
y += 20;
}
استفاده کنم lbl را چون توی فرم نیست نمیشناسه!!(چون lbl توی برنامه ی در حال اجرا بوسیله باتن ایجاد میشه!)
خواهشا با کد راهنماییم کنین

harani
چهارشنبه 12 مهر 1391, 15:30 عصر
از location نباید استفاده کنید باید از خواص Top و Left کنترل استفاده کنید . ببینید میتونید با این کار درست کنید . منم سعی میکنم براتون برنامه رو براتون بنویسیم . شما هم سعی کنین .

harani
چهارشنبه 12 مهر 1391, 15:44 عصر
تونستی درست کنی ؟؟؟؟؟

این برنامه منه که برات نوشتم . هول هولکی نوشتم . اگه غلط بودم فکر کنم بتونی خودت اصلاح کنی . ولی خواستی بازم مطرح کن .

93526

shecarchi
چهارشنبه 12 مهر 1391, 18:24 عصر
میتونی ارایه ای از لیبل ها درست کنی اینجوری به راحتی میتونی کنترلشون کنی

m0hammad_01
چهارشنبه 12 مهر 1391, 23:24 عصر
خیلی ممنون
اینایی که فرمودید را که میدونستم!
سوالم اینه که چطور باید location را تو تایمر تغییر بدم بدون اینکه دوباره ساخته بشه؟!!!
خواهشا با کد راهنماییم کنین
مشکل اینه که من توی رویداد باتن یه لیبل میسازم و اگر تنها از

private void tm_Tick(object sender, EventArgs e)
{
lbl.Location = new Point(x, y);
x += 20;
y += 20;
}
استفاده کنم lbl را چون توی فرم نیست نمیشناسه!!(چون lbl توی برنامه ی در حال اجرا بوسیله باتن ایجاد میشه!)
خواهشا با کد راهنماییم کنین
بله.اگه Label رو تو رویداد کلیک بسازی دیگه تو رویداد Tick بهش دسترسی نداری.بهترین راه حل همون استفاده از آرایه هستش که جناب Shekarchi گفتن.
البته راه های دیگه هم هست که ساده تر هستن یعنی با یکی دو خط کد میشه انجام داد اما اگه خواستی برنامتو توسعه بدی دست و پات رو میبنده و آخرش برمی گردی سر همین آرایه.
در زمینه کار با آرایه و آرایه ای از کنترل جستجو کن.

zayens
پنج شنبه 13 مهر 1391, 08:47 صبح
میتونی ارایه ای از لیبل ها درست کنی اینجوری به راحتی میتونی کنترلشون کنی
از آرایه استفاده کردم اما بازم نشد که!!
خواهشا میتونید کد من را اصلاح کنین؟

توی رویداد باتن از کد زیر استفاده کردم:

private void button1_Click(object sender, EventArgs e)
{
Random r = new Random();
int randw = r.Next(2, pictureBox1.Width - 10);
int randh = r.Next(2, pictureBox1.Height - 10);

Label[] lbl = new Label[10];
lbl[number] = new Label
{
Name = "lbl" + number.ToString(),
Text = number.ToString(),
Size = new Size(25, 15),
BackColor = Color.Transparent,
ForeColor = Color.Black,
Location = new Point(randw, randh),
};
pictureBox1.Controls.AddRange(lbl);
number++;
}

و برای تایمرم هم از کد زیر استفاده کردم

private void timer1_Tick(object sender, EventArgs e)
{

foreach (Label[] lbl in pictureBox1.Controls.OfType<Label[]>())
{
//فقط لیبل با اندیس 0 میخوام جاش عوض شه
lbl[0].Location = new Point(lbl[0].Location.X + 50, lbl[0].Location.Y + 50);
//اما جای لیبل تغییر نمیکنه
}
}

توی این برنامه میخوام مثلا چندین بار که روی باتن کلیک کردم با هر کلیک یه لیبل بسازه(که این کار انجام مبشه)
اما میخوام یکی از لیبلها(مثلا لیبل با اندیس فلان) بوسیله تایمر location اش تغییر کنه (ینی میخوام لیبل حرکت کنه)
که اتفاق دوم نمیفته
ممنون از راهنمایی همه

harani
پنج شنبه 13 مهر 1391, 11:33 صبح
برنامه ی منو دیدی برات دست کردم ؟؟؟؟؟؟؟؟؟؟؟؟

zayens
پنج شنبه 13 مهر 1391, 14:29 عصر
برنامه ی منو دیدی برات دست کردم ؟؟؟؟؟؟؟؟؟؟؟؟
آره جناب harani (http://barnamenevis.org/member.php?256621-harani)
ولی من میخوام هر کدوم از لیبل ها را (مثلا لیبل 2) هر وقت که خواستم حرکت بدم و نمیخوام از foreach استفاده کنم
در واقع بعد از اینکه لیبلهام با یه باتن ساخته شدند میخوام بعدش توی یه رویداد دیگه(یا توی یه تایمر یا یه باتن دیگه یا هرچی) حرکتشون بدم اونم نه همشونا بلکه بعضیاشونا!!
فعلا ؛ اگر میشه توی برنامه خودتون، وقتی لیبل ها به 10 رسید ، برای نمونه لیبل شماره 1 را حرکت بدین.ممنون

harani
پنج شنبه 13 مهر 1391, 16:08 عصر
یه جیز هول هولکی نوشتم برات اضلاح شدس تقرییا! چیزی که میخوای موس در حوالی هر لیبلی بره اون حرکت میکنه . یه ذره ایراد داره خودت فکر بتونی درست کنی .

93556