PDA

View Full Version : مبتدی: ساخت آرایه ای از اشیا همراه با متد هایش



mxmostafa
یک شنبه 17 دی 1391, 18:42 عصر
سلام خسته نباشین
من توی سی شارپ یه آرایه ساختم

public Winsock2005DLL.Winsock[] winsok = new Winsock2005DLL.Winsock[100];
و در جاهای دیگه یه نمونه از شی میسازم و تو این آرایه میریزم

winsok[winsok_number] = new Winsock2005DLL.Winsock();
winsok_number یه متغیره که با هر بار ساختن شی جدید اضافه میشه تا به اندیس بعدی آرایه اشاره کنه
Winsock2005DLL.Winsock یه متدی داره به اسمه winsock1_DataArrival
میشه این متد رو برای همه اشیا در حین اجرا کنترل کرد؟
چطوری می تونم اشیایی که می سازم همراه با رویداد هاشون باشه؟
و مثلا 10 تا شی دارم که تو آرایه ذخیره شده و می خوام رویداد همشون رو کنترل کنم
در ضمن من شی ها رو در حین اجرای برنامه میسازم آیا می تونم وقتی شی که در حین اجرا ساخته شده و در آرایه ذخیره شده هم رویدادهاشو کنترل کنم؟
ممنون میشم راهنمایی کنین

group45
یک شنبه 17 دی 1391, 18:47 عصر
سلام
یه مثال ساده

textbox[]tb=new textbox[10];d
برای دسترسی به هر متدی از شی
tb[0].text="ddd";c

hakim22
یک شنبه 17 دی 1391, 20:05 عصر
جواب همه ی سوالهای شما مثبته !
همه ی رویدادها یک Delegate هستند و میشود آنها را در زمان اجرا ساخت (مانند اشیا) و به یک شی خاص و یا چند شی همزمان اختصاص داد
اختصاص رویداد :

button1.Click += new EventHandler(button1_Click);


از عملگر =- هم برای حذف یک متد از یک رویداد استفاده میشود.

شما می توانید همه ی اشیای جدیدی که میسازید به یک متد وصل کنید. اگر هرکدام از آنها رویداد مورد نظر را گزارش دهد با استفاده از آرگومان های e و Sender که در هر متد رویداد وجود دارند فرستنده ی رویداد و اخبار رویداد به متدی مانند Button1_Click منتقل میشود

mxmostafa
یک شنبه 17 دی 1391, 21:14 عصر
جواب همه ی سوالهای شما مثبته !
همه ی رویدادها یک Delegate هستند و میشود آنها را در زمان اجرا ساخت (مانند اشیا) و به یک شی خاص و یا چند شی همزمان اختصاص داد
اختصاص رویداد :

button1.Click += new EventHandler(button1_Click);


از عملگر =- هم برای حذف یک متد از یک رویداد استفاده میشود.

شما می توانید همه ی اشیای جدیدی که میسازید به یک متد وصل کنید. اگر هرکدام از آنها رویداد مورد نظر را گزارش دهد با استفاده از آرگومان های e و Sender که در هر متد رویداد وجود دارند فرستنده ی رویداد و اخبار رویداد به متدی مانند Button1_Click منتقل میشود
ممنون بابت پاسختون
وقتی رویداد کلیک دکمه ای از آرایه فراخونی میشه امکانش هست مثلا شماره اندیس آرایه رو هم به همراهش به به اون تابع بفرستیم تا بدونیم مثلا کودوم یک از دکمه های آرایه فشرده شده؟
مثلا
button[index].Click += new EventHandler(button1_Click)
در اصل می خوام ایندکس رو هم بفرستم تا بدونم کودوم باتون کلیک شده
در ضمن یه خطایی تو این روش به وجود اومد دلیلش چیه؟

winsok[winsok_number].DataArrival += new EventHandler(winsock1_DataArrival);
خطا = Error 1 No overload for 'winsock1_DataArrival' matches delegate 'System.EventHandler'

morteza5358
یک شنبه 17 دی 1391, 21:21 عصر
سلام
چرا به جای آرایه از لیست استفاده نمی کنید؟
دستت بیشتر بازه...
موفق باشی

group45
یک شنبه 17 دی 1391, 21:28 عصر
سلام
این برنامه (بازی ) رو خیلی وقت پیش نوشتم
توش سه چیز کار شده
1- کار با عکس
2- کار با اشیا و ایونت هاشون
3- ساخت اشیا در زمان اجرا
امیدوارم کارت راه بیفته
97974

mxmostafa
یک شنبه 17 دی 1391, 21:45 عصر
سلام
چرا به جای آرایه از لیست استفاده نمی کنید؟
دستت بیشتر بازه...
موفق باشی

ممنون دوست عزیز که جواب دادی
منظورت لیست پیوندی؟
راستش تا حالا من تو سی شارپ با لیست کار نکردم و نمیدونم چیه نمونه کدی آموزشی چیزی نداری ممنون میشم

mxmostafa
یک شنبه 17 دی 1391, 22:07 عصر
سلام
این برنامه (بازی ) رو خیلی وقت پیش نوشتم
توش سه چیز کار شده
1- کار با عکس
2- کار با اشیا و ایونت هاشون
3- ساخت اشیا در زمان اجرا
امیدوارم کارت راه بیفته
97974

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

Button[] bt = new Button[24];
bt[i] = new Button();

