PDA

View Full Version : ایجاد event handler پویا در حین اجرای برنامه



CoDe_LeArNeR
چهارشنبه 13 اسفند 1393, 18:48 عصر
درود
توی برنامه ای ساده به مشکلی برخوردم دوستان در صورت امکان راهنمایی کنن.
برنامه به این شکل هست که کاربر با استفاده از open file dialog تعدادی عکس رو انتخاب میکنه که این عکسا به ترتیب داخل فرم قرار داده میشن.هر موقع که روی هر یک از عکسا کلیک میشه،سایز عکس دو برابر بشه.
مشکل من اینجاست که نمیتونم برای تک تک عکس ها event handler بسازم.تنها برای آخرین عکس افزوده شده میتونم این کارو انجام بدم
ممنون میشم راهنمایی کنبد
بدرود

SabaSabouhi
پنج شنبه 14 اسفند 1393, 08:36 صبح
درود
توی برنامه ای ساده به مشکلی برخوردم دوستان در صورت امکان راهنمایی کنن.
برنامه به این شکل هست که کاربر با استفاده از open file dialog تعدادی عکس رو انتخاب میکنه که این عکسا به ترتیب داخل فرم قرار داده میشن.هر موقع که روی هر یک از عکسا کلیک میشه،سایز عکس دو برابر بشه.
مشکل من اینجاست که نمیتونم برای تک تک عکس ها event handler بسازم.تنها برای آخرین عکس افزوده شده میتونم این کارو انجام بدم
ممنون میشم راهنمایی کنبد
بدرود


سلام
این عکس رو چطوری نمایش می‌دی؟ بالاخره یه کنترلی رو صفحه گذاشتی دیگه.
یه eventhandler بنویس و هنگام load کنترل، رویداد کلیک رو وصل کن به اون eventhandler

صبا صبوحی

CoDe_LeArNeR
پنج شنبه 14 اسفند 1393, 12:49 عصر
سلام
فکر کنم نتونستم درست توضیح بدم
ببینید با یه button کاربر وصل میشه به open file dialog و عکس ها رو دونه دونه انتخاب میکنه و عکس ها به ترتیب رو فروم قرار داده میشن
من میتونم event handler رو به آخرین عکسی که افزوده شده بدم ولی نمیتون برای همه ی عکس های اضافه شده این کهر رو انجام بدم
ابزارش انجام این کارو نمیدونم

SabaSabouhi
پنج شنبه 14 اسفند 1393, 14:39 عصر
سلام
فکر کنم نتونستم درست توضیح بدم
ببینید با یه button کاربر وصل میشه به open file dialog و عکس ها رو دونه دونه انتخاب میکنه و عکس ها به ترتیب رو فروم قرار داده میشن
من میتونم event handler رو به آخرین عکسی که افزوده شده بدم ولی نمیتون برای همه ی عکس های اضافه شده این کهر رو انجام بدم
ابزارش انجام این کارو نمیدونم

سلام
بله، من هم گمان می‌کنم درست توضیح ندادی.
شما به عکس نمی‌تونی Event Handler اختصاص بدی. Event Handler رو به یه کنترل اختصاص می‌دی که اون عکس رو نشون می‌ده.
حالا قبل از این که من و دیگران بتونیم کمکی کنیم به چند پرسش پاسخ بده.
1. تصاویر رو توسط چه کنترلی نشون می‌دی؟
2. آیا کنترل‌ها از پیش ساخته شده هستن یا در حال اجرا تولیدشون می‌کنی.
3. اون Event Handler رو چطوری به آخرین کنترل می‌دی؟

صبا صبوحی

CoDe_LeArNeR
پنج شنبه 14 اسفند 1393, 15:21 عصر
public partial class Form1 : Form
{
public int i = 0,x=5,y=5;
PictureBox[] p1 = new PictureBox[100];
PictureBox tp = new PictureBox();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog o1 = new OpenFileDialog();
o1.Title = "انتخاب عکس";
o1.Filter = "JPEG FILES|*.jpg|BITMAP FILES|*.Bitmap|ALL FILES|*.*";
o1.InitialDirectory = "C:\\";
p1[i] = new PictureBox();
o1.ShowDialog();
p1[i].Height = 50;
p1[i].Width = 50;
p1[i].ImageLocation = (o1.FileName);
if (this.Width - x < 55)
{
x = 5;
y += 55;
}
p1[i].Top = y;
p1[i].SizeMode = PictureBoxSizeMode.StretchImage;
p1[i].Left = x;
p1[i].Click += new EventHandler(picture_click);
tp = p1[i];
x += 55;
this.Controls.Add(p1[i]);
i++;
}

private void picture_click(object sender, EventArgs e)
{
if (tp.Height == 50)
{
tp.Height = 100;
tp.Width = 100;
}
else if (tp.Height == 100)
{
tp.Height = 50;
tp.Width = 50;
}
}
}
فکر کنم کد رو ببینین بهتر متوجه میشین

