PDA

View Full Version : سوال: استفاده از یک متد در فرم دیگر



طبیب دل
شنبه 19 شهریور 1390, 08:20 صبح
با سلام به دوستان
من در فرم اصلی برنامم یک تابع دارم که با اجرای اون یک tabControl به فرمم اضافه میشه حالا می خوام بدونم
چطوری میشه با استفاده از یک دکمه در یک فرم دیگه به این متد دسترسی داشت ؟
با تشکر.

water_lily_2012
شنبه 19 شهریور 1390, 09:47 صبح
با استفاده از Delegate و Events ها می توانید این کار را انجام دهید.

طبیب دل
شنبه 19 شهریور 1390, 10:09 صبح
با استفاده از Delegate و Events ها می توانید این کار را انجام دهید.

خیلی ممنون
ولی من زیاد حرفه ای نیستم میشه یه مثال بزارید یا بیشتر توضیح بدید.

water_lily_2012
شنبه 19 شهریور 1390, 11:12 صبح
سلام
در فرمی دوم خود کد زیر را بنویسید.

public delegate void CreateTab();
public event CreateTab createTabDelegate;

یک دکمه در همین فرم ایجاد کن و کد زیر را بنویس.


private void button1_Click(object sender, EventArgs e) { createTabDelegate(); }

کد زیر را هم در دکمه فرم اول بنویسید.

private void button1_Click(object sender, EventArgs e)
{
child frm = new child();
frm.Show();
frm.createTabDelegate += new child.CreateTab(تابع مورد نظر شما برای اجرا); }

water_lily_2012
شنبه 19 شهریور 1390, 11:26 صبح
اگر نیاز به توضیح هم داشتید، ذکر کنید تا توضیح دهم.

طبیب دل
شنبه 19 شهریور 1390, 11:46 صبح
اگر نیاز به توضیح هم داشتید، ذکر کنید تا توضیح دهم.
ممنون اجازه بدید امتحان کنم اگر سئوال داشتم می پرسم
با تشکر

طبیب دل
شنبه 19 شهریور 1390, 12:11 عصر
با تشکر از شما
ببینید من در فرم اصلی یک منو دارم که با انتخاب هر کدام ار منوها یک tabPage به tabcontrol اضافه میشه و همزمان یکی از فرمهای برنامه در اون تب باز میشه با تابع زیر که این تابع رو در ایتم منو اجرا میکنم.

