2008年12月16日火曜日

はっちゅう君プラスのアドインフォームのまとめ

この内容は後で修正しました。このエントリを参照してください。
はっちゅう君プラスのアドインを作るさいにドキュメントに書いてあるように素直にAddInFormを使うと色々問題が生じる。

もろもろの問題を解決するためには(using WeifenLuo.WinFormsUI.Docking;した上で)
public class MimohutaForm : AddInForm
{
public MimohutaForm()
{
if (this.DockState == DockState.Float) {
setIndependentWindow();
} else {
setDependentWindow();
}
ClickSec.Trading.Core.Main.ApplicationHost.Instance.Workbench.Resize += delegate {
decideAllowEndUserDocking();
};
}
private void decideAllowEndUserDocking()
{
if (ClickSec.Trading.Core.Main.ApplicationHost.Instance.Workbench.WindowState
== System.Windows.Forms.FormWindowState.Minimized) {
this.AllowEndUserDocking = false;
} else {
this.AllowEndUserDocking = true;
}
}
private void setIndependentWindow()
{
decideAllowEndUserDocking();
this.TopMost = true;
this.TopLevel = true;
}
private void setDependentWindow()
{
decideAllowEndUserDocking();
this.TopMost = false;
this.TopLevel = false;
}

protected override void OnDockStateChanged(EventArgs e)
{
if (this.DockState == DockState.Float) {
setIndependentWindow();
} else {
setDependentWindow();
}
base.OnDockStateChanged(e);
}
protected override void OnSizeChanged(EventArgs e)
{
this.ClientSize = this.ClientSize;
base.OnSizeChanged(e);
}
}
と拡張して使う。どの道フォームの自動復元をするためにはAddInFormを拡張したクラスを作ってその名前を指定しなければならないんだからついでにいつも上のようにすれば良いだろう。


それで、初期化時に、TopMostやTopLevelの設定が確実に行われるようにフォームビルダーは
class MimohutaBuilder : IAddInFormBuilder
{
public IAddInForm AddInForm
{
get
{
MimohutaMain mimohutaMain= new MimohutaMain();
mimohutaMain.Form.Show();
mimohutaMain.Form.DockState = mimohutaMain.Form.DockState;
return mimohutaMain.Form;
}
}
public string Value { get; set; }
public void Dispose() { }
}
}
とする。ただしここでは、MimohutaMainクラスのインナークラスとしてMimohutaFormクラスが定義されていて、MimohutaMainクラスのコンストラクタでMimohutaFormのプライベートなインスタンスが作られ、それがパブリックなFormから読み取れるようになっているのでこういう実装になっている。実際にはケースバイケースだろう。


これらの方針に従うと、

  • フロート状態のウィンドウのサイズがちゃんと復元される。

  • フロート状態のウィンドウははっちゅう君プラスにつられて最小化されたりせず独立している

  • フロート状態のウィンドウは何も設定していないとはっちゅう君が最小化
    していても上下左右へのドッキングアイコンが現れてうざいのだがそれが出なくなる


などのご利益がある。

ついでに、AddinFormを継承したクラスで
protected override string GetPersistString()
{
return base.GetPersistString() + "," + isFakeDataEnabled.ToString();
}
とデフォルトの永続化文字列に","に続けて文字列を連結して永続化文字列として返すと
上記フォームビルダーのValueプロパティにセットされた上でAddInForm.getが呼び出される。
これでフォーム毎の設定の保存、復元ができる。こういった部分が中途半端にしかドキュメント
化されていないのでReflectorでにらめっこしながら四苦八苦しなくてはならなくて大変だった。

ついでだからこのフォームビルダーの仕組みもメモしておく。
.addinファイルの<AddIn>要素の中に
<Path name="/AddIn/Forms">
<Form id="Tomorrowplusplus.Mimohuta.MimohutaMain+MimohutaForm"
builder="Tomorrowplusplus.Mimohuta.MimohutaBuilder" />
</Path>
と、上で例にしたようなAddinFormを拡張したクラスのフルネームとビルダークラスのフルネームを登録する。なお、私はAddinFormを継承したクラスを作成するのはこのようなビルダークラスと一意に紐付けするためだけの形式な物に思えたのでインナークラスとして定義してしまった。この場合"."ではなく"+"で外クラス名に繋ぐ。でも、上で書いたくらいに大幅に実装の拡張をするならば、インナークラスにするというのは正しい選択ではないかもしれない。そのうち修正しよう。

でも、いずれにせよ、本当に一段落したという感じだなあ。しばらくは細かい調整のみ。

再開したらまずやるのは注文リストを定期的に監視して新規建て注文約定-返済注文それぞれの時刻と値を調べてトレードの様子と損益を視覚化する事だろう。このようにこちらから連続して情報を身に行く方法以外に約定を知る方法はないみたい。休んでいる間に約定通知の方法が出来上がればいいな。

0 件のコメント: