Диалоговое окно выбора режима
Подведем некоторые итоги. Мы создали программу, которая погружает пользователя в среду объектно-ориентированного диалога Turbo Vision: она поддерживает командные клавиши, работу с мышью, может сменить каталог или диск, выбрать нужный файл и загрузить его в окно просмотра. Не так плохо для 300 строк программного текста! Наша дальнейшая задача – реализовать другие режимы работы (поиск нужной строки, добавление и уничтожение строк, их изменение). Для двух из них (уничтожение и редактирование строки) в программе необходимо каким-то образом указать ту строку, с которой будет работать пользователь.
Мы уже реализовали эту возможность, предусмотрев в окне просмотра текста управляемый указатель. Поэтому режим просмотра можно принять в качестве основного режима работы с данными. В связи с этим следует несколько изменить метод TNotebook-HandleEvent, предусмотрев в нем автоматический переход в режим просмотра данных в случае успешного открытия файла с данными:
Procedure TNotebook.HandleEvent(var Event: TEvent); {Обработчик событий программы} begin Inherited HandleEvent(Event); if Event.What = evCommand then case Event.Command of cmOpenFile: begin FileOpen; if OpFileF then Work end; ……. end; {TNotebook.HandleEvent}
Как из режима просмотра данных перейти к другим режимам? Возможно несколько решений. Я предлагаю для этих целей воспользоваться командой cmClose (закрыть окно просмотра): в момент, когда пользователь в режиме просмотра данных нажмет клавишу Esc или воздействует мышью на кнопку "Закрыть окно", на экране должно раскрыться диалоговое окно выбора режима, предлагающее одно из пяти возможных продолжений:
- закрыть окно просмотра;
- удалить текущую запись;
- искать нужную запись;
- редактировать текущую запись;
- добавить запись (записи).
Для реализации этой идеи в уже созданный нами обработчик событий TInterior.HandleEvent следует ввести обработку события cmClose:
const {Команды для обработчиков событий:} ……. cmCan=205; cmDelete=206; cmSearch = 207; cmEdit = 208; cmAdd = 209; Function Control: Word; {Создает и использует диалоговое окно выбора режима работы) begin Control: = cmCan end; {Control} {-----------------} Procedure TInterior.HandleEvent (var Event: TEvent); {Обработчик событий для окна данных} Procedure DeleteItem; {Удаляет указанный в Location элемент данных} begin end; {DeleteItem} {-----------------} Procedure AddItem(Edit: Boolean); {Добавляет новый или редактирует старый элемент данных} begin end; {AddItem} {-----------------} Procedure SearchItem; {Ищет нужный элемент} begin end; {SearchItem} {-----------------} var R: TPoint; label Cls; begin {TInterior.HandleEvent} Inherited HandleEvent (Event); case Event. What of evCommand: case Event. Command of cmClose: begin Cls: case Control of{Получить команду из основного диалогового окна} cmCan, cmCancel:EndModal (cmCancel); cmEdit:AddItem (True); cmDelete:DeleteItem; cmSearch:SearchItem; cmAdd:AddItem (False); end end; cmZoom: exit; end; evMouseDown: {Позиционировать мышью} ….. evKeyDown: {Позиционировать клавишами + – } case Event.KeyCode of kbEsc: goto Cls; kbGrayMinus: if Location > Delta.Y then ….. end; {TInterior.HandleEvent}