private void tabErjaDadsara()
{
System.Windows.Forms.TabPage tabErjaDadsar = new System.Windows.Forms.TabPage();
MenuStrip msErjaDadsara = new MenuStrip();
//////////////////////
ToolStripMenuItem stCloseErjaDadsara = new ToolStripMenuItem();
stCloseErjaDadsara.Name = "stClose";
stCloseErjaDadsara.Text = "بستن";
stCloseErjaDadsara.Click += new System.EventHandler(stCloseErjaDadsara_Click);
//////////////////////
tabControl1.Controls.Add(tabErjaDadsar);
tabErjaDadsar.Location = new System.Drawing.Point(4, 22);
tabErjaDadsar.BackColor = System.Drawing.Color.Maroon;
tabErjaDadsar.Name = "tabErjaDadsar";
tabErjaDadsar.Padding = new System.Windows.Forms.Padding(3);
tabErjaDadsar.Size = new System.Drawing.Size(1081, 358);
tabErjaDadsar.TabIndex = 4;
tabErjaDadsar.Text = "ارجاع به دادسرا";
tabErjaDadsar.UseVisualStyleBackColor = true;
/////////////
msErjaDadsara.Font = new System.Drawing.Font("Segoe UI", 9F);
msErjaDadsara.Items.AddRange(new ToolStripItem[] { stCloseErjaDadsara });
// msErjaDadsara.Location = new System.Drawing.Point(3, 3);
msErjaDadsara.Name = "msErjaDadsara";
// msErjaDadsara.Size = new System.Drawing.Size(1075, 24);
msErjaDadsara.TabIndex = 1;
msErjaDadsara.Text = "msErjaDadsara";
//////////////////
frmerjaDadsara formErjaDadsara = new frmerjaDadsara();
formErjaDadsara.Name = "formErjaDadsara";
formErjaDadsara.TopLevel = false;
formErjaDadsara.Parent = fMot;
formErjaDadsara.Dock = DockStyle.Fill;
formErjaDadsara.FormBorderStyle = FormBorderStyle.None;
/////////////////////////
tabErjaDadsar.Controls.Add(msErjaDadsara);
tabErjaDadsar.Controls.Add(formErjaDadsara);

formErjaDadsara.Show();
tabControl1.SelectTab("tabErjaDadsar");


حالا می خوام همین تابع رو از داخل یکی از فرمهایی که در این تب ها باز شده اجرا کنم اما متوجه نشدم کدهایی رو که شما گفتید کجا قرار بدم
با تشکر فراوان

water_lily_2012
شنبه 19 شهریور 1390, 12:44 عصر
مگر شما یک فرم جدید باز نمی کنید. و می خواهید از داخل آن این تابع را اجرا کنید. درسته؟

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

اما در قسمت اول (فرم تازه باز شده):
شما باید یک Delegate با هر نامی که دوست دارید تعریف کنید. و سپس یک Event از روی Delegate. تا ایجا که مشکلی نیست.
سپس یک دکمه اضافه می کنید و Event خود را صدا می زنید. کدی که در بالا نوشتم را ببینید.

اما در قسمت دوم ( فرم اولی):
شما باید تابع خودتون را صدا بزنید. یعنی به صورت زیر

Form2 frm = new Form2();
frm.Show();
frm.CreateTabDelegate += new Form2.Createtab(tabErjaDadsara);
من نام فرم دوم را form2 در نظر گرفتم.
نام Delegate و Event را هم مانند بالا

باز هم اگر مشکلی بود. در خدمتم.

طبیب دل
شنبه 19 شهریور 1390, 12:58 عصر
باز هم ممنونم
ولی ببینید
1- من تابع tabErjaDadsara رو در فرم اصلی دارم.
2- وقتی
frm.CreateTabDelegate += new Form2.Createtab(tabErjaDadsara); رو مینویسم CreateTabDelegate رو نمیاره .
3- در انتهای همین دستور وقتی Form2 رو مینویسم Createtab رو نمیاره
چی کارکنم؟
باز هم ممنونم.

طبیب دل
شنبه 19 شهریور 1390, 13:01 عصر
ضمنا می خوام که تابع tabErjaDadsaraدر خود فرم اصلی اعمال بشه.

water_lily_2012
شنبه 19 شهریور 1390, 13:09 عصر
شما CreateTabDelegate را در Form2 تعریف کرده اید یا نه.؟
من حدود نیم ساعت کار دارم. بعد از اون برات یک سورس قرار می دهم.

طبیب دل
شنبه 19 شهریور 1390, 13:17 عصر
بله تعریف کردم
با تشکر منتظرم

water_lily_2012
شنبه 19 شهریور 1390, 13:58 عصر
بازم سلام
من دو تا فرم ایجاد کرده ام. و با کلیک بر روی دکمه فرم دومی تابعی در فرم اول صدا زده میشود و یک MessageBox نمایش می دهد.

wolf_majid
شنبه 19 شهریور 1390, 14:05 عصر
اما در قسمت اول (فرم تازه باز شده):[/COLOR]
شما باید یک Delegate با هر نامی که دوست دارید تعریف کنید. و سپس یک Event از روی Delegate. تا ایجا که مشکلی نیست.
سپس یک دکمه اضافه می کنید و Event خود را صدا می زنید. کدی که در بالا نوشتم را ببینید.

چه جالب نمی دونستم میشه تابع هم به رخداد ارسال کرد
اما یک سوال مگه رخداد بر اساس ساختار delegate عمل نمی کنه ؟ پس چرا وقتی delegate ورودی نداره میشه به event ورودی داد , اونم یک ورودی نامعلوم

طبیب دل
شنبه 19 شهریور 1390, 14:15 عصر
باز هم ممنونم
ولی من می خوام MessageBox در فرم دوم نمایش داده نشه بلکه در فرم اول نمایش داده بشه یعنی تبی که می خوام اضافه کنم به همون فرم اول یا اصلی اضافه بشه نه به فرم جدید

water_lily_2012
شنبه 19 شهریور 1390, 14:23 عصر
خوب در همون فرم اول شما اضافه میشه. چون تابع شما در فرم اول هست.

طبیب دل
شنبه 19 شهریور 1390, 14:31 عصر
water_lily_2012 (http://barnamenevis.member.php?113535-water_lily_2012) عزیز درورد برشما مشکلم حل شد
دلم نیومد فقط به یک دکمه تشکر اکتفا کنم
مرسیییییییییییییییییییییی ییییییییییییییییییییییییی ییییییییییییییی:لبخندساده:

water_lily_2012
شنبه 19 شهریور 1390, 14:31 عصر
در این یکی یک textBox در فرم اول گذاشتم که با کلیک بر روی فرم دوم مقدارش تغییر می کنه.
مثل ایجاد کردن تب هست.

water_lily_2012
شنبه 19 شهریور 1390, 14:38 عصر
چه جالب نمی دونستم میشه تابع هم به رخداد ارسال کرد
اما یک سوال مگه رخداد بر اساس ساختار delegate عمل نمی کنه ؟ پس چرا وقتی delegate ورودی نداره میشه به event ورودی داد , اونم یک ورودی نامعلوم

ببخشید. هواسم به پست شما نبود.
متوجه منظور شما نشدم. من که ورودی به رخداد ندادم.

wolf_majid
شنبه 19 شهریور 1390, 15:01 عصر
ببخشید. هواسم به پست شما نبود.
متوجه منظور شما نشدم. من که ورودی به رخداد ندادم.

نه خواهش می کنم
منظورم در این قسمته :

frm.CreateTabDelegate += new Form2.Createtab(tabErjaDadsara);

البته منظور کد شما را متوجه شدم اما سوالم اینه که delegate ورودی نداشت پس چطور بهش ورودی دادید ؟

water_lily_2012
شنبه 19 شهریور 1390, 15:09 عصر
این که ورودی نیست. در اینجا از این روش استفاده کرده ایم تا یک تابع را اجرا کنیم. خوب این نام تابع مورد نظر "طبیب دل" بود. ولی میشه ورودی هم در نظر گرفت.

wolf_majid
شنبه 19 شهریور 1390, 15:17 عصر
منظورم هم همینه
یعنی میشه در قسمت تعریف ورودی براش در نظر نگرفت ولی در قسمت اختصاص مثلا" یک رشته را به عنوان ورودی بهش داد یا این عمل فقط در مورد توابع قابل اجراست ؟
و همچنین محدودیت اجرای تابع داره (یعنی میشه مثلا" 3 تابع را به ورودیش یا طبق گفته شما برای اجرا بهش بدیم ) ؟

water_lily_2012
شنبه 19 شهریور 1390, 15:33 عصر
شما رشته نمی تونی بدی. ولی می تونی بی نهایت تابع برای اجرا بهش بدی.
در ضمن می تونی در موقع تعریف Delegate , Event پارامتر تعیین کنی. ولی در اینجا نیاز به پارامتر نبود. ولی اگر نیاز بود می شد مقداری هم از یک فرم به فرم دیگر فرستاد.