CoDe_LeArNeR
پنج شنبه 14 اسفند 1393, 15:22 عصر
public partial class Form1 : Form { public int i = 0,x=5,y=5; PictureBox[] p1 = new PictureBox[100]; PictureBox tp = new PictureBox(); public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { }

private void button1_Click(object sender, EventArgs e) { OpenFileDialog o1 = new OpenFileDialog(); o1.Title = "انتخاب عکس"; o1.Filter = "JPEG FILES|*.jpg|BITMAP FILES|*.Bitmap|ALL FILES|*.*"; o1.InitialDirectory = "C:\\Users\\ImPoSsIbLe\\Documents\\ViberDownloads"; p1[i] = new PictureBox(); o1.ShowDialog(); p1[i].Height = 50; p1[i].Width = 50; p1[i].ImageLocation = (o1.FileName); if (this.Width - x < 55) { x = 5; y += 55; } p1[i].Top = y; p1[i].SizeMode = PictureBoxSizeMode.StretchImage; p1[i].Left = x; p1[i].Click += new EventHandler(picture_click); tp = p1[i]; x += 55; this.Controls.Add(p1[i]); i++; }

private void picture_click(object sender, EventArgs e) { if (tp.Height == 50) { tp.Height = 100; tp.Width = 100; } else if (tp.Height == 100) { tp.Height = 50; tp.Width = 50; } }
}
فکر کنم کد رو ببینین بهتر متوجه میشین

SabaSabouhi
پنج شنبه 14 اسفند 1393, 20:50 عصر
سلام
با دیدن این کد خیلی حرف دارم برای گفتم. من اینا رو می‌گم بلکه اشکال‌هات رو رفع کنی، و امیدوارم ناراحت نشی.
1. امیدوارم به‌هم ریختگی این کد در اثر بد کپی شدن کد در این سایت باشه و خودت کد رو این‌شکلی نبینی.
2. اون object sender که اولین پارامتر event handler هست، گمان می‌کنی برای چیه؟ برای اینه که اون tp سراسری رو نداشته باشی.


var pictureBox = (PictureBox)sender;

اون مشکلی که الان داری به همین دلیله، بجای استفاده از tp، این خط رو به سطر اول Event Handler اضافه کن، بعد از اون متغیر استفاده کن.
3. گمان کنم تازه #C رو شروع کردی و قبلش هم VB کار می‌کردی. دوست من، متغیر سراسری زیاد و نادرست استفاده می‌کنی.
Array روش قدیمی هست و دیگه خیلی کم استفاده می‌شه، روش‌های خیلی بهتر مثل List و Collection و Dictionary هست که مزایای زیادی داره.
تو این مثال شما List گزینه‌ی خیلی بهتری هست.
4. کد رو خیلی تو هم تو هم نوشتی، رعایت ترتیب هم برای خودت خیلی بهتره هم برای کسی که پس از شما قراره کد رو بخونه.
مثلاً وسط تعریف خواص pictureBox اومدی فرم باز کردی. خوب یا قبلش باز کن یا بعدش.



و در آخر خیلی خیلی جدی توصیه می‌کنم که برنامه‌ی Resharper رو بگیری و نصب کنی، جلوی خیلی از اشتباه‌های سهوی رو می‌گیره.
من که سال‌های زیادی هست که حرفه‌ای برنامه‌نویسی می‌کنم خیلی به دردم می‌خوره، برای تازه‌کارها گمان می‌کنم از نون شب واجب‌تر باشه.

باز هم تاکید می‌کنم که بیان اشکال‌های کد شما برای ناراحت کردن شما نیست. و امیدوارم که با رفع این اشکال‌ها به جمع برنامه‌نویس‌ها خوب بپیوندی.

صبا صبوحی

CoDe_LeArNeR
جمعه 15 اسفند 1393, 08:44 صبح
سلام
بی نهایت ممنونم واقعا لطف کردین
نه تنها دلیلی برای ناراحت شدن نیست،بلکه واجبه بی نهایت تشکر کنم.
من کلا 5 ماه بیشتر نیست برنامه نویسی کار میکنم و 1 ماه بیشتر نیست c# کار میکنم + 1 هفته بیشتر نیست با فرم کار میکنم.
بازم تشکر میکنم

SabaSabouhi
جمعه 15 اسفند 1393, 18:42 عصر
سلام
بی نهایت ممنونم واقعا لطف کردین
نه تنها دلیلی برای ناراحت شدن نیست،بلکه واجبه بی نهایت تشکر کنم.
من کلا 5 ماه بیشتر نیست برنامه نویسی کار میکنم و 1 ماه بیشتر نیست C#‎ کار میکنم + 1 هفته بیشتر نیست با فرم کار میکنم.
بازم تشکر میکنم

سلام
خواهش می‌کنم، کار مهمی نکردم.
اما حتماً برنامه‌ی Resharper رو دانلود و نصب کن. خیلی بهت کمک می‌کنه. نصبش هم خیلی راحته، محیط VS رو کاملاً در دست می‌گیره و
جلوی تعداد زیادی از اشتباه‌های متنی، و منطقی و حتا بدخطی رو می‌گیره.
اینجا اجازه اشاره به این لینک‌ها رو نداریم. تو گوگل بزن «دانلود Resharper»

صبا صبوحی