|
Программирование >> Web ориентированные приложения
Первые три события касаются инициализации. То, какой тип инициализации вы предпочитаете, может определить событие, в которое должен быть помещен необходимый код. Конструктор класса срабатывает при создании экземпляра объекта. Событие Load происходит после создания экземпляра, но перед появлением формы на экране. Разница между ними связана с существованием формы. Когда возникает событие Load, форма уже существует, хотя пока еще и невидима. Во время выполнения конструктора форма находится в процессе создания. Событие Activated происходит, когда форма становится видимой и текущей. Бывают ситуации, когда этот порядок может быть слегка изменен. Если во время конструирования свойство Visible установить в true или вызвать метод Show (устанавливающий Visible в true), то событие Load возбуждается немедленно. А поскольку это также делает форму видимой и текущей, также сразу возбуждается событие Activated. Если имеется код после установки Visible в true, он выполняется. Поэтому последовательность событий будет выглядеть примерно так: □ конструктор, до выражения Visible = true □ Load □ Activate □ конструктор, после выражения Visible = true Потенциально это может привести к некоторым нежелательным результатам. С точки зрения передового опыта может показаться, что выполнить как можно больше работ по инициализации в конструкторе - хорошая идея. Но что происходит, когда форма закрывается? Событие Closing предоставляет возможность прервать процесс. Событие Closing принимает параметр CancelEventArgs. Этот аргумент имеет свойство Cancel, которое, будучи установленным в true, прерывает событие и оставляет форму открытой. Событие Closing случается при попытке закрыть форму, в то время как событие Closed - после ее закрытия. Оба они дают возможность выполнить необходимую очистку. Отметим, что событие Deactivate происходит уже после закрытия формы. Это еще один потенциальный источник трудноуловимых ошибок. Всегда нужно убедиться, что вы не делаете ничего такого в Deactivate, что помешало бы нормальной очистке формы сборщиком мусора. Так, например, установка ссылки на другой объект может стать причиной того, что форма останется в памяти. Если выполняется вызов метода Application.Exit(), когда открыта одна или более форм, события Closing и Closed не возбуждаются. Это важное обстоятельство, особенно если существуют открытые файлы или подключения к базам данных, которые необходимо очистить. Метод Dispose вызывается обязательно, поэтому, возможно, имеет смысл помещать большую часть кода очистки в этот метод. Некоторые свойства, имеющие отношение к запуску формы - это StartPosition, ShowInTaskbar и TopMost. StartPosition может принимать значения из перечисления FormStartPosition: □ CenterParent - форма центрируется в клиентской области родительской формы; □ CenterScreen - форма центрируется на текущем экране; □ Manual - местоположение формы основано на свойстве Location; □ WindowsDefaultBounds - форма располагается в позиции по умолчанию, определяемой Windows, и имеет размеры по умолчанию; □ WindowsDefaultLocation - форма располагается в позиции по умолчанию, определяемой Windows, но ее размеры определяются свойством Size. Свойство ShowInTaskbar определяет, должна ли форма быть доступной в панели задач (taskbar). Это касается только тех случаев, когда форма является дочерней, а вы хо- тите, чтобы в панели задач отображалась только родительская форма. Свойство TopMost сообщает форме, что она должна находиться в верхней позиции Z-порядка приложения. Это справедливо даже для тех случаев, когда форма не получает фокус немедленно. Чтобы пользователи могли взаимодействовать с приложением, они должны видеть форму. Это обеспечивается методами Show и ShowDialog. Метод Show просто делает форму видимой пользователю. В следующем фрагменте кода показано, как создать форму и отобразить ее пользователю. Предположим, что класс формы, которую нужно отобразить, называется MyFormClass: MyFormClass myForm = new MyFormClass(); myForm.Show(); Это - простейший путь. Единственный недостаток состоит в том, что вызывающий код не получает никакого уведомления о том, что форма myForm завершила работу и была закрыта. Иногда это не представляет проблемы, и метод Show будет работать нормально. Если же все-таки требуется какое-то уведомление, лучше воспользоваться методом ShowDialog. Когда вызывается метод Show, то код, следующий за этим вызовом, выполняется немедленно. Когда же вызывается ShowDialog, то вызывающий код блокируется до тех пор, пока форма, чей метод ShowDialog был вызван, не будет закрыта. Но при этом не только вызывающий код блокируется, но еще форма необязательно возвращает значение DialogResult. Перечисление DialogResult представляет собой список идентификаторов, описывающих причину закрытия формы. Они включают OK, Cancel, Yes, No и ряд других. Для того чтобы форма возвратила DialogResult, должно быть установлено ее свойство DialogResult, либо же свойство DialogResult должно быть установлено для одной из кнопок формы. Например, предположим, что часть приложения запрашивает телефонный номер клиента. Форма включает текстовое поле для ввода этого номера и две кнопки: одну с меткой OK и другую - с меткой Cancel (Отмена). Если установить значение свойства DialogResult кнопки OK равным DialogResult.OK, а значение свойства DialogResult кнопки Cancel - DialogResult.Cancel, то когда любая их этих кнопок будет выбрана, форма станет невидимой и вернет вызвавшей ее форме соответствующее значение DialogResult. Теперь представим, что форма не уничтожена, а только свойство Visible установлено в false. Это может понадобиться для того, чтобы получить какую-то информацию от формы. Например, тот же телефонный номер. За счет создания в форме свойства для хранения телефонного номера появляется возможность в родительской форме получить это значение и вызвать метод Close дочерней формы. Код такой дочерней формы может выглядеть следующим образом: namespace FormsSample.DialogSample partial class Phone : Form public Phone() InitializeComponent(); btnOK.DialogResult = DialogResult.OK; btnCancel.DialogResult = DialogResult.Cancel; public string PhoneNumber get { return textBox1.Text; } set { textBox1.Text = value; } Первое, что необходимо отметить - здесь нет никакого кода, обрабатывающего щелчки на кнопках. Поскольку свойство DialogResult устанавливается для каждой из кнопок, форма исчезает с экрана после щелчка либо на OK, либо на Cancel. Единственное добавленное свойство - PhoneNumber. В следующем коде показан метод родительской формы, вызывающей диалог Phone. Phone frm = new Phone(); frm.ShowDialog(); if (frm.DialogResult == DialogResult.OK) { label1.Text = Номер телефона: + frm.PhoneNumber; else if (frm.DialogResult == DialogResult.Cancel) label1.Text = Форма отменена. ; frm.Close(); Это выглядит достаточно просто. Создается новый объект Phone с именем frm. Когда вызывается метод frm.ShowDialog(), выполнение кода родительской формы останавливается и ожидает возврата формы из Phone. После этого можно проверить свойство DialogResult формы Phone. Поскольку в этот момент она еще не уничтожена, а только стала невидимой, вы по-прежнему можете обращаться к ее общедоступным свойствам, одним из которых является свойство PhoneNumber. После получения необходимых данных можно вызвать метод формы Close. Все работает хорошо, но что если возвращенный номер телефона сформати-рован некорректно? Если поместить ShowDialog внутрь цикла, то можно вызывать его повторно и запрашивать повторный ввод значения. Таким образом, в конце концов, получаем правильное значение. Не забудьте, что нужно также обрабатывать DialogResult.Cancel, если пользователь щелкает на кнопке Cancel. Phone frm = new Phone(); while (true) frm.ShowDialog(); if (frm.DialogResult == DialogResult.OK) label1.Text = Номер телефона: + frm.PhoneNumber; if (frm.PhoneNumber.Length == 8 frm.PhoneNumber.Length == 12) break; else MessageBox.Show( Неверный формат номера телефона. Пожалуйста, исправьте. ); else if (frm.DialogResult == DialogResult.Cancel) label1.Text = Форма отменена. ; break; frm.Close(); Теперь, если номер телефона не проходит простую проверку длины, форма Phone появляется вновь, чтобы пользователь смог исправить ошибку. Метод ShowDialog не создает нового экземпляра формы. Любой текст, введенный в форму, останется в ней, поэтому если форма должна быть очищена, это должен будет сделать сам пользователь.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |