Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в 21 локации

От 104 рублей в месяц

Безлимитный трафик. Защита от ДДоС.

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Объекты Doc/View

ObjectWindows 2.0 предусматривает новый способ манипуляции с данными - модель Doc/View, которая состоит из трех частей:

  • Объектов документов, которые могут содержать несколько различных типов данных и предусматривают методы доступа к этим данным.
  • Объекты отображаемых элементов образуют интерфейс между объектом документа и пользовательским интерфейсом. Они управляют характером вывода данных и тем, как пользователь взаимодействует с данными.
  • Администратор документа, работающий в масштабе приложения, поддерживает координаты объектов документов и соответствующих объектов отображаемых элементов.

Совместная работа документов и отображаемых элементов

В данном разделе описываются основные принципы модели Doc/View. Эта модель освобождает программиста и пользователя от необходимости думать от типах данных и о том, как они представляются на экране. Doc/View связывает типы файлов данных с классом документа и классом просмотра. Администратор документов поддерживает список ассоциаций между классами документа и классами просмотра. Каждая ассоциация называется шаблоном документа (не путайте его с шаблонами С++).

Класс документа управляет хранением данных и манипулированием ими. Он содержит информацию, которая выводится на экран. Объекты документов управляют изменениями данных и передачей их в постоянную память (например, на диск).

Когда пользователь открывает документ (существующий или создавая новый документ), он выводится с помощью соответствующего (ассоциированного с ним) класса отображаемого элемента. Класс отображаемого элемента управляет выводом данных на экран и тем, как пользователь взаимодействует с данными на экране. Фактически, отображаемый элемент формирует интерфейс между окном на экране и документом. Некоторые типы документов могут иметь только один ассоциированный с ними класс отображаемого элемента, другие - несколько. Различные типы отображаемых элементов определяют различных характер взаимодействия пользователя с документом.

Документы

Концепция традиционного документа и принципы Doc/View во многом различны. Традиционная концепция документов обычно аналогично файлу системы обработки текстов. Такой файл состоит из текста и иногда включает в себя графику и встроенные команды, помогающие системе обработки текста форматировать документ. Doc/View имеет свои характерные особенности:

  • Он отличается типом содержимого документов. Документ Doc/View может содержать данные практически любого типа, такие как текст, графику, звуки, файлы мультимедиа и даже другие документы.
  • Второе отличие состоит в представлении данных. В то время как формат традиционного документа обычно проектируется с учетом его будущего представления, документ Doc/View полностью независим от того, как он выводится.
  • Последнее отличие в том, что документ из конкретной программы обработки текста в общем случае не зависит от формата, необходимого программе. Обычные документы обычно становятся переносимыми между различными системами обработки текста после утомительного процесса преобразования. Документы Doc/View позволяют легко переносить данные между различными приложениями, даже если их базовые функции весьма различны.

Базовые функции объекта документа обеспечивает класс TDocument.

Отображаемые элементы

Объекты отображаемых элементов служат для представления объектов документов. Без такого объекта вы не могли бы видеть документ и работать с ним. Когда вы в шаблоне документа связываете документ с объектом отображаемого элемента, то получаете функциональный блок данных и кода, которые обеспечивает графическое представление записанных в документе данных и способ взаимодействия с этими данными и их изменения.

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

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

Базовые функции отображаемого элемента обеспечивает класс TView.

Связь документов с классами отображаемых элементов

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

После определения шаблона класса вы можете создать любое число его экземпляров. Каждый шаблон связывает единственный класс документа и класс отображаемого элемента. Каждый шаблон имеет имя, заданное по умолчанию расширение имени файла, каталог, флаги и фильтры файла. Таким образом, вы можете создать единственный шаблон класса, который связывает документ с отображаемым элементом. Затем вы можете создать несколько различных экземпляров этого шаблона, и каждый экземпляр будет работать с файлами с различными расширениями в своем заданном по умолчанию каталоге, используя одни и те же классы документа и отображаемого элемента.

Управление Doc/View

Администратор документа поддерживает список используемых в приложении экземпляров шаблона и список текущих документов. Каждое использующее документы 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, и выполняет ряд задач:

  • Поддерживает список текущих документов и зарегистрированных шаблонов.
  • Обрабатывает события стандартного меню File.
  • Обеспечивает интерфейс для выбора файла.

Для поддержки модели Doc/View администратор документа должен подключаться к приложению. Это делается путем создания экземпляра TDocManager и превращения его в администратор документа приложения. К общедоступным данным и функциям администратора документа можно обращаться с помощью функции GetDocManager, которая не имеет параметров и возвращает TDocManager&. Для создания документов и отображаемых элементов администратор документа предусматривает следующие функции:

  • CreateAnyDoc представляет все видимые шаблоны, в то время как функция-элемент TDocTemplate CreateDoc представляет только свой собственный шаблон.
  • CreateAnyView отфильтровывает список шаблонов для тех отображаемых элементов, которые поддерживают текущий документ и представляют список имен файлов, а функция-элемент TDocTemplate CreateView непосредственно строит отображаемый документ, заданный классом шаблона документа.

Для поддержки других средств (например, OLE 2.0) можно использовать специализированный администратор документа.

Построение администратора документа

Конструктор TDocManager имеет единственный параметр, который используется для установки режима администратора документа:

  • Однодокументального интерфейса (SDI), в котором вы можете каждый раз открывать только один документ. При открытии нового документа администратор документа пытается закрыть предыдущий документ.
  • Многодокументального интерфейса (MDI), где вы можете одновременно работать с несколькими документами и отображаемыми элементами или одним документом, представленным разными типами.

Чтобы открыть администратор документа в режиме SDI, нужно вызвать конструктор с параметром dmSDI, а в режиме MDI - с параметром dmMDI. Другие параметры конструктора задает построение для администратора документа собственное меню File, разрешают в меню File команду Save даже если документ не изменен и запрещают в меню File команду Revert. После построения администратора документа вы не можете изменить режим.

Обработка событий TDocManager

Если при построении объекта 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 объекта вы должны вызывать конструктор 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

Обычно события 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. Эта макрокоманда имеет три параметра: имя события, имя функции обработки события и размер параметра для функции обработки события.

Характеристики Doc/View

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

Значения характеристик и их имена

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 выполняют эти задачи самостоятельно.

Во многих случаях вы можете непосредственно создать экземпляры перечисленных классов. Однако иногда может потребоваться создать производные классы со специализированном поведением.

Построение и уничтожение объектов управляющих элементов

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

  • добавить в родительское окно элемент данных - указатель на родительское окно;
  • вызвать конструктор объекта управляющего элемента;
  • изменить атрибуты управляющего элемент;
  • инициализировать управляющий элемент в SetupWindow.

Часто при построении в окне управляющего элемента нужно сохранять указатель на управляющий элемент в элементе данных оконного объекта. Это делается для удобства доступа к функциям-элементам управляющего элемента. Для тех управляющих элементов, с которыми вы манипулируете редко (таких как статические элементы и групповые блоки), такой указатель не требуется.

Некоторым конструкторам управляющих элементов передаются параметры, определяющие характеристики объектов управляющих элементов. Это следующие параметры:

  • указатель на объект родительского окна;
  • идентификатор ресурса;
  • координаты x и y верхнего левого угла;
  • высота и ширина;
  • идентификатор библиотеки (не обязательно).

Существуют также конструкторы, связывающие объект управляющего элемента с интерфейсным элементом, созданными из определения ресурса.

Все управляющие элементы получают используемые по умолчанию стили окна 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.

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

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...