PDA

View Full Version : تغییر فرم والد بوسیله فرم فرزند



miracle
یک شنبه 23 اردیبهشت 1386, 00:02 صبح
می خوام با کلیک بر روی دکمه ای که روی فرم فرزند هست BackColor فرم والد رو تغییر بدم
برای اینکار در فرم 2
public partial class Form2 : Form
{
public Form1 f1
public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

f2.f1=this;
f1. BackColor=Color.Green;
}
اما اجرا نمیشه ...باید چه کار کنم؟

Sorenaa_s
یک شنبه 23 اردیبهشت 1386, 01:45 صبح
اگر این کار رو از طریق یک Interface انجام بدید بهتره ( یعنی Abstraction بیشتر رعایت شده )



public interface IBackColorChanger
{
void ChangeBackColod( Color color );
}


public class Form1 : System.Windows.Forms.Form, IBackColorChanger
{
private System.Windows.Forms.Button button1;
public void ChangeBackColod(Color color)
{
this.BackColor = color;
}
private void button1_Click(object sender, System.EventArgs e)
{
Form2 frm = new Form2( this );
frm.ShowDialog();
}
}


public class Form2 : System.Windows.Forms.Form
{
public IBackColorChanger _forchange;
private System.Windows.Forms.Button button1;
public Form2( IBackColorChanger ForChange ): this()
{
this._forchange = ForChange;
}
private void button1_Click(object sender, System.EventArgs e)
{
_forchange.ChangeBackColod( Color.Blue );
}
}

miracle
یک شنبه 23 اردیبهشت 1386, 02:29 صبح
ممنون
ولی این چیزهایی که شما گفتید هنوز به ما درس ندادن..را ه حل دیگه در حد همین کدی که نوشتم نداره؟

javaphantom
یک شنبه 23 اردیبهشت 1386, 02:51 صبح
من بطور اتفاقی پیام شما را خواندم شما باید از composit pattern یا همان الگوی مخلوط استفاده کنید همانطوریکه دوست عزیزمون sorrena استفاده کرده البته از interface هم استفاده کرده تا بتونه خصوصیت کلاس پدر را تا حد ممکن بصورت خصوصی نگاه بداره یعنی کاملاً حرفه ای عمل کرده. اما الگوی مخلوط همین رو می که از طریق کلاس فرزند به کلاس پدر دسترسی داشت هرچند بحث encapsulate کمی تحت شعاع قرار می گیره ولی با کمک از یک واسطه گر که همان interface هست کمی کار محکم میشه. راه حل این است که هنگامی که می خواهی کلاس فرزند را در حافظه ایجاد کنی یا به عبارتی new بگیری در سازنده کلاس فرزند constructor ان از کلاس پدر یک نمونه بفرست و در کلاس فرزند ان را تحویل بگیر. منتها در کلاس فرزند تنها به رفتارها و خصوصیات public پدر دسترسی داری اگر بخواهی رفتار یا خصوصیتی را عوض کنی بطوریکه خصوصیات پدر همچنان private بماند باید یا interface تعریف کنی یا از الگوی state یا همان وضعیت که در C# با set , get درست می شود.


public class Father {
public Father() {
Child child = new Child(this);
}
public void setChangeColor(int a) {
this.Color = a;
}
}
public class Child {
private Father father;
public Child(Father f) {
this.father = f;
}
private void mouseClicked() {
father.setChangeColor(5); }
}

البته شایان ذکر است که این کدی که من برای شما نوشته ام کد واقعی نیست تلفیقی از کد جاوایی و شبه کد می باشد. مهم این بود که شما با دو الگوی مهم آشنا شدید.
1 composite pattern
state Pattern 2
احیاناً اگر بازهم متوجه نشدید میتونید برای من در قسمت برنامه نویس جاوا یا بصورت خصوص پیغام بگذارید.
من همانطور که گفتم بصورت اتفاقی از این قسمت گذشتم. ولی فکر کنم با دو مثال کار شما راه بی افتد. معمولاً الگوی composite درThread ها استفاده می شود. خوب برای تمرین بد نیست

Sorenaa_s
یک شنبه 23 اردیبهشت 1386, 13:41 عصر
ممنون
ولی این چیزهایی که شما گفتید هنوز به ما درس ندادن..را ه حل دیگه در حد همین کدی که نوشتم نداره؟





public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private void button1_Click(object sender, System.EventArgs e)
{
Form2 frm = new Form2( this );
frm.ShowDialog();
}
}


public class Form2 : System.Windows.Forms.Form
{
public Form _forchange;
private System.Windows.Forms.Button button1;
public Form2( Form ForChange ): this()
{
this._forchange = ForChange;
}
private void button1_Click(object sender, System.EventArgs e)
{
_forchange.BackColor= Color.Blue ;
}
}