ObjectWindows 2.0 предусматривает новый способ манипуляции с данными - модель Doc/View, которая состоит из трех частей:
В данном разделе описываются основные принципы модели Doc/View. Эта модель освобождает программиста и пользователя от необходимости думать от типах данных и о том, как они представляются на экране. Doc/View связывает типы файлов данных с классом документа и классом просмотра. Администратор документов поддерживает список ассоциаций между классами документа и классами просмотра. Каждая ассоциация называется шаблоном документа (не путайте его с шаблонами С++).
Класс документа управляет хранением данных и манипулированием ими. Он содержит информацию, которая выводится на экран. Объекты документов управляют изменениями данных и передачей их в постоянную память (например, на диск).
Когда пользователь открывает документ (существующий или создавая новый документ), он выводится с помощью соответствующего (ассоциированного с ним) класса отображаемого элемента. Класс отображаемого элемента управляет выводом данных на экран и тем, как пользователь взаимодействует с данными на экране. Фактически, отображаемый элемент формирует интерфейс между окном на экране и документом. Некоторые типы документов могут иметь только один ассоциированный с ними класс отображаемого элемента, другие - несколько. Различные типы отображаемых элементов определяют различных характер взаимодействия пользователя с документом.
Концепция традиционного документа и принципы Doc/View во многом различны. Традиционная концепция документов обычно аналогично файлу системы обработки текстов. Такой файл состоит из текста и иногда включает в себя графику и встроенные команды, помогающие системе обработки текста форматировать документ. Doc/View имеет свои характерные особенности:
Базовые функции объекта документа обеспечивает класс TDocument.
Объекты отображаемых элементов служат для представления объектов документов. Без такого объекта вы не могли бы видеть документ и работать с ним. Когда вы в шаблоне документа связываете документ с объектом отображаемого элемента, то получаете функциональный блок данных и кода, которые обеспечивает графическое представление записанных в документе данных и способ взаимодействия с этими данными и их изменения.
Отделение документа от отображаемого элемента допускает также значительную гибкость в том, как и когда модифицируются данные документа. Хотя работа с данными осуществляется через отображаемый элемент, отображаемый элемент только передает изменения в документ. Затем он позволяет определить, нужно ли зафиксировать изменения в документе, или отбросить их.
Еще одно преимущество использования объектов отображаемых элементов по сравнению с методом фиксированного вывода текста состоит в том, что такие объекты предлагают программисту и пользователю ряд различных способов вывода и работы с одним и тем же документом. Вы можете предусмотреть для документа три или четыре отображаемых элемента.
Базовые функции отображаемого элемента обеспечивает класс TView.
Класс документа можно связать с классами отображаемых элементов с помощью шаблона документа, который создается путем определения шаблона класса (класс документа ассоциируется с классом отображаемого элемента) и созданием экземпляра шаблона из этого определенного класса.
После определения шаблона класса вы можете создать любое число его экземпляров. Каждый шаблон связывает единственный класс документа и класс отображаемого элемента. Каждый шаблон имеет имя, заданное по умолчанию расширение имени файла, каталог, флаги и фильтры файла. Таким образом, вы можете создать единственный шаблон класса, который связывает документ с отображаемым элементом. Затем вы можете создать несколько различных экземпляров этого шаблона, и каждый экземпляр будет работать с файлами с различными расширениями в своем заданном по умолчанию каталоге, используя одни и те же классы документа и отображаемого элемента.
Администратор документа поддерживает список используемых в приложении экземпляров шаблона и список текущих документов. Каждое использующее документы Doc/View приложение должно иметь администратор документа, но в каждый момент времени он только один.
Администратор документа объединяет модель Doc/View - классы документа, классы отображаемых элементов и шаблоны. Администратор документа предусматривает заданное по умолчанию меню File и обработку каждого его пункта:
Пункт меню | Обработка |
---|---|
New | Создает новый документ. |
Open... | Открывает существующий документ. |
Save | Сохраняет текущий документ. |
As... | Сохраняет текущий документ под новым именем. |
Revert To Saved | Отменяет изменения в последнем сохраненном документе. |
Close | Закрывает текущий документ. |
Exit | Выходит из приложения, выводя подсказку для сохранения документов. |
После написания документа и классов отображаемых элементов, определения всех необходимых шаблонов и создания экземпляров текущих шаблонов вам потребуется только создать свой администратор документа. После создания администратора он создает список экземпляров шаблона и меню (если это задано в конструкторе). После получения одного из обрабатываемых событий он выполняет заданную для этого события команду.
Шаблоны документа объединяют вместе классы документа и классы отображаемого элемента, создавая новый класс. Администратор документа поддерживает список шаблонов документа, который используется при создании нового экземпляра Doc/View. Ниже поясняется, как создавать и использовать шаблоны документов.
Для создание шаблона класса документа используется макрокоманда DEFINE_DOC_TEMPLATE_CLASS с 3 аргументами: классом документа, классом отображаемого элемента и именем шаблона класса. Классом документа должен быть класс, который вы хотите использовать для включения данных. Класс отображаемого элемента должен быть классом, используемым для вывода содержащихся в классе документа данных. Имя шаблона должно указывать функцию шаблона и не должно быть ключевым словом С++.
После определения шаблона класса вы можете создать любое число экземпляров этого класса. Эти экземпляры можно использовать для различных описаний шаблона, поиска различных заданных по умолчанию файлов, просмотра различных каталогов и т.д. Сигнатура конструктора шаблона класса всегда одинакова и имеет вид:
TplName name(LPCSTR desc, LPCSTR filt, LPCSTR dir, LPCSTR ext, long flags);
где TplName - имя класса, заданного при определении шаблона класса, name - имя данного экземпляра, desc - описание текста шаблона, filt - строка, используемая для фильтрации имен файлов в текущем каталоге (одно или более выражений, разделенных точкой с запятой), dir - заданный по умолчанию каталог для файлов документов, ext - расширение, задаваемое по умолчанию при сохранении файлов, flags - режим открытия и создания документа:
Флаг | Функция |
---|---|
dtAutoDelete | Закрывает и удаляет объект документа при закрытии последнего отображаемого элемента. |
dtNoAutoView | Не создает автоматически заданный по умолчанию отображаемый элемент. |
dtSingleView | Допускает только один отображаемый элемент на документ. |
dtAutoOpen | Открывает документ при создании. |
dtHidden | Скрывает шаблон в списке выбора пользователя. |
После создания экземпляра шаблона вам обычно не требуется модифицировать объект шаблона. Однако иногда требуется изменить характеристики, с которыми построен шаблон. Вы можете сделать это с помощью следующих функций:
Функция | Назначение |
---|---|
GetFileFilter и SetFileFilter | Получают и задают строку, используемую для фильтрации имен файлов в текущем каталоге. |
GetDescription и SetDescription | Получают и задают текст описания шаблона класса. |
GetDirectory и SetDirectory | Используются для получения и задания назначенного по умолчанию каталога. |
GetFlags, SetFlag, IsFlagSet, ClearFlag | Служат для получения и установки значений флага. |
Администратор документа является экземпляром класса, производного от TDocManager или TDocManager, и выполняет ряд задач:
Для поддержки модели Doc/View администратор документа должен подключаться к приложению. Это делается путем создания экземпляра TDocManager и превращения его в администратор документа приложения. К общедоступным данным и функциям администратора документа можно обращаться с помощью функции GetDocManager, которая не имеет параметров и возвращает TDocManager&. Для создания документов и отображаемых элементов администратор документа предусматривает следующие функции:
Для поддержки других средств (например, OLE 2.0) можно использовать специализированный администратор документа.
Конструктор TDocManager имеет единственный параметр, который используется для установки режима администратора документа:
Чтобы открыть администратор документа в режиме SDI, нужно вызвать конструктор с параметром dmSDI, а в режиме MDI - с параметром dmMDI. Другие параметры конструктора задает построение для администратора документа собственное меню File, разрешают в меню File команду Save даже если документ не изменен и запрещают в меню File команду Revert. После построения администратора документа вы не можете изменить режим.
Если при построении объекта TDocManager вы задаете параметр mdMenu, администратор документа обрабатывает определенные события от имени документов. Это делается путем обработки стандартных команд меню с помощью таблицы реакции. Команды меню администратора документа доступны даже при отсутствии открытого документа и независимо от явного добавления в приложение ресурсов. Администратор документов может обрабатывать следующие события:
Сообщение | Значение |
---|---|
CM_FILECLOSE | Закрытие файла. |
CM_FILENEW | Создание нового файла. |
CM_FILEOPEN | Открытие файла. |
CM_FILEREVERT | Отмена изменений файла. |
CM_FILESAVE | Сохранение файла. |
CM_FILESAVEAS | Сохранение файла под новым именем. |
CM_VIEWCREATE | Создание отображаемого элемента. |
В некоторых экземплярах вы можете обрабатывать эти события самостоятельно. Так как поиск в таблице событий администратора документа выполняется в последнюю очередь, вы можете обрабатывать эти события на уровне отображаемого элемента, рамки или приложения. Можно также построить администратор документа без параметра dmMenu и предусмотреть функции для обработки этих событий (обычно через объект приложения или другой интерфейсный объект).
Основной функцией класса документа является обеспечение обратных вызовов для изменений в отображаемом элементе нужных данных, обработки действий пользователей через соответствующие отображаемые элементы и сообщения отображаемым элементам об изменении соответствующих данных.
TDocument - это абстрактный базовый класс, обеспечивающий данные функциональные возможности. Непосредственно создать его экземпляр нельзя, поэтому необходимы производные классы. При построении производного класса вызывается конструктор TDocument. Этот конструктор воспринимает только один параметр TDocument*, который указывает на родительский документ нового документа или равен 0 (по умолчанию).
Обычно следует избегать переопределения функций TDocument, так как они не описаны как virtual. Администратор документа обращается ко всем производным объектам TDocument как к фактическим объектам TDocument. Если вы переопределяете невиртуальную функцию, она не вызывается, когда к ней обращается администратор документа. Вместо этого администратор документа вызывает версию TDocument этой функции. Однако при переопределении виртуальной функции TDocument (~TDocument, InStream, OutStream, Open, Close, Commit, Revert, RootDocument, SetDocPath, SetDocPath, SetTitle, GetProperty, IsDirty, IsOpen, CanClose, AttachStream и DetachStream) администратор документа корректно вызывает вашу функцию. Если функция базового класса выполняет какие-то важные действия, то ее следует вызывать внутри определяемой вами функции.
TDocument предусматривает ряд функций для доступа к данным. Вы можете обращаться к данным в простом последовательном потоке или тем способом, который зададите в производных классах.
TDocument предусматривает две функции InStream и OutStream, которые возвращают указатель на TInStream и TOutStream. Базовые версии этих функций не выполняют никаких действий и возвращают 0. В производном классе их нужно переопределить, чтобы они возвращали указатель на объект. Таким образом вы можете обеспечить в классе документа доступ к потокам.
TInStream и TOutStream - это абстрактные базовые классы, производные от isteam и ostream класса TStream. TStream обеспечивает минимальные функции для связи потока с документом, а isteam и ostream - это стандартные потоки С++. Из TInStream и TOutStream нужно создать производные потоковые классы, специфические для приложения. Эти классы имеют функции для работы с потоками.
Каждый документ поддерживает список открытых потоков, который обновляет при добавлении или удалении потоков. В начале этого списка находится элемент данных StreamList класса TDocument, который указывает первый поток в списке или содержит 0. Каждый объект TStream в списке имеет функцию-элемент NextStream, которая указывает на следующий поток в списке.
Потоки могут обеспечивать только простой последовательный доступ к данным. Если документы содержат файлы мультимедиа, таблицы баз данных или другие сложные данных, то вам потребуются более развитые методы доступа. Для этой цели в TDocument имеется еще две функции доступа - Open и Close, которые вы можете переопределить и задать нужное поведение при открытии и закрытии. На определение открытия документа никаких ограничений не накладывается. Вы можете задать настолько простое или сложное открытие, насколько это требуется.
Close обеспечивает несколько больше функциональных возможностей. Эта функция проверяет существующие дочерние объекты документа и перед закрытием документа пытается закрыть их все. Данная функция позволяет закрыть документ, когда это требуется.
TDocument имеет также ряд функций, позволяющих вам защитить данные. IsDirty проверяет, был ли документ модифицирован. IsOpen проверяет состояние документа (открыт он или нет) или наличие потоков в списке. Commit сохраняет изменения данных в памяти. Revert выполняет действие, обратное Commit.
Как и другие объекты, TDocument предусматривает функции, позволяющие вам закрывать и уничтожать объект. Большую часть операций по очистке выполняет функция ~TDocument. Сначала она уничтожает дочерние объекты и закрывает все открытые потоки и другие ресурсы. Затем она поочередно отсоединяет подсоединенные шаблоны, удаляет список потоков и удаляет себя из списка дочерних объектов (при наличии родительского объекта) или из списка администратора документа.
Кроме деструктора TDocument предусматривает функцию CanClose, обеспечивающую безопасное закрытие и вызывающую функцию FlushDoc администратора документа, которая в случае изменения документа выводит пользователю окно с запросом на сохранение.
Описываемые здесь функции в основном отвечают всем потребностям при работе с классом документа. Однако вы можете расширить функциональные возможности своего класса документа и ввести специальные функции для работы с данными, определения действий с получаемыми от пользователя данными и т.д. Для этого используются производные классы.
Так как модель View/Doc отличается гибкостью, никаких требований или ограничивающих правил здесь не применяется. Документ может работать практически с любым типом данных. Базовые классы ObjectWindows обеспечивают функциональные возможности для расширения модели Doc/View.
TDocument имеет две функции для работы с отображаемыми элементами - NotifyViews и QueryViews, для которых указывается три параметра (событие, параметр события, и TView*). Последний параметр позволяет вам исключить из запроса или уведомления и передать функции указатель на отображаемый элемент. Эти две функции являются основными средствами передачи информации между документом и его отображаемыми элементами.
Обе функции могут работать с таблицами реакции отображаемого элемента. Функцию NotifyViews можно использовать для уведомления дочерних документов, их отображаемых элементов или вашего корневого документа об изменении данных, их обновлении или других событиях, которые должны отражаться на экране. Сначала эта функция вызывает с теми же параметрами функции NotifyViews всех дочерних документов. После этого событие и параметр передается отображаемым элементам документа. Функция возвращает булевское значение, передаваемое соответствующим отображаемым элементом.
QueryViews также передает событие и сопровождающий параметр, но вместо True или False возвращает указатель на первый отображаемый документ, возвращающий True. Это позволяет найти отображаемый элемент, отвечающий некоторым условиям, а затем выполнить с ним некоторые действия. QueryViews останавливается на первом отображаемом элементе, возвращающим True.
Пользователь почти никогда не взаимодействует непосредственно с документом. Он работает с интерфейсным объектом, таким как оно, диалоговое окно или таким типом отображения, который подходит для данных. При этом все функциональные возможности реализуются отображаемые элементы. Отображаемые элементы связывают объекты, получающие данные из объекта документа, и передают их интерфейсному объекту, сообщая ему, как отображать данные.
Непосредственно создать экземпляр TView нельзя. Этот класс содержит ряд виртуальных заменяемых функций, которые должны реализовываться в производных классах. При построении своего производного от TView объекта вы должны вызывать конструктор TView, который имеет один параметр - ссылку на соответствующий документ (объект, производный от TDocument).
TView содержит некоторые виртуальные функции, которые должен в себя включать каждый класс нового отображаемого элемента. Некоторые заменяемые функции не выполняют никаких действий, и в производных классах вы должны их переопределить и при необходимости задать какое-то полезное поведение. Следует переопределять только виртуальные функции TView:
Функция | Назначение |
---|---|
GetViewName | Возвращает статическое имя отображаемого элемента. В производном классе ее требуется определить. |
GetWindow | Возвращает TWindow* - ссылку на интерфейс- ный объект отображаемого элемента или 0. |
SetDocTitle | Задает заголовок окна отображаемого элемента. Его следует задать для вызова функции SetDocTitle отображаемого элемента. |
TView содержит элемент данных ViewMenu TMenuDescr*. Вы можете присвоить ему любой существующий объект TMenuDescr (описатель меню). Меню обычно задается в конструкторе отображаемого элемента.
Сам TView не предусматривает вывода данных. В нем отсутствует указатель на окно, нет графических функций и функций вывода текста, а также функций для работы с клавиатурой. Эти функциональные возможности вы должны обеспечить в производных классах, для чего можно использовать один из следующих методов:
Каждый из этих методов имеет свои преимущества и недостатки, которые обсуждаются ниже.
Чтобы добавить в производном от TView классе указатель на интерфейсный объект, добавьте элемент к новому классу и создайте к конструкторе класса отображаемого элемента экземпляр объекта. Доступ к данным интерфейсного объекта и его функциям-элементам можно получить через указатель.
Такой метод позволяет вам легко подключать и отключать различные интерфейсные объекты и использовать различные их типы. Например, создав указатель TWindow*, можно использовать большинство видов интерфейсных объектов.
Недостатком является то, что обрабатываемое событие проходит сначала через интерфейсный объект или приложение. Это вынуждает вас либо использовать для добавления функций обработки событий производный интерфейсный объект, либо обрабатывать событие через объект приложения. В любом случае это уменьшает гибкость при обработке событий.
Смешивание TView или производного от TView объекта с производным объектом дает вам возможность вывести данные из документа с обработкой потока передаваемых в документ и из документа данных. Это несложная, но требующая аккуратности задача.
Чтобы создать новый производный класс, определите этот класс на основе базового класса отображаемого документа (TView или производного от TView класса) и выбранного интерфейсного объекта. Новый конструктор должен вызывать конструкторы обоих базовых классов. Как минимум, этот новый класс должен определять все виртуальные функции базовых классов. Там следует также определить специализированные функции для работы с экраном и функции обработки событий, взаимодействующие с интерфейсным элементом и объектом документа.
Этот подход имеет то преимущество, что полученный в результате отображаемый элемент будет в высокой степени интегрированным. Обработка ошибок выполняется централизованно, что уменьшает необходимость делать это на уровне приложения. Управление интерфейсными элементами осуществляется не через указатель, а также интегрирована в новый класс отображаемого элемента. Однако данный метод не дает такой гибкости, как использование указателя. Вы не можете также обмениваться различными типами объектов с помощью базового указателя на различные классы интерфейсных объектов.
Как и большинство других объектов, TView предусматривает функции, обеспечивающие надежное закрытие и уничтожение объекта. ~TView делает немного. Она вызывает функцию DetachView соответствующего документа, удаляя себя из списка отображаемых элементов документа. Функция CanClose TView вызывает функцию CanClose соответствующего документа.
Обычно события Doc/View обрабатываются через объект приложения и интерфейсный элемент вашего отображаемого элемента. Вы можете управлять выводом на экран отображаемого элемента через указатель или смешивать функциональные возможности интерфейсного объекта с классом отображаемого элемента.
Объект приложения управляет обычно только несколькими событиями, указывающими на создание или уничтожение документа или отображаемого элемента. Событие dnCreate генерируется при создании отображаемого элемента или документа, а dnClose - при их закрытии. Чтобы задать для этих событий таблицу реакции, добавьте в нее макрокоманды EV_OWLDOCUMENT и EV_OWLVIEW.
Файл заголовка docview.h предусматривает ряд макрокоманд для таблицы реакции, а также функции обработки и проверки типов. С помощью NOTIFY_SIG и VN_DEFINE вы можете также определить собственные функции и события.
Имеется ряд предопределенных событий Doc/View. Каждое такое событие имеет соответствующую макрокоманду таблицы реакции и сигнатуру функции-обработчика. Модель Dec/View не предусматривает версий этих функций. Вы должны определить эти функции в своем производном классе и задать соответствующие действия.
Макрокоманда | Событие |
---|---|
EV_VN_VIEWOPENED | Построение нового отображаемого элемента. |
EV_VN_VIEWCLOSED | Уничтожение нового отображаемого элемента. |
EV_VN_DOCOPENED | Открытие нового документа. |
EV_VN_DOCCLOSED | Закрытие нового документа. |
EV_VN_COMMIT | Изменения, внесенные в данные в отображаемом элементе должны быть зафиксированы в документе. |
EV_VN_REVERT | Изменения, внесенные в данные в отображаемом элементе должны быть отменены. |
EV_VN_ISDIRTY | Если изменения еще не зафиксированы в документе, следует возвратить True, иначе False. |
EV_VN_ISWINDOWS | Если параметр HWND совпадает с HWND окна отображаемого элемента, следует возвратить True. |
Для генерации собственных событий отображаемых элементов и определения соответствующих макрокоманд и функций обработки событий таблицы реакции вы можете использовать макрокоманды VN_DEFINE и NOTIFY_SIG.
Во-первых, нужно определить имя события, которое вы хотите обрабатывать. По соглашению оно должно начинаться с vn. Для задания сигнатуры функции обработки события используйте макрокоманду NOTIFY_SIG, а для определения самой макрокоманды - VN_DEFINE. Эта макрокоманда имеет три параметра: имя события, имя функции обработки события и размер параметра для функции обработки события.
Каждый документ и объект отображаемого элемента содержит список характеристик, а также функции, которые вы можете использовать для опроса и изменения этих характеристик. Характеристики содержат информацию об объекте и его свойствах. Когда администратор документа создает или уничтожает документ или объект отображаемого элемента, он посылает приложению уведомляющее событие. Для определения нужных действий приложение может опросить характеристики объекта. Отображаемые документы также имеют доступ к характеристикам соответствующего документа.
TDocument и TView имеют некоторые общие характеристики. Эти характеристики доступны в любых классах, производных от TDocument и TView. Эти характеристики индексируются списком перечислимых значений. Первой характеристикой каждого производного от TDocument и TView класса должна быть PrevProperty, а последним значением в списке характеристик - NextProperty. Эти два значения ограничивают список характеристик и обеспечивают, что в производных классах список характеристик будет начинаться с корректного значения. PrevProperty следует установить в значение NextProperty-1 ближайшего базового класса.
Имена характеристик обычно содержатся в массиве строк. Позиция каждого имени в массиве соответствует индексу характеристики. Однако при добавлении характеристик в производный класс вы можете сохранять и обращаться к характеристикам любым способом, но сложные схемы лучше не использовать.
Атрибуты характеристик также обычно содержатся в массиве (значений int). Вы можете работать с ними произвольным образом, но обычно их индекс соответствует индексу характеристики. Атрибуты определяют доступ к характеристике:
Атрибут | Функция |
---|---|
pfGetText | Доступ в текстовом формате. |
pfGetBinary | Доступ в собственном нетекстовом формате. |
pfConstant | Характеристику нельзя изменить после создания объекта. |
pfSettable | Характеристику можно устанавливать с указанием собственного формата. |
pfUnknown | Определена, но недоступна в объекте this. |
pfHidden | Характеристика должна быть скрыта от нормального просмотра (но пользователь может видеть ее имя или значение). |
pfUserDel | Характеристика определена пользователем на этапе выполнения. |
TDocument и TView предусматривают ряд функций для доступа к информации о характеристиках объекта Doc/View. Все эти функции описаны как виртуальные, поэтому функции в последних производных классах вызываются первыми и могут переопределять характеристики, определенные в базовых классах. Каждый класс должен реализовывать доступ к характеристикам.
Обычно к характеристике обращаются по индексу. Для поиска соответствующего индекса используется функция FindProperty, которая по имени характеристики возвращает ее индекс. Обратное действие (поиск имени по индексу) выполняет функция PropertyName. Атрибуты характеристики устанавливает функция PropertyFlags, в параметре которой указывает индекс характеристики. Определить значение флага можно с помощью операции &.
Для получения и модификации значений характеристик используются функции GetProperty и SetProperty.
Элементы пользовательского интерфейса, которые облегчают передачу ввода пользователя, называются объектами управляющих элементов или объектами управления. Это стандартные элементы интерфейса с пользователем со специализированным поведением. ObjectWindows предусматривает несколько специализированных управляющих элементов, а также обеспечивает для них интерфейсные объекты, так что вы можете использовать их в приложения. Интерфейсные объекты для управляющих элементов называются объектами управляющих элементов.
Классы управляющих элементов ObjectWindows перечислены в следующей таблице:
Управляющий элемент | Класс | Использование |
---|---|---|
Блок списка | TListBox | Прокручивающийся список элементов, например, файлов, из которого можно осуществить выбор. |
Полоса прокрутки | TScrollBar | Обычная полоса прокрутки, подобная полосам прокрутки в окнах и блоках списков. |
Командная кнопка | TButton | Кнопка нажатия с соответствующим текстом. |
Кнопка с независимой фиксацией | TCheckBox | Блок, который может включен или выключен, с соответствующим текстом. |
Кнопка с зависимой фиксацией | TRadioButton | Кнопка, которая может быть выбрана или нет. Обычно используется при взаимно исключающем выборе. |
Блок группы | TGroupBox | Статичный прямоугольник с текстом в верхнем левом углу, использующийся для объединения других управляющих элементов. |
Редактируемый управляющий элемент | TEdit | Поле для ввода текста пользователем. |
Статический управляющий элемент | TStatic | Текстовое поле, которое не может быть модифицировано пользователем. |
Комбинированный блок | TComboBox | Комбинация блока списка и редактируемого управляющего элемента. |
Регулятор | THSlider TVSlider | Горизонтальные и вертикальные управляющие элементы, в которых пользователь может выбирать нужный диапазон (аналогично полосам прокрутки). |
Индикатор | TGauge | Статический управляющий элемент, показывающий ход выполнения процесса. |
Примеры программ с этими элементами можно найти в каталогах OWL\OWLAPI и OWL\OWLAPPS.
Для Windows управляющие элементы являются просто специальными окнами; в ObjectWindows, поэтому TControl является производным из TWindow. Классы, производные от TControl, представляют управляющие элементы Windows. В своих прикладных программах вы будете использовать экземпляры классов, описанных в приведенной выше таблице.
Объекты управляющих элементов и объекты окон аналогичны в том, что они ведут себя как дочерние окна, и вы можете создавать и уничтожать их. Однако стандартные управляющие элементы отличаются от других окон тем, что обрабатывает их сообщения и отображает эти элементы Windows. Специализированные управляющие элементы ObjectWindows выполняют эти задачи самостоятельно.
Во многих случаях вы можете непосредственно создать экземпляры перечисленных классов. Однако иногда может потребоваться создать производные классы со специализированном поведением.
Построение объекта управляющего элемента отличается от построения любого другого дочернего окна. Обычно конструктор родительского окна вызывает конструкторы всех его дочерних окон. Кроме обычных связей, управляющие элементы взаимодействуют с родительскими окнами с помощью уведомлений. Чтобы построить и инициализировать объект управляющего элемента нужно:
Часто при построении в окне управляющего элемента нужно сохранять указатель на управляющий элемент в элементе данных оконного объекта. Это делается для удобства доступа к функциям-элементам управляющего элемента. Для тех управляющих элементов, с которыми вы манипулируете редко (таких как статические элементы и групповые блоки), такой указатель не требуется.
Некоторым конструкторам управляющих элементов передаются параметры, определяющие характеристики объектов управляющих элементов. Это следующие параметры:
Существуют также конструкторы, связывающие объект управляющего элемента с интерфейсным элементом, созданными из определения ресурса.
Все управляющие элементы получают используемые по умолчанию стили окна WS_CHILD, WS_VISIBLE, WS_GROUP и WS_TABSTOP. Для изменения стиля управляющего элемента используется его Attr.Style. Каждый тип управляющего элемента имеет также собственные стили, определяющие его конкретные характеристики. Стили окна наследуются из базовых классов. С помощью операций |= и &= вы можете задать маску стиля.
Интерфейсный элемент управляющего объекта автоматически создается функцией-элементом SetupWindow, которая наследуется из объекта родительского окна. Инициализировать управляющие элементы в конструкторе объекта родительского окна нельзя, так как в этот момент они еще не созданы.
Для вывода управляющих элементов на экране вызывать функцию Show не нужно. Управляющие элементы - это дочерние окна, и Windows автоматические выводит и отображает их вместе с родительским окном. Однако Show можно использовать для вывода или сокрытия управляющего элемента, когда это требуется сделать.
За уничтожение управляющих элементов отвечает родительское окно - они уничтожаются вместе с этим окном.
Взаимодействие объекта окна со своими управляющими объектами в чем-то аналогично взаимодействию с управляющими элементами объекта диалогового блока. Как и диалоговому блоку, окну требуется механизм для манипулирования управляющими элементами и реакции на их события.
Одним из способов манипулирования в диалоговых блоках управляющими элементами является передача их сообщений с помощью функций-элементов, наследуемых из TWindow. Объекты управляющих элементов сильно упрощают этот процесс, обеспечивая соответствующие функции-элементы. Когда пользователь взаимодействует с управляющим элементом, Windows посылает различные управляющие сообщения.
Диалоговый блок для циклического перемещения по управляющим элементам позволяет использовать клавишу Tab. Для выбора в групповом блоке кнопки с независимым элементом пользователь может также использовать клавиши стрелок. Разрешить такой клавиатурный интерфейс можно с помощью вызова в конструкторе окна EnableKBHandler.
Каждый тип управляющего элемента в чем-то отличен от других. Ниже рассказывается, как использовать объекты стандартных управляющих элементов ObjectWindows.
С помощью такого блока пользователь может выбирать что-либо из списка. Класс TListBox инкапсулирует блоки списка и определяет функции-элементы для создания блоков списка, модификации элементов списка, запроса о списке элемента и поиска выбранного пользователем элемента.
Один и конструкторов TListBox имеет 7 стандартных параметров конструктора объекта управляющего элемента: родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, а также необязательный идентификатор библиотеки.
TListBox получает заданные по умолчанию стили управляющего элемента и добавляет LBS_STANDARD - комбинацию LBS_NOTIFY, WS_VSCROLL (для вывода вертикально полосы прокрутки), LBS_SORT (для сортировки списка по алфавиту) и WS_BORDER (для вывода рамки). Если вы хотите получить другой стиль, то можете модифицировать Attr.Style (в конструкторе объекта блока списка или родительского объекта).
После создания блока списка его нужно заполнить элементами (строками). После этого вы можете включать, добавлять, удалять элементы из списка или очищать его. Для этого используются функции ClearList, DirectoryList, AddString, InsertString, DeleteString, SetSelIndex, SetSel, SetSelString, SetSelStrings, SetSelIndexes, SetSelItemRange, SetTopIndex, SetTabStops, SetHorizontalExtent, SetColumnWidth, SetCaretIndex, SetItemData, SetItemHeight.
Существует также несколько функций-элементов, с помощью которых вы можете получить информацию о блоке списка или его элементах. Это функции: GetCount, FindString, FindExactString, GetTopIndex, GetCaretIndex, GetHorizontalExtent, GetItemData, GetItemHeight, GetItemRect, GetSelCount. GetSelIndex, GetSel, GetSelString, GetSelStrings, GetSelInbdexes, GetString, GetStringLen.
Функции-элементы для модификации и опроса блоков списка позволяют вам установить значения или определить в каждый конкретный момент состояние нужного управляющего элемента. Однако, чтобы знать, что пользователь делает с блоком списка на этапе выполнения, нужно отвечать на уведомляющие сообщения от управляющего элемента.
Пользователь может прокручивать список или щелкать на элементе "мышью". При этом Windows посылает родительскому окну блока списка уведомляющее сообщение. Обычно функции реакции на такое сообщение определяются в объекте родительского окна.
Статические управляющие элементы обычно представляют собой неизменяемые блоки текста или простую графику. Пользователь не взаимодействует с такими элементами, хотя ваше приложение может изменять его текст. Примеры вы можете найти в подкаталоге EXAPMLES\OWL\OWLAPI\STATIC.
Так как пользователь не взаимодействует со статическим элементом, приложение не получает от статических управляющих элементов уведомляющих сообщений. Таким образом, если вы не собираетесь им манипулировать, идентификатор управляющего элемента может не указываться.
Конструктор TStatic воспринимает обычно стандартных 7 параметров объектов управляющих элементов и два специальных параметра - текстовую строку статического управляющего элемента и ее максимальную длину (включая завершающий 0). TStatic получает заданные по умолчанию стили управляющего элемента, добавляет SS_LEFT (для выравнивания текста влево) и удаляет стиль WS_TABSTOP (чтобы предотвратить перемещение на данный элемент по клавише Tab). Чтобы изменить стиль, модифицируйте в конструкторе объекта статического управляющего элемента Attr.Style.
TStatic имеет две функции-элемента для изменения текста статического управляющего элемента: SetText задает текст элемента в соответствии с переданной строкой, а Clear стирает текст. Изменить текст статического управляющего элемента, созданного со стилем SS_SIMPLE, вы не сможете.
Функция TStatic::GetTextLen возвращает длину текста статического управляющего элемента. Чтобы получить сам текст, используйте TStatic::GetText.
Командные кнопки выполняют действия при каждом "нажатии" (активизации) такой кнопки. Существует два вида таких кнопок: заданные по умолчанию и остальные. Заданная по умолчанию командная кнопка имеет стиль BS_DEFPUSHBUTTON и обрамление, указывающее реакцию по умолчанию. Другие кнопки имеют стиль BS_PUSHBUTTON. Примеры управляющих элементов типа командных кнопок вы можете найти в подкаталоге EXAMPLES\OWL\OWLAPI\BWCC.
Один и конструкторов TListBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс текстовую строку (метку управляющего элемента) и булевский флаг, указывающий, является ли кнопка заданной по умолчанию.
Когда пользователь щелкает на командной кнопке "мышью", родительское окно получает уведомляющее сообщение. Если родительский оконный объект перехватывает сообщение, то он может отвечать на эти события, выводя диалоговое окно, сохраняя файл и т.д. Для перехвата и реакции на сообщения командных кнопок определите для кнопки функцию реакции на команду.
Кнопка с независимой фиксацией (check box) обычно предоставляет пользователю возможность выбора из двух состояний. Пользователь может выбрать этот управляющий элемент, отменить его выбор или оставить его как есть. В группе кнопок с независимой фиксацией вы можете выбрать любой из этих управляющих элементов или все эти элементы.
Кнопки с зависимой фиксацией (radio button) используются для выбора одной из взаимоисключающих возможностей.
Класс TCheckBox является производным от TButton и представляет кнопки с независимой фиксацией, а класс TRadioButton, представляющий кнопки с зависимой фиксацией, является производным от TCheckBox (кнопки с независимой фиксацией и зависимой фиксацией частично имеют общее поведение).
Кнопки с зависимой и независимой фиксацией называют иногда блоками выбора. Такой управляющий элемент выводится на экран в виде выбранного или невыбранного блока. Примеры этих управляющих элементов вы можете найти в подкаталоге EXAMPLES\OWL\OWL\OWLAPI\BUTTON.
TCheckBox и TRadioButton имеют конструктор с 7 стандартными параметрами конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс указатель на текстовую строку и указатель на групповой блок, объединяющий блоки выбора (или 0, если такого группового блока нет).
Кнопки с независимой фиксацией по умолчанию имеют стиль BS_AUTOCHECHBOX. Это значит, что Windows обрабатывает щелчок "мышью" на этой кнопке, переключая ее состояния. При отсутствии такого стиля состояние кнопки требуется устанавливать вручную. Кнопки с зависимой фиксацией по умолчанию имеют стиль BS_AUTORADIOBUTTON. Это значит, что Windows обрабатывает щелчок "мышью" на этой кнопке, переключая ее состояния, отменяя выбор всех других кнопок в группе. При отсутствии такого стиля нужно перехватывать уведомляющие сообщение и устанавливать состояние кнопки вручную.
В некоторых случаях управлять состоянием кнопки может не пользователь, а приложение. TCheckBox определяет несколько функций-элементов для модификации состояния кнопки с независимой фиксацией: Check, SetCheck, Uncheck, Toggle, SetState и SetStyle, которые отменяю и устанавливают выбор кнопки, переключают ее, подсвечивают и изменяют стиль кнопки. При использовании этих функций для кнопки с независимой фиксацией ObjectWindows обеспечивает выбор в группе только одной кнопки.
Опрашивая блок выбора, вы можете отреагировать на его состояние. Кнопки с зависимой фиксацией имеют два состояния: выбрана (BF_CHECKED) и не выбрана (BF_UNCHECKED). Блоки с независимой фиксацией имеют необязательное третье состояние (BF_GRAYED). Для опроса состояния используются функции GetCheck и GetState.
В своей простейшей форме групповой блок помечается как статический прямоугольник, визуально группирующий другие управляющие элементы.
Конструктор TListBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс текстовую строку, помечающую группу.
Обычно групповой блок объединяет другие управляющие элементы, однако он может также логически объединять группы кнопок. Эти логические группы выполняют автоматическую отмену выбора (BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON). Чтобы добавить к групповому блоку кнопку с зависимой или независимой фиксацией, передайте указатель на объект группового блока при вызове конструктора кнопки.
При наступлении события, которое может изменить выбор в групповом блоке Windows посылает родительскому окну группового блока уведомляющее сообщение. Родительское окно может перехватывать сообщение для группового блока в целом, а не отвечать на выбор отдельных кнопок. Для определения задействованного управляющего элемента вы можете получить текущее состояние каждой кнопки.
Полосы прокрутки - это основной механизм изменения пользовательского отображаемого элемента в окне приложения, блока списка или комбинированного блока. Однако для выполнения специальной задачи вы можете построить отдельную полосу прокрутки. Для этого используются объекты TScrollBar. Примеры вы можете найти в подкаталоге EXAMPLES\OWL\OWLAPI\SCROLLER.
Конструктор TScrollBar имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, и также необязательный идентификатор библиотеки), а также параметр флага, определяющий, является ли полоса прокрутки горизонтальной. Если вы задаете нулевую высоту или ширину полосы прокрутки, то Windows устанавливает стандартные ширину или высоту.
Конструктор TScrollBar строит полосы прокрутки со стилем SBS_HORZ (горизонтальная) или SBS_VERT (вертикальная полоса). С помощью Attr.Style объектов полосы прокрутки вы можете задать дополнительные стили.
Одним из атрибутов полосы прокрутки является диапазон, который устанавливает все возможные позиции скользящего маркера полосы прокрутки. Каждая позиция связывается с целым значением. Родительское окно использует это значение для установки или опроса полосы прокрутки. По умолчанию диапазон объекта составляет от 1 до 100. Минимальная позиция скользящего маркера (верхний конец вертикальной полосы или левый конец горизонтальной) устанавливается в 1. Другой диапазон можно задать с SetRange.
Полоса прокрутки имеет два важных атрибута - размер строки (инициализируется значением 1) и размер страницы (по умолчанию 10). Эти значения задаются в единицах диапазона. Их можно изменить с помощью элементов данных TScrollBar LineMagnitude и PageMagnitude.
TScrollBar имеет две функции-элемента для опроса полосы прокрутки: GetRAnge (получает диапазон) и GetPosition (получает текущую позицию указателя). Модификация полос прокрутки обычно выполняется пользователем, но ваше приложение может изменить их непосредственно с помощью функций-элементов SetRange (устанавливает диапазон прокрутки), SetPosition (устанавливает позицию маркера) и DeltaPos (перемещает маркер).
Когда пользователь перемещает скользящий маркер полосы прокрутки или щелкает "мышью" на клавишах стрелок, Windows посылает родительскому окну уведомляющее сообщение. Если вы хотите, чтобы окно отвечало на события прокрутки, то нужно отвечать на уведомляющие сообщения. Обычно для этого получается текущая позиция маркера и выполняются соответствующие действия.
Можно также отвечать на уведомляющие сообщения полосы прокрутки, вызываемые буксировкой "мышью" маркера. При этом эффективнее подождать, пока пользователь не остановит буксировку маркера, а затем ответить на это. Можно также задать реакцию объекта полосы прокрутки на его собственные уведомляющие сообщения. TWindow имеет встроенную поддержку диспетчеризации таких сообщений.
Регуляторы (slider) - это специализированные объекты прокрутки. Класс TSlider является производным от TScrollBar. Регуляторы используются для позиционирования информации без прокрутки. TSlider имеет два производных класса - THSlider и TVSlider (вертикальная и горизонтальная версия).
Индикаторы - это управляющие элементы, которые выводят на экран информацию о продолжительности или другую информацию о выполняющемся процессе. Индикаторы реализует класс TGauge, производный от TControl. Параметр конструктора определяет, хотите вы получить вертикальный или горизонтальный индикатор (вертикальные обычно используются для вывода аналоговой информации). Примеры таких управляющих элементов вы можете найти в подкаталоге EXAMPLES\OWL\OWLAPI\SLIDER.
Редактируемые управляющие элементы - это интерактивные статические управляющие элементы. Они представляют собой прямоугольную область экрана, которая может заполняться текстом, модифицироваться или очищаться пользователем или приложением. Они поддерживают следующие операции:
Примеры содержатся в подкаталоге EXAMPLES\OWL\OWLAPI\VALIDATE.
Один из конструкторов TEdit имеет параметры начальной строки текста, максимальной длины строки текста и флаг, определяющий, является ли текстовый управляющий элемент многострочным.
По умолчанию редактируемый управляющий элемент имеет стили ES_LEFT (выравнивание влево), ES_AUTOHSCROLL (автоматическая горизонтальная прокрутка) и WS_BORDER (видимое обрамление управляющего элемента). Многострочные элементы имеют дополнительно стили ES_MULTILINE (многострочный), ES_AUTOSCROLL (автоматическая вертикальная прокрутка), WS_VSCROLL (вертикальная полоса прокрутки) и WS_HSCROLL (горизонтальная полоса прокрутки).
С помощью функций-элементов TEdit вы можете передавать текст между редактируемым управляющим элементом и буфером обмена Clipboard. Обычно пользователи могут обращаться к этим функциям через выводимое в окне меню Edit. Редактируемые управляющие элементы имеют встроенную реакцию на пункты этого меню, такие как Copy или Undo.
Функция-элемент | Команда меню | Описание |
---|---|---|
Copy | CM_EDITCOPY | Копирование текста в буфер Clipboard. |
Cut | CM_EDITCUT | Вырезание текста включение его в буфер. |
Undo | CM_EDITUNDO | Отмена последнего редактирования. |
Paste | CM_EDITPASTE | Вставка текста из буфера. |
DeleteSelection | CM_EDITDELETE | Удаление выделенного текста. |
Clear | CM_EDITCLEAR | Очистка всего редактируемого элемента. |
Чтобы добавить в окно меню редактирования, определите ресурс меню. Писать новые функции-элементы не потребуется.
TEdit имеет ряд функций опроса. Это функции IsModified, GetText, GetLine, GetNumLines, GetLineLength, GetSelection, GetSubText, GetLineIndex, GetLineFromPos, GetRect, GetHandle, GetFirstVisibleLine, GetPasswordChar, GetWordBreakProc и CanUndo.
Текст, который занимает в редактируемом управляющем элементе несколько строк, содержит дополнительные символы - возврат каретки и перевод строки. При возврате текста из такого управляющего элемента функции элементы TEdit сохраняют это форматирование.
TEdit поддерживает операции изменения текста, а также позволяет прокручивать редактируемый управляющий элемент. Для этих операций используются функции Clear, DeleteSelection, DeleteSubText, DeleteLine, Insert, Paste, SetText, SetSelection, Scroll, ClearModify, Search, SetRect, SetRectNP, FormatLines, SetTabStops, SetHandle, SetPasswordChar, SetReadObly, SetWordBreakProc и EmptyUndoBuffer.
Управляющий элемент типа комбинированного блока представляет собой комбинацию двух других управляющих элементов - блока списка и редактируемого или статического управляющего элемента. Он выполняет те же функции, что и блок списка - позволяет пользователю щелчком "мышью" выбрать один текстовый элемент из прокручиваемого списка. Редактируемый управляющий элемент в верхней части блока списка предусматривает еще один механизм выбора, позволяя пользователям набирать текст нужного элемента, который автоматически выделяется в области блока списка. TComboBox является производным от TListBox и наследует его функции-элементы для модификации, опроса и выбора элементов списка. Кроме того, TComboBox предусматривает функции-элементы для манипуляции со списком комбинированного блока, который в некоторых типах комбинированного блока может раскрываться по запросу. Примеры можно найти в подкаталоге OWLAPPS\OWLCMD.
Существуют 3 типа комбинированных блока: простой, раскрывающийся и раскрывающийся со списком. Все эти комбинированные блоки выводят свою область редактирования, но блок списка в некоторых из них может быть скрыт.
Простой комбинированный блок не может скрывать свою область списка. Его область редактирования ведет себя как редактируемый управляющий элемент. Пользователь может вводить и редактировать текст, не обязательно совпадающий с одним из элементов списка.
Комбинированный блок с раскрывающимся списком ведет себя как простой комбинированный блок, однако в начальном состоянии область списка не выводится. Она появляется после щелчка "мышью" на пиктограмме справа от области редактирования.
Область списка комбинированного блока с раскрывающимся списком ведет себя как область списка раскрывающегося блока и выводится только при необходимости. Эти два типа комбинированных блоков отличаются только поведением области редактирования, которая в комбинированном блоке с раскрывающимся списком ограничивается выводом текста только одного из элементов списка.
Комбинированные блоки с раскрывающимся списком полезно использовать, когда нужно ограничить выбор только теми элементами, которые содержатся в списке. Раскрывающиеся комбинированные блоки могут воспринимать записи, отличные от элементов списка.
Конструктор TComboBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, а также необязательный идентификатор библиотеки), а также стиль и максимальную длину текста.
Комбинированный блок имеет стили WS_CHILD, WS_VISIBLE, WS_GROUP, WS_TABSTOP, CBS_SORT (для сортировки элементов списка), CBS_AUTOHSCROLL (позволяет пользователю вводить больше текста, чем помещается в видимой области редактирования) и WS_VSCROLL (вертикальная полоса прокрутки). Параметр стиля определяет тип комбинированного блока Windows и может задаваться как CBS_SIMPLE, CBS_DROPDOWN или CBS_DROPDOWNLIST. Длина текста задает максимальное число символов, выводимых в области редактирования.
TComboBox определяет несколько функций-элементов для списка комбинированного блока и области редактирования: SetText, SetEditSel, Clear, ShowList, HideList и SetExtendedUI. Для опроса содержимого редактируемого элемента комбинированного блока и областей списка TComboBox наследует несколько функций-элементов из TListBox: GetTextLen, GetText, GetEditSel, GetDroppedControlRect, GetDroppedState, GetExtendedUI.
Для управления сложными диалоговыми блоками или окнами с несколькими управляющими элементами вы должны создать для сохранения и считывания состояния управляющих элементов окна и диалогового блока производный класс.
Вместо создания производного класса вы можете использовать структуру, представляющую состояния управляющих элементов. Такая структура называется буфером передачи, так как состояния управляющего элемента передается от управляющих элементов в буфер и в управляющие элементы из буфера.
Механизм передачи требует для представления управляющих элементов, которым вы хотите передавать данные, использования объектов ObjectWindows. Для использования механизма передачи вам необходимо следующее:
Буфер передачи - это структура, каждый элемент которой соответствует участвующему в передаче управляющему элементу. Эти элементы называются переменными экземпляра. В передаче могут участвовать не все управляющие элементы.
Чтобы определить буфер передачи, определите для каждого участвующего управляющего элемента переменную экземпляра. Каждый тип управляющего элемента имеет разную информацию для хранения.
Так как блокам списков требуется передавать различные части информации (строки, элементы данных и индексы выбора), буфер передачи использует класс TListBoxData с несколькими функциями-элементами для работы с информацией блока списка (AddItemData, AddString, AssStringItem, GetSelString, GetSelStringLenght, ResetSelections, Select и SelectString) и элементами данных (ItemDatas, SelIndices и Strings).
Для передачи данных комбинированного блока используется класс TComboBoxData с элементами данных ItemDatas, Selection и Strings и функциями-элементами AddItemData, AddString и AddStringItem.
Окно или диалоговый блок, использующие механизм передачи, должны строить свои объекты управляющих элементов в том порядке, в котором определены элементы соответствующего буфера передачи. Для разрешения передачи используйте вызов SetTransferBuffer с указателем на буфер передачи.
Так как объекты диалоговых окон получают свои определения и определения своих управляющих элементов из ресурса, вам следует строить объекты управляющих элементов с помощью конструкторов, использующих идентификаторы ресурса. Чтобы явно исключить управляющий элемент из механизма передачи, используйте функцию-элемент DisableTransfer.
Для управляющих элементов, которые строятся в окне, механизм передачи по умолчанию запрещен. Чтобы разрешить его, вызовите функцию-элемент EnableTransfer.
В большинстве случаев передача данных в окно и из него выполняется автоматически, но вы можете в любой момент передать данные явным образом.
Передача в окно происходит автоматически при построении оконного объекта. Для создания интерфейсного элемента, представляющего оконный объект, конструктор вызывает SetupWindow. Затем для загрузки данных из буфера передачи вызывается TransferData. SetupWindow оконного объекта вызывает функции SetupWindow каждого дочернего окна, так что дочерние окна также могут передавать свои данные. Так как родительское окно устанавливает свои дочерние окна в порядке их построения, данные в буфере передачи должны появляться в том же порядке.
Когда режимный диалоговый блок получает командное сообщение с идентификатором ID или IDOK, он автоматически передает данные из управляющих элементов в буфер передачи. Обычно это сообщение указывает, что пользователь выбрал для закрытия диалогового блока кнопку OK, так что диалоговый блок автоматически обновляет буфер передачи. Затем, если вы снова выполняете диалоговое окно, они передаются из буфера передачи в управляющие элементы.
В любой момент вы можете явно передать данные в любом направлении. Для этого используется функция-элемент TransferData, параметре которой задается tdSetData (передача из буфера) или tdGetData (передача в буфер).
Вы можете модифицировать способ передачи конкретным управляющим элементом своих данных или включить в механизм передачи новый определяемый вами управляющий элемент. В любом случае это требуется написания для вашего объекта управляющего элемента функции-элемента Transfer.
Назад | Содержание | Вперед