17.4. Методы createViews и open 293
initWindow, позволяющие в различных фазах инициа лизации выполнить до-
полнительный код, определяемый программистом.
Метод preInitWindow редко используется в приложениях. Он нужен для
добавления тех панелей и меню, которые не может обрабатывать WBP, но
которые должны определяться до построения «реального» окна. Smalltalk
Express при построении окон и управлении ими существенно использу-
ет операционную систему. Любая используемая панель является не только
объектом смолтоковской системы, но и объектом (структурой данных) опе-
рационной системы. Когда создается окно с помощью метода open, метод
preInitWindow выполняется после того, как все панели в окне были созда-
ны как смолтоковские объекты, но прежде, чем будут созданы «реальные»
объекты операционной системы. По этой причине, например, блокировка
и активизация пунктов меню или кнопок на данном этапе создания окна в
методе preInitWindow производиться не может.
Для дополнительной настройки виджетов используется метод initWin-
dow, который, как видно из рис. 17.8, действует после того, как все объекты
окна уже созданы, но перед их визуальным отображением на экране. По-
этому, если внутри метода initWindow попытаться добавить в окно новые
виджеты, этого не произойдет. Но метод initWindow идеально подходит для
решения таких задач, как определение состояния виджетов или установ-
ка содержимого панелей с динамическими данными. Эти данные не могут
быть определены в WBP, поскольку они не известны до начала выполнения
приложения.
Для примера предположим, что надо сделать недоступным пункт edit-
Object из меню Object, основываясь на состоянии некоторой переменной
экземпляра (скажем, theObject), которая получает свое значение только в
момент открытия окна. Пусть переменная инициализируется и окно откры-
вается методом openOn:, который может иметь следующий вид:
openOn: anObject
theObject := anObject.
self open.
Информацию о состоянии переменной theObject для организации бло-
кировки надо использовать до отображения окна, поэтому воспользуемся
методом initWindow, который создадим в следующем виде:
initWindow
(theObject isEditable)
ifFalse: [(self menuTitled: ’Object’) disableItem: ’editObject’.].
Пункт меню editObject будет недоступен, если объект не поддерживает ре-
дактирование. Совершенно аналогично можно поступать и с кнопками.