小新又闖禍了,媽媽讓他去寫檢討, 小新會有兩個選擇:
1 親自乖乖的去寫
2 一本正經的對小白說:「小白,幫我寫檢討吧,我請你吃心點」...
我們用C#來模擬一下這個場景。
首先畫出一個窗體,代表小新。
先放2個Button,Text分別為「親自寫」和「拜托小白」。
再放1個TextBox,代表小新檢討的紙。
定義個函數,小新寫檢討
private void 寫檢討(string str)
{
textBox1.Text = str.Trim();
}
親自寫當然很簡單,在「親自寫」按鈕中的Click事件中調用「寫檢討」即可。問題是調皮的小新打算讓小白去寫。
當然現在要創建小白窗體了。放一個按鈕,Text為「替小新寫檢討」。
在小白窗體類中,定義一個delegate:
public delegate void 寫檢討Handler(string str);
注意到「寫檢討Handler」的返回值和參數都和「寫檢討」都一模一樣。
然後定義小白寫檢討這個具體的事件:
public 寫檢討Handler 替小新寫檢討;
好了,小新小白都有了,現在小新要召喚小白了。在 小新窗體中的「拜托小白」按鈕的Click事件裡寫:
private void button2_Click(object sender, EventArgs e)
{
// 召喚小白
littleWhite xiaobai = new littleWhite();
// 3 讓小白知道該怎麼寫
xiaobai.替小新寫檢討 += new littleWhite.寫檢討Handler(寫檢討);
xiaobai.ShowDialog();
}
聰明的小白被召喚出來了。小主人的要求當然得滿足,於是在小白窗體的「替小新寫檢討」的Click事件裡寫:
private void button1_Click(object sender, EventArgs e)
{
// 小白替小新寫檢討
this.替小新寫檢討("美芽我錯了,汪汪~~");
this.DialogResult = DialogResult.OK;
}
好了,現在小新要請客小白吃心點了,不過媽媽看過以後估計要沒收他所有的小熊餅干了。
完整代碼見下:
小新窗體
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BossAsk
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
// 1 小新寫檢討
private void 寫檢討(string str)
{
textBox1.Text = str.Trim();
}
/// <summary>
/// 親自寫
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
寫檢討("美芽,我錯了...");
}
/// <summary>
/// 讓小白去寫
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
// 召喚小白
littleWhite xiaobai = new littleWhite();
// 3 讓小白知道該怎麼寫
xiaobai.替小新寫檢討 += new littleWhite.寫檢討Handler(寫檢討);
xiaobai.ShowDialog();
}
}
}
小白窗體
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BossAsk
{
public partial class littleWhite : Form
{
public littleWhite()
{
InitializeComponent();
}
// 2 定義個代理,讓小白模仿小新寫檢討
public delegate void 寫檢討Handler(string str);
// 定義小白寫檢討
public 寫檢討Handler 替小新寫檢討;
private void littleWhite_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
// 4 小白替小新寫檢討
this.替小新寫檢討("美芽我錯了,汪汪~~");
this.DialogResult = DialogResult.OK;
}
}
}
這樣的好處在於不必在小白窗體裡引用小新窗體裡的那張紙,降低窗體間的耦合度。