あるプログラマーがコンパイル済みのプログラムをソースコードなしで私に渡したとしましょう。ただし、それを簡単に追加する機能は提供します。しかし、プログラマーは、コンパイルされたプログラム内で人々が対話できるようにするにはどうすればよいでしょうか?
このデモ プログラムは、単純に最大数の乱数を作成し、プログラムの独自の mod でこのデータを使用したい人々に何が起こったのかを明らかにするイベントを発生させます。
public delegate void MadeRandomEventHandler(int previous,int current,int max);
class MakeRandom
{
private static int current = 350;
private static int max = 350;
public static event MadeRandomEventHandler MadeRandomEvent;
public static void dowork()
{
int curCopy = current;
Random random = new Random();
current = random.Next(0, max+1);
fireMadeRandomEvent(curCopy,current,max);
}
private static void fireMadeRandomEvent(int previous, int current, int max)
{
if (MadeRandomEvent != null)
MadeRandomEvent(previous,current,max);
}
}
そしてもちろん、dowork() を呼び出すボタンを備えたフォーム
public partial class Form_Main : Form
{
public Form_Main()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MakeRandom.dowork();
}
}
したがって、何が起こったかを表示する mod を作成するために必要なことは、プログレスバーを含む新しいフォームを作成し、MakeRandom クラスが発生するイベントを処理することだけです。
フォーム:
public partial class Form_Mod : Form
{
public static Form_Mod frm;
public Form_Mod()
{
InitializeComponent();
}
private void Form_Mod_Load(object sender, EventArgs e)
{
frm = this;
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
}
public void updateProgress(int percent)
{
progressBar1.Value = percent;
}
}
そしてイベント処理:
class Mod_HandleEvents
{
public static void attach()
{
MakeRandom.MadeRandomEvent += new MadeRandomEventHandler(RandomChange);
}
public static void detach()
{
MakeRandom.MadeRandomEvent -= new MadeRandomEventHandler(RandomChange);
}
private static void RandomChange(int previous, int current, int max)
{
float percent1 = (float)current / (float)max;
int percent = (int)(percent1 * 100);
Form_Mod frm = Form_Mod.frm;
frm.updateProgress(percent);
}
}
しかし、提供されたプログラムにこのコードを追加するにはどうすればよいですか? ソースコードがないので、追加して再コンパイルすることはできません。オンザフライで .cs ファイルをコンパイルしているように見えるプログラムをいくつか見てきましたが、それらの .cs ファイルはメイン プログラムと相互作用しているようです。どうすればいいですか?
また、「Form_Mod」フォームを実際に開くことができるようにするには、おそらくメイン フォームに別のボタンを追加する必要があります。メインプログラムを私に渡したプログラマーは、それを行う方法を提供する必要がありますよね? それとも別の方法がありますか?
private void button2_Click(object sender, EventArgs e)
{
Form_Mod frm = new Form_Mod();
Mod_HandleEvents.attach();
frm.Show();
}