Система программирования Turbo Pascal



                


Диалоговое окно выбора режима



Диалоговое окно выбора режима


Подведем некоторые итоги. Мы создали программу, которая погружает пользователя в среду объектно-ориентированного диалога 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}

В этом фрагменте мы расширили набор нестандартных команд (константы стпСап, ..., cmAdd), ввели новую функцию Control и предусмотрели необходимые процедуры в теле обработчика событий. Заметим, что режимы редактирования записи и добавления новой записи очень схожи по организации диалога с пользователем, поэтому он» реализуются в рамках одной процедуры AddItem и управляются параметром обращения к ней.

Функция Control используется для создания диалогового окна выбора продолжения. В качестве значения этой функции будет возвращаться одна из пяти новых команд. В начальном варианте функция возвращает команду стСап, что интерпретируется обработчиком событий как указание на завершение работы с диалоговым окном. Поэтому, если Вы вставите указанный текст в программу и запустите ее, поведение программы останется прежним.

Займемся реализацией функции Control. Она должна создать диалоговое окно выбора режима, получить с его помощью команду, идентифицирующую выбранный режим, и вернуть эту команду в качестве своего значения:

Function Control: Word;

{Получает команду из основного диалогового окна} 

const 

X = 1; 

L = 12; 

DX= 13;

But: array [0. .4]of String [13] = {Надписи на кнопках:}

('~1~ Выход ','~2~Убрать ','~3~ Искать ',

'~4~ Изменить ','~5~ Добавить ') ; 

Txt: array [0..3]of String [52] = (

{Справочный текст:}

'Убрать - удалить запись, выделенную цветом', 'Искать - искать запись, начинающуюся нужными буквами', 'Изменить - изменить поле (поля) выделенной записи', 'Добавить - добавить новую запись'); var

R: TRect; 

D: PDialog; 

k: Integer;

begin 

R.Assign(7,6,74,15) ;

D := New{PDialog,Init(R, 'Выберите продолжение:')); 

with D do 

begin

for k := 0 to 3 do {Вставляем поясняющий текст} 

begin

R.Assign(l,l+k,65,2+k);

Insert(New(PStaticText,Init(R,#3+Txt[k]))) 

end;

for k := 0 to 4 do {Вставляем кнопки:} 

begin

R.Assign(X+k*DX,6,X+k*DX+L,8); 

Insert(New(PButton, Init(R,But[k],cmCan+k,bfNormal))) 

end;

SelectNext(False); {Активизируем первую кнопку} 

end;

Control := DeskTopA.ExecView(D); {Выполняем диалог} 

end; {Control}

Сначала создается диалоговое окно с заданными размерами (чтобы программе стал доступен тип TDialog, укажите в предложении Uses модуль Dialogs). Затем в цикле

for k := 0 to 3 do

в окно вставляется поясняющий текст (см. рис.15.10).









Содержание  Назад  Вперед