Иллюстрированный самоучитель по Tirbo Pascal

       

Воздействие на состояние поля State


В отличие от других полей поле State доступно только для чтения (поля Options, DragMode и GrowMode доступны также и для записи). Это означает, что в программе не может использоваться оператор вида

State := NewState;

Установить новое состояние этого поля можно только с помощью метода SetState, доступного любому видимому элементу. Метод SetState объявлен в Turbo Vision следующим образом:

type

TView = object (TObject) 

Procedure SetState(AState:Word; Enable: Boolean); Virtual;

.....

end;

При обращении к методу параметр AState должен содержать маску разрядов поля State, а признак Enable указывает, должны ли устанавливаться эти разряды (Enable = True) или очищаться (Enable = False).

Отметим, что Turbo Vision вызывает метод SetState всякий раз, когда элемент активизируется или выбирается. Это дает возможность программе устанавливать новое состояние элемента или реагировать на действия пользователя (например, на активизацию видимого элемента). В отличие от этого поля Options, DragMode и GrowMode активизируются только при инициации элемента и далее обычно не меняются.

Видимые элементы часто перекрывают метод SetState, чтобы гибко реагировать на действия пользователя. Например кнопка (объект TButton) просматривает флаги поля State и изменяет свой цвет на бирюзовый, когда становится активной. В следующем примере объект TButton вначале проверяет, принадлежит ли он активному окну, чтобы решить, рисовать себя или нет. Затем он проверяет, выбрана ли кнопка в окне и, если это так, вызывает свой метод MakeDefault, чтобы установить или сбросить (в зависимости от Enable) свою активность по умолчанию:

Procedure TButton.SetState(AState: Word; Enable: Boolean); 

begin



TView.SetState(AState, Enable);

if (AState and (sfSelected + sfActive)) <> 0 then 

DrawView;

if (AState and sfFocused)<> 0 then

MakeDefault(Enable); 

end;

Другой пример: допустим, что Ваша программа включает в себя текстовый редактор и Вы хотите разрешить или запретить все команды редактирования в полосе меню в зависимости от того, открыт редактор или нет. В этом случае Вы можете создать такой метод SetState для текстового редактора:

Procedure TEditor.SetState(AState: Word; Enable: Boolean); 

const

EditorCommands = [cmSearch, cmReplace,cmSearchAgain, 

cmGotoLine, cmFindProc,cmFindError];

begin

TView.SetState(AState, Enable); 

if AState and sfActive <> 0 then

if Enable then EnableCommands(EditorCommands) 

else DisableCommands(EditorCommands);

end;



Содержание раздела