this.bt[i].Click += new System.EventHandler(this.bt_Click);
و اینم برنامه من

public Winsock2005DLL.Winsock[] winsok = new Winsock2005DLL.Winsock[100];
winsok[winsok_number] = new Winsock2005DLL.Winsock();
winsok[winsok_number].DataArrival += new EventHandler(winsock1_DataArrival);
ولی این خطا رو میده
Error 1 No overload for 'winsock1_DataArrival' matches delegate 'System.EventHandler' D:\project

hakim22
دوشنبه 18 دی 1391, 09:23 صبح
Error 1 No overload for 'winsock1_DataArrival' matches delegate 'System.EventHandler'

برای حل این خطا باید متد winsock1_DataArrival دارای دو آرگومان ورودی باشد.
دقت کنید که همه ی رویدادهای در دات نت دارای دو آرگومان مانند

private void myCustomControl_Click(object sender, EventArgs e)
{
((MyCustomControl)sender).DoWhatever();
}

مهرداد صفا
دوشنبه 18 دی 1391, 12:51 عصر
ممنون دوست عزیز که پاسخ دادی واقعا برنامه ای که نوشته حرف نداره خیلی عالی و اصولی نوشتی
تو برنامت اینطوری کار کردی

Button[] bt = new Button[24];
bt[i] = new Button();

this.bt[i].Click += new System.EventHandler(this.bt_Click);
و اینم برنامه من

public Winsock2005DLL.Winsock[] winsok = new Winsock2005DLL.Winsock[100];
winsok[winsok_number] = new Winsock2005DLL.Winsock();
winsok[winsok_number].DataArrival += new EventHandler(winsock1_DataArrival);
ولی این خطا رو میده
Error 1 No overload for 'winsock1_DataArrival' matches delegate 'System.EventHandler' D:\project

با سلام
دلیل این خطا عدم همخوانی نوع EventHandler با رویداد و یا عدم همخوانی پرامتر های رویداد با آرگومنتهای متود هندلر میتواند باشد. مثلا برای هندل کردن یک رویداد کلیک مینویسیم:

Button button1 = new Button();
button1.Click += new EventHandler(click);
//...
void click(object sender, EventArgs E)
{}

در حالی که برای هندل کردن رویداد KeyDown همین شی از متود دیگر با آرگومنتهای دیگر استفاده میشود:

button1.KeyDown += new KeyEventHandler(keyDown);
//...
void keyDown( object sender,KeyEventArgs E){}

در واقع نوع EventHandler و EventArgs در هر رویداد میتواند متفاوت باشد.
برای هندل کردن رویدادهای یک آرایه از اشیا میتوانید همانطور که دوستان گفتند از یک متود مشترک استفاده کرده و درون متود مقدار sender را با اشیا مطابقت دهید و برای هر یک کد خاص خودش را بنویسید. به این صورت:

Button[] buttons = new Button[10];
//...
for (int i = 0; i < 10; i++)
{
buttons[i] = new Button();
buttons[i].Click += new EventHandler(click);
this.Controls.Add(buttons[i]);
}
//....
void click(object sender, EventArgs E)
{
if (sender==buttons[0])
{
MessageBox.Show("first button clicked");
}
else if (sender == buttons[1])
{
MessageBox.Show("2nd button clicked");
}
//...
}

مهرداد صفا
دوشنبه 18 دی 1391, 13:36 عصر
اگر در هر صورت میخواهید اندیس عضوی را که رویداد روی آن اتفاق افتاده داشته باشید کد زیر را در متود click مثال بالا قرار دهید:

MessageBox.Show((buttons as IList<Button>).IndexOf((Button)sender).ToString() + "th button clicked");


یا مثال زیر را اجرا کنید و نتیجه را ببینید:

//in the name of god
// صل الله علی محمد و آله

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 Form1 : Form
{
Button[] buttons = new Button[10];

void click(int index, object sender, EventArgs E)
{
MessageBox.Show("index of button is:" + index.ToString());
}


public Form1()


{
InitializeComponent();

for (int i = 0; i < 10; i++)
{
buttons[i] = new Button();
buttons[i].Text = "button" + i.ToString();
buttons[i].Top = i * buttons[i].Height + buttons[i].Height;
buttons[i].Click += (sender, E) => click((buttons as IList<Button> ).IndexOf((Button)sender ), sender, E);
this.Controls.Add(buttons[i]);
}

}
}}

group45
سه شنبه 19 دی 1391, 12:45 عصر
ممنون دوست عزیز که پاسخ دادی واقعا برنامه ای که نوشته حرف نداره خیلی عالی و اصولی نوشتی
تو برنامت اینطوری کار کردی

Button[] bt = new Button[24];
bt[i] = new Button();

this.bt[i].Click += new System.EventHandler(this.bt_Click);
و اینم برنامه من

public Winsock2005DLL.Winsock[] winsok = new Winsock2005DLL.Winsock[100];
winsok[winsok_number] = new Winsock2005DLL.Winsock();
winsok[winsok_number].DataArrival += new EventHandler(winsock1_DataArrival);
ولی این خطا رو میده
Error 1 No overload for 'winsock1_DataArrival' matches delegate 'System.EventHandler' D:\project

با سلام
شما مطمئن هستید که متد DataArrival یه ایونته؟ اگه نباشه که اشتباه کردید دوست عزیز