Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lection.doc
Скачиваний:
13
Добавлен:
16.11.2019
Размер:
343.55 Кб
Скачать

Глава 3. Взаимодействие видимых элементов.

Программа на TurboVision инкапсулирована в объекты и код пишется только внутри объектов. Что делать, если объектам требуется обмен информацией с другими объектами программы? В традиционной программе, вероятно, информация будет копироваться из одной структуры данных в другую. В объектно-ориентированной программе это может быть непросто, поскольку объекты могут не знать, где находятся другие объекты.

Если возникла необходимость во взаимодействии видимых элементов, то первый вопрос – правильно ли разделены задачи между двумя видимыми элементами. Проблема может возникать из-за неправильного проектирования программы. Вероятно, два видимых элемента должны быть объединены в один видимый элемент, или часть одного видимого элемента должна быть перемещена в другой видимый элемент.

  1. Посредники.

Если программа спроектирована правильно и видимые элементы требуют взаимодействия между собой, один из способов – создать промежуточный видимый элемент.

Например, предположим, что вы имеете объект электронной таблицы и объект текстового процессора и хотите иметь возможность вставлять что-либо из электронной таб­лицы в текстовый процессор и наоборот. Вы можете выполнить это прямым взаимодействием видимых элементов. Но если позднее вам пона­добится добавить к этой группе объектов, например, базу данных и вставлять в базу и из базы данных, вам потребуется дублировать связь, установленную меж­ду первыми двумя объектами, на все три объекта.

Лучшее решение — это установить промежуточный ви­димый элемент. В этом случае, скажем, «карман». Объект должен знать только, как копировать что-либо в этот кар­ман и как вставить что-либо из кармана. Вне зависимости от того, сколько новых объектов вы добавите в группу, взаимодействие никогда не станет более сложным, чем сей­час.

  1. Сообщения между видимыми элементами.

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

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

Сначала пример. Модуль 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, в данном случае не нужен.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]