// обработка закрытия обслуживаемой формы void AnyForm_Closed(object sender, FormClosedEventArgs e) { Form f = (Form)sender; if (!(f is IDataForm)) // для библиотечных форм - в FormBase { SaveFormOptions(f); } string t = (f.Owner != null ? f.Owner.GetType().Name + "." : "") + f.GetType().Name; if (LivingForms.ContainsKey(t)) { LivingForms.Remove(t); } if (LivingForms.Count == 0) { MainForm.Focus(); } }
/// <summary>Вызов формы</summary> /// <param name="form">Форма</param> /// <param name="parent">Родительская форма</param> /// <param name="formModes">Режимы запуска</param> /// <param name="extParams">Параметры для запросов</param> /// <param name="key">Ключ записи (например чтобы встать на нужной строке в главном гриде формы списка)</param> /// <returns>True только в случае положительного результата (OK) для модальной формы</returns> public bool ExecForm(Form form, Form parent = null, FormModes formModes = FormModes.Default, Dictionary <string, object> extParams = null, object key = null) { bool res = false; if (form == null || form.IsDisposed) { return(res); } if (form.Visible) { return(res); } string typeName = (parent != null ? parent.GetType().Name + "." : "") + form.GetType().Name; // проверка уже запущенных if (formModes.HasFlag(FormModes.Single)) { if (LivingForms.ContainsKey(typeName) && LivingForms[typeName] != null && !LivingForms[typeName].IsDisposed) { if (LivingForms[typeName].WindowState == FormWindowState.Minimized) { LivingForms[typeName].WindowState = FormWindowState.Normal; } LivingForms[typeName].Activate(); form.Dispose(); return(res); } LivingForms.Add(typeName, form); } Cursor.Current = Cursors.WaitCursor; try { SaveLog("EXEC_FORM", $"Start form {form.Name} ({form.Text})"); form.Load += AnyForm_Load; form.FormClosed += AnyForm_Closed; form.KeyDown += AnyForm_KeyDown; // особенности для бибилиотечных форм if (form is IDataForm) { ((IDataForm)form).Init(this, formModes, extParams, key); } // запуск if (formModes.HasFlag(FormModes.Modal)) { form.StartPosition = FormStartPosition.CenterParent; res = (form.ShowDialog(parent) == DialogResult.OK); form?.Dispose(); } else { form.StartPosition = FormStartPosition.Manual; if (MainForm != null) // позиционирование { int h = form.RectangleToScreen(form.ClientRectangle).Top - form.Top; int top = MainForm.Bottom, left = 0; for (int i = 0; i < 5; i++) { if (!LivingForms.Any(x => x.Value.Top >= top && x.Value.Top < top + 25)) { break; } top += h; left += h; } form.Top = top; form.Left = left; } if (parent == null) { form.Show(); } else { form.Show(parent); } } } catch (Exception e) { form?.Dispose(); if (LivingForms.ContainsKey(typeName)) { LivingForms.Remove(typeName); } Loger.SendMess(e); } finally { Cursor.Current = Cursors.Default; } return(res); }