/// <summary> /// エンジンオプション設定ダイアログを出す。 /// /// この構築のために思考エンジンに接続してoption文字列を取得しないといけなかったりしてわりと大変。 /// </summary> private void ShowEngineOptionSettingDialog() { var opt = EngineCommonOptionsSampleOptions.InstanceForConsideration(); var consideration = ViewModel.DialogType == ConsiderationEngineSettingDialogType.ConsiderationSetting; var dialog = EngineOptionSettingDialogBuilder.Build( EngineCommonOptionsSample.CreateEngineCommonOptions(opt), // 共通設定のベース(検討、詰検討用) consideration ? TheApp.app.EngineConfigs.ConsiderationConfig : TheApp.app.EngineConfigs.MateConfig, // 共通設定の値はこの値で上書き ViewModel.EngineDefineFolderPath // 個別設定の情報はここにある。 ); // 構築に失敗。 if (dialog == null) { return; } try { FormLocationUtility.CenteringToThisForm(dialog, this); // modal dialogとして出す dialog.ShowDialog(this); } finally { dialog.Dispose(); } }
/// <summary> /// 選択ダイアログの生成 /// </summary> private void CreateEngineSelectionDialog() { // 詳細設定ボタンの無効化と、このエンジン選択ダイアログを閉じる時に詳細設定ボタンの再有効化。 using (var dialog = new EngineSelectionDialog()) { if (ViewModel.DialogType == ConsiderationEngineSettingDialogType.ConsiderationSetting) { dialog.InitEngineDefines(true, false); // 通常のエンジンのみ表示 } else { dialog.InitEngineDefines(false, true); // 詰将棋エンジンのみ表示 } // エンジンを選択し、「選択」ボタンが押された時のイベントハンドラ dialog.ViewModel.AddPropertyChangedHandler("ButtonClicked", (args) => { var engineDefine = (EngineDefineEx)args.value; ViewModel.EngineDefineFolderPath = engineDefine.FolderPath; dialog.Close(); // 閉じる }); // modal dialogとして出すべき。 FormLocationUtility.CenteringToThisForm(dialog, this); dialog.ShowDialog(Parent); } }
/// <summary> /// 最前面に来るようにしてMessageBox.Show(text)を呼び出す。 /// </summary> /// <param name="text"></param> public DialogResult MessageShow(string text, MessageShowType type) { // Linuxでデバッグするときなど、例外が渡ってきて、ウインドウを出せずに終了することがあるので // 例外に関してはメッセージをConsoleに出すほうが親切かもなー。 if (type == MessageShowType.Exception) { Console.WriteLine(text); } var caption = type.Pretty(); var icon = type.ToIcon(); var show = new Func <Form, DialogResult>((parent) => { // MessageBoxのセンタリングにはWindows依存のコードが必要だし、 // Mono環境でMessageBox.Show()で日本語が文字化けするので // 自前で描画する。 // MessageBoxのセンタリングは、メッセージフックしないと不可能。 // cf. // オーナーウィンドウの中央にメッセージボックスを表示する (C#プログラミング) // https://www.ipentec.com/document/csharp-show-message-box-in-center-of-owner-window using (var dialog = new MessageDialog()) { dialog.SetMessage(caption, text, type); if (parent != null) { FormLocationUtility.CenteringToThisForm(dialog, parent); } return(dialog.ShowDialog()); } }); if (mainForm != null && mainForm.IsHandleCreated && !mainForm.IsDisposed) { if (mainForm.InvokeRequired) { try { var result = mainForm.BeginInvoke(new Func <DialogResult>(() => { return(show(mainForm)); })); return((DialogResult)mainForm.EndInvoke(result)); // これで結果が返るまで待つはず.. // ここでウィンドウが破棄される可能性があるのでEndInvoke()が成功するとは限らない。 } catch { return(DialogResult.OK); } } else { return(show(mainForm)); } } else { // メインウインドウ、解体後。 return(show(null)); } }
/// <summary> /// エンジンオプション設定ダイアログを出す。 /// /// この構築のために思考エンジンに接続してoption文字列を取得しないといけなかったりしてわりと大変。 /// </summary> private void ShowEngineOptionSettingDialog() { var dialog = EngineOptionSettingDialogBuilder.Build( EngineCommonOptionsSample.CreateEngineCommonOptions(), // 共通設定のベース TheApp.app.EngineConfigs.NormalConfig, // 共通設定の値はこの値で上書き ViewModel.EngineDefineFolderPath // 個別設定の情報はここにある。 ); // 構築に失敗。 if (dialog == null) { return; } // 「詳細設定」ボタンをDisableにする。 //ViewModel.SettingButton = false; // → この処理やめる。modal dialogとして出せばOk. FormLocationUtility.CenteringToThisForm(dialog, this.Parent as Form /* thisはControlなのでParentはFormのはず.. */); // modal dialogとして出す dialog.ShowDialog(this.Parent); }