PDA

View Full Version : حرفه ای: مشکل در ایجاد MethodInvoker



araz_pashazadeh
یک شنبه 29 اردیبهشت 1392, 11:04 صبح
با عرض سلام وخسته نباشید خدمت دوستان
من می خوام متدی از نوع MethodInvoker ایجاد کنم و تکه کدی که نوشتم به شکل زیر هستش:

CreateTheColumn.DecreaseTotalAllocated += new MethodInvoker(PaletteTotalAllocated_Decrease);

private void PaletteTotalAllocated_Decrease()
{
//TSSLLoadedInTheHall.Text = (decimal.Parse(TSSLLoadedInTheHall.Text) - decimal.Parse(TSSLColumnCapacity.Text) /
// int.Parse(TSSLPaletteCount.Text)).ToString();
//TSSLWeightTotalAllocated.Text = (decimal.Parse(TSSLWeightTotalAllocated.Text) - decimal.Parse(TSSLColumnCapacity.Text) /
// int.Parse(TSSLPaletteCount.Text)).ToString();
//TSSLWeightLoaded.Text = (decimal.Parse(TSSLWeightLoaded.Text) - decimal.Parse(TSSLColumnCapacity.Text) /
// int.Parse(TSSLPaletteCount.Text)).ToString();
}
و در زمان فراخوانی
DecreaseTotalAllocated();

تا اینجای کار مشکلی ندارم ولی زمانی که می خوام برای تابع پارامتر ایجاد کنم با خطا مواجه میشم جالب اینجاست نوع و متغییری که تعریف کردم را میشناسه ولی اسم متغییر همراه : دیده میشه معنی : یعنی چی؟
چطوری می تونم پارامتر ارسال و یا دریافت کنم؟

youngold
یک شنبه 29 اردیبهشت 1392, 11:25 صبح
با عرض سلام وخسته نباشید خدمت دوستان
من می خوام متدی از نوع MethodInvoker ایجاد کنم و تکه کدی که نوشتم به شکل زیر هستش:

CreateTheColumn.DecreaseTotalAllocated += new MethodInvoker(PaletteTotalAllocated_Decrease);

private void PaletteTotalAllocated_Decrease()
{
//TSSLLoadedInTheHall.Text = (decimal.Parse(TSSLLoadedInTheHall.Text) - decimal.Parse(TSSLColumnCapacity.Text) /
// int.Parse(TSSLPaletteCount.Text)).ToString();
//TSSLWeightTotalAllocated.Text = (decimal.Parse(TSSLWeightTotalAllocated.Text) - decimal.Parse(TSSLColumnCapacity.Text) /
// int.Parse(TSSLPaletteCount.Text)).ToString();
//TSSLWeightLoaded.Text = (decimal.Parse(TSSLWeightLoaded.Text) - decimal.Parse(TSSLColumnCapacity.Text) /
// int.Parse(TSSLPaletteCount.Text)).ToString();
}
و در زمان فراخوانی
DecreaseTotalAllocated();

تا اینجای کار مشکلی ندارم ولی زمانی که می خوام برای تابع پارامتر ایجاد کنم با خطا مواجه میشم جالب اینجاست نوع و متغییری که تعریف کردم را میشناسه ولی اسم متغییر همراه : دیده میشه معنی : یعنی چی؟
چطوری می تونم پارامتر ارسال و یا دریافت کنم؟

اگر CreateTheColumn ابجکتی هست که خودتون ساختین و کدش رو دارین باید delegate event اش رو ویرایش کنید و پارامتر ها رو بهش اضافه کنید

araz_pashazadeh
یک شنبه 29 اردیبهشت 1392, 11:36 صبح
در واقع CreateTheColumn یه فرم دیگه هستش که اطلاعات از اون فرم می خوام ارسال بشه.
مشکل اینجاست که نمی دونم چطوری این کار را انجام بدم؟
من اطلاعاتم در این زمینه خیلی کم ممنون میشم اگه من را راهنمایی کنین ویا نمونه کد در این زمینه برام قراربدین.

youngold
یک شنبه 29 اردیبهشت 1392, 11:42 صبح
شما باید برید به سورس همون فرم
فیلد زیر رو پیدا کنید
DecreaseTotalAllocate
سپس میبینید :
public event ??? CreateTheColumn.DecreaseTotalAllocated
جای علامت سوال یک delegate هست به دنبالش بگردین تا اینجا رو ببینید پیدا میکنید یا نه

araz_pashazadeh
یک شنبه 29 اردیبهشت 1392, 11:52 صبح
این تکه کد را کجا بنویسم؟
همه قسمتهای کلاس نوشتم ولی متاسفانه چیزی نیاورد!
حتی دستی نوشتم برام خطلا داد.
درضمن من در برنامه دو تا فرم دارم که CreateTheColumn همان فرم2 من هستش و که همان فرزند.
اگه شما نمونه کدی در این مورد داشته باشین یا منبعی برام معرفی کنین خیلی بهتر.

youngold
یک شنبه 29 اردیبهشت 1392, 12:02 عصر
http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

http://msdn.microsoft.com/en-us/library/8627sbea%28v=vs.71%29.aspx

