- •Объекты и события в turbo vision.
- •Глава 1. Объекты TurboVision.
- •Глава 2. События.
- •Глава 3. Взаимодействие видимых элементов.
- •Введение
- •Глава 1. Объекты turbo vision.
- •Иерархия объектов TurboVision. Принципы построения иерархии.
- •Примитивные типы объектов. Система координат TurboVision.
- •Видимые элементы.
- •Взаимосвязи между видимыми элементами.
- •Поля State и Options.
- •Выбор и активизация видимых элементов.
- •Глава 2. События.
- •Чтение ввода пользователя.
- •Виды событий.
- •События-сообщения. Команды. Разрешение и запрещение команд.
- •Запись события. Тип tEvent.
- •Цикл событий. Функция Execute.
- •Методы GetEvent и PutEvent. Централизация сбора событий.
- •Обработка событий. Метод HandleEvent.
- •Маршрутизация событий. Переменные FocusedEvents и PositionalEvents. Поле EventMask.
- •Глава 3. Взаимодействие видимых элементов.
- •Посредники.
- •Сообщения между видимыми элементами.
- •3. Кто обрабатывает общие сообщения.
- •4. Вызов процедуры HandleEvent.
Глава 3. Взаимодействие видимых элементов.
Программа на TurboVision инкапсулирована в объекты и код пишется только внутри объектов. Что делать, если объектам требуется обмен информацией с другими объектами программы? В традиционной программе, вероятно, информация будет копироваться из одной структуры данных в другую. В объектно-ориентированной программе это может быть непросто, поскольку объекты могут не знать, где находятся другие объекты.
Если возникла необходимость во взаимодействии видимых элементов, то первый вопрос – правильно ли разделены задачи между двумя видимыми элементами. Проблема может возникать из-за неправильного проектирования программы. Вероятно, два видимых элемента должны быть объединены в один видимый элемент, или часть одного видимого элемента должна быть перемещена в другой видимый элемент.
Посредники.
Если программа спроектирована правильно и видимые элементы требуют взаимодействия между собой, один из способов – создать промежуточный видимый элемент.
Например, предположим, что вы имеете объект электронной таблицы и объект текстового процессора и хотите иметь возможность вставлять что-либо из электронной таблицы в текстовый процессор и наоборот. Вы можете выполнить это прямым взаимодействием видимых элементов. Но если позднее вам понадобится добавить к этой группе объектов, например, базу данных и вставлять в базу и из базы данных, вам потребуется дублировать связь, установленную между первыми двумя объектами, на все три объекта.
Лучшее решение — это установить промежуточный видимый элемент. В этом случае, скажем, «карман». Объект должен знать только, как копировать что-либо в этот карман и как вставить что-либо из кармана. Вне зависимости от того, сколько новых объектов вы добавите в группу, взаимодействие никогда не станет более сложным, чем сейчас.
Сообщения между видимыми элементами.
Если вы тщательно проанализировали вашу ситуацию, решили, что программа спроектирована правильно и что вам не требуется создавать промежуточные элементы, вы можете реализовать простое взаимодействие между двумя видимыми элементами.
До того, как один видимый элемент сможет взаимодействовать с другим, вы можете определить, где находится другой видимый элемент и вероятно даже убедиться, что другой видимый элемент существует в данное время.
Сначала пример. Модуль StdDlg содержит диалоговое окнo TFileDialog (этот видимый элемент открывается в интегрированной среде, когда вы хотите загрузить новый файл). TFileDialog имеет TFileList, который показывает список файлов и директорий, а TFileInputLine отображает текущий файл для загрузки. Каждый раз, когда пользователь выбирает другой файл в TFileList, TFileList должен сообщить об этом объекту TFileInputLine, чтобы тот вывел новое имя файла.
В этом случае TFileList может быть уверен, что TFileInputLine существует, поскольку оба инициализированы внутри одного объекта TFileDialog. Как TFileList сможет сказать TFileInputLine, что пользователь выбрал новое имя файла?
TFileList создает и посылает сообщение внутри метода TFileList.FocusItem, a TFileInputLine.HandleEvent получает его (Item – номер файла в списке):
procedure TFileList.FocusItem(Item: Integer);
var
Event: TEvent:
begin
TSortedListBox.FocusItem(Item); { Вызывает наследуемый метод. }
Message( TopView, evBroadcast, cmFileFocused, List^.At(Item));
{ TopView указывает на текущий модальный видимый элемент;
List^.At(Item) указывает на строку списка, содержащую имя
выбранного файла. }
end;
procedure TFileInputLine.HandleEvent (var Event: TEvent);
var
Name: NameStr;
begin
TInputLine.HandleEvent(Event); { Вызывает наследуемый HandleEvent. }
if (Event.What = evBroadcast) and
(Event.Command = cmFileFocused) and
(State and sfSelected = 0) then
begin
if PSearchRec(Event.InfoPtr)^.Attr and Directory < > 0
then Data^ := PSearchRec(Event.InfoPtr)^.Name +
‘\’ + PFileDialog(Owner)^.WildCard
else Data^ := PSearchRec(Event.InfoPtr)^.Name;
{ Записывает новое имя файла и путь в свое поле данных Data. }
DrawView; { Перерисовка для отображения нового имени файла. }
ClearEvent(Event);
end;
end; .
Message — это функция (модуль Views), которая генерирует событие-сообщение и возвращает указатель на объект (если есть), который обработал это событие.
Объявление функции Message следующее:
function Message(Receiver: PView; What, Command: Word;
InfoPtr: Pointer): Pointer; .
Message создает запись события-сообщения со значениями полей What, Command и InfoPtr, заданными в одноименных параметрах при вызове функции. Затем, если возможно, вызывается Receiver^.HandleEvent для обработки этого события.
Message возвращает nil, если Receiver = nil, или событие не обработано. Если же событие обработано (т.е. Receiver^.HandleEvent возвратил запись события с полем What, установленным в evNothing), то результатом вызова функции Message будет содержимое поля Event.InfoPtr.
TFileList.FocusItem использует расширенный синтаксис TurboPascal (директива компилятора $Х+), чтобы использовать функцию Message как процедуру, поскольку результат, возвращаемый Message, в данном случае не нужен.