Турбо Паскаль 6.0




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


Если Вы тщательно проанализировали Вашу ситуацию, решили, что программа спроектирована правильно и что Вам не требуется создавать промежуточные элементы, Вы можете реализовать простое взаимодействие между двумя видимыми элементами. До того, как один видимый элемент сможет взаимодействовать с другим, Вы можете определить где находится другой видимый элемент и вероятно даже убедиться, что другой видимый элемент существует в данное время. Вначале пример. Модуль Stddlg содержит диалоговое окно TFileDialog (этот видимый элемент открывается в интегрированной среде, когда Вы хотите загрузить новый файл). TFileDialog имеет TFileList, который показывает справочник на диске, а файл InputLine отображает текущий файл для загрузки. Каждый раз, когда пользователь выбирает другой файл в FileList, FileList должен сказать FilеInputLine вывести новое имя файла. В этом случае FileList может быть уверен, что FileInputLine существует, поскольку оба инициализированы внутри одного объекта FileDialog. Как FileList сможет сказать FileInputLine, что пользователь выбрал новое имя? FileList создает и посылает сообщение. FileList.FocusItem посылает сообщение, а FileInputLine.HandleEvent получает его:

procedure TFileList.FocusItem(Item: Integer); var Event: TEvent; begin TSortedListBox.FocusItem(Item); { вначале вызывает наследуемый метод } Message(TopView, evBroadcast, cmFileFocused, List^.At(Item)); { TopView указывает текущий модальный видимый элемент } end;

procedure TFileInputLine.HandleEvent(var Event:TEvent); var Name: NameStr; begin TInputLine.HandleEvent(Event); 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; DrawView; end; end;

Message - это функция, которая генерирует событие сообщения и возвращает указатель на объект (если есть), который обработал это событие. Заметим, что TFileList.FocusItem использует расширенный синтаксис Turbo Pascal (директива компилятора $X+), чтобы использовать функцию Message как процедуру, поскольку результат, возвращаемый Message, не нужен.




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