http://www.codeproject.com/Articles/11541/The-Simplest-C-Events-Example-Imaginable

araz_pashazadeh
یک شنبه 29 اردیبهشت 1392, 12:30 عصر
دوست عزیز این لینکها هیچ کدوم در مورد ارسال پارامتر در MethodInvoker توضیح ندادن.
من در تعریف و یا استفاده کردن MethodInvoker مشکلی ندارم در بالا هم گفتم فقط مشکل من در ارسال پارامتر هستش همین.
ممنون میشم اگه یک نمونه کد در این مورد قرار بدین و یا در صورت امکان تکه کد من را اصلاح کنین.
با تشکر

youngold
یک شنبه 29 اردیبهشت 1392, 13:05 عصر
من در تعریف و یا استفاده کردن MethodInvoker مشکلی ندارم در بالا هم گفتم فقط مشکل من در ارسال پارامتر هستش همیناتفاقاً مشکل در تعریف هست

در منابع بالا که دادم یک delegate ساخته شده چرا به ماهیت delegate دقت نکردید
delegate ها نماینده یا یک مدلی از متد ها هستند
وقتی میخوایم event تعریف کنیم اون رو باید از نوع یک delegate که نماینده همون متد هست (که اگر پارامتری در کار هست باید پارامتر های متد هم در اون نماینده یا مدل متد ذکر بشه) بسازیم تا بعد بتونیم اون متد رو با همون پارامتر ها invoke کنیم

به شکل زیر :

public delegate void myMethod(string param1);
public event myMethod myEvent;

private void Form1_Load(object sender, EventArgs e)
{
myEvent += new myMethod(Form1_myEvent);

/// get invoke
if (myEvent != null)
{
myEvent("myString");
}
}

void Form1_myEvent(string param1)
{

}

youngold
یک شنبه 29 اردیبهشت 1392, 13:12 عصر
تفاوت برنامه شما با کد ها بنده در اینه که delegate شما در فرمی دیگه قرار داره ، باید برید پارامتر ها رو به delegate مربوطه اضافه کنید
از طرفی باید دید این متد دیگه کجا ها invoke شده ، شاید در جای دیگه ای از اون فرم یا هر جای برنامه این متد بدون پارامتر invoke شده باشه
شما هر جا که خواستید نمیتونید بهش پارامتر اضافه کنید و کلی هست
مگر اینکه بعد از افزودن پارامتر به delegate مربوطه در سایر جاها پارامتر null بهش ارسال کنید

araz_pashazadeh
پنج شنبه 02 خرداد 1392, 11:56 صبح
دوست عزیز گفته شما کاملا متین ولی جالب اینجاست من اصلا در برنامه از delegate استفاده نکردم.
وقتی هم استفاده می کنم با مشکل مواجه میشم.
اگه امکانش هست شما لطف کنید یک نمونه مثال کوچیک در #C بنویسید که اطلاعات را از یک فرم والد به یک فرم فرزند بفرسته.
منون میشم از کمکتون من نتونستم این کار را انجام بدم.

youngold
پنج شنبه 02 خرداد 1392, 13:28 عصر
دوست عزیز گفته شما کاملا متین ولی جالب اینجاست من اصلا در برنامه از delegate استفاده نکردم.
وقتی هم استفاده می کنم با مشکل مواجه میشم.
اگه امکانش هست شما لطف کنید یک نمونه مثال کوچیک در #C بنویسید که اطلاعات را از یک فرم والد به یک فرم فرزند بفرسته.
منون میشم از کمکتون من نتونستم این کار را انجام بدم.


بنده از طرز کاری که مد نظر شما هست خبر ندارم اما حداقل سه حالت وجود داره :
1- فیلدی از نوع فرم والد در فرم فرزند بسازید و فرم والد رو درون وارد کنید و از اون استفاده کنید
2- کلاسی از مجموعه فیلد ها و پراپرتی هایی که از فرم والد در فرم فرزند نیاز دارید بنویسید و یک فیلد از نوع اون کلاس در فرم فرزند بسازید و بعد از پر کردن اون مقادیر ازش در فرم فرزند استفاده کنید
3- پارامتر هایی که احتیاج دارید به متد سازنده فرم فرزند اضافه کنید و موقعی که از فرم والد فرم فرزند را میسازید اون پارامتر ها رو هم باید ارسال کنید و در فیلدی در همان فرم دریافت کننده پارامتر، نگاه دارید تا بعد ازش در فرم فرزند استفاده کنید

4- برخی هم فیلد های مورد نیاز رو در فرم والد static میکنند تا در فرم های دیگه ازش استفاده کنند که کار اصولی نیست
5- حالت دیگری هم هست که invoke میکنیم که شما بهش نیاز ندارید
- ...


1 و 3 :

in parent form

public void showChildForm()
{
childForm f = new childForm(this); // import parent form to child form
f.ShowDialog();
}

in child form
parentForm pf;
public childForm(parentForm pf)
{
this.pf = pf;

// for example : show parent form title
MessageBox.Show(this.pf.Text);
}


این ها به کنار، اگر فقط به کلاس Form ، فرم والد احتیاج دارید میتونید به شکل زیر داشته باشیدش :
in child form
this.ParentForm