Сообщений 20    Оценка 275 [+1/-0]         Оценить  
Система Orphus

PragmaGrid XP – редактор свойств

Автор: Александр Клюев
Pragmaworks Group
Опубликовано: 06.02.2003
Исправлено: 30.06.2005
Версия текста: 1.2

Введение
Установка документация и примеры
Использование
Использование в ATL/WTL проектах
Исходные тексты компонента
31.03.2004

PragmaGrid XP (841 КБ) [rsdn.ru]
PragmaGrid XP [pragmaworks.com]
Демо-проект (VC6, WTL7)

Введение

PragmaGrid XP – это редактор свойств (Property Browser). Предназначен для визуализации и редактирования свойств объектов. Может быть использован для создания мастеров конфигурации, страниц свойств и многого другого. Поддерживает девять различных типов свойств таких как: edit, combo, tree, button, spin, file, color, checkbox, group. Для российских программистов – free.


Для создания структуры свойств имеется специальный визард, что делает использование компонента достаточно простым как в VC++, так и в VB6. С помощью визарда создается файл с описанием структуры свойств (его можно поместить в ресурсы приложения) и класс-оболочка предоставляющий доступ к структуре свойств.


Класс-оболочка созданный визардом предоставляет простой, удобный и строго типизированный доступ к свойствам.


Установка документация и примеры

Документация, 12 примеров для VC++ и столько же для VB6 входит в установочный пакет. После установки в VC++ необходимо добавить путь С:\Program Files\PGXP\include в include directories

Использование

Здесь, вкратце, опишу создание учебного проекта.

class CMyDlg : public CDialog
{
    // PragmaGrid

    IPGXGridPtr   m_spGrid;    // smart pointer to control
    CMyPropSet    m_PropSet;   // property set class. derived from generated by wizard class
    //...
BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    m_spGrid = GetDlgItem( IDC_PGXGRID )->GetControlUnknown(); // IDC_PGXGRID – identifier of PragmaGrid control

    m_PropSet.LoadFromResource( AfxGetResourceHandle(), IDR_PROPSET ); // IDR_PROPSET – identifier of PropertySet.pgx
    m_spGrid->PutDataSet( m_PropSet );

    return TRUE;
}
ПРЕДУПРЕЖДЕНИЕ

В созданном таким образом проекте используется STL, поэтому, возможно, вам потребуется добавить необходимые настройки для вашей версии STL.

Теперь перейдем к обработке событий. Допустим, вы добавили Edit Property, указав тип данных double (DataType: real-64bit) и идентификатор MyEdit и хотите обработать событие ввода данных. В визарде в разделе Callbacks выделите галочкой пункт Set, сохраните и сгенерируйте.

class CMyPropSet : public CPropertySet {
    // обработчик события ввода данных для MyEdit
    void MyEdit_set( double newVal ) {
        if ( newVal >= 0. ) // отбросим все отрицательные значения
            CPropertySet:: MyEdit_set( newVal );
    }
};
class CMyDlg : public CDialog
{
    // PragmaGrid
    IPGXGridPtr   m_spGrid;    // smart pointer to control
    CMyPropSet    m_PropSet;   // property set class. derived from generated by wizard class
    
    // Получить\изменить значение. Обратите внимание на типизированный доступ
    void GetAndSetValues() {
        double d = m_PropSet.MyEdit_get(); // получить
        m_PropSet.MyEdit_set( d + 3.1415 );// изменить
        m_spGrid->Refresh();               // обновить экран
    }

За более подробной информацией обратитесь к примерам.

Использование в ATL/WTL проектах

Использование PragmaGrid XP в ATL/WTL проектах отличается только способом инициализации компонента. В случае использования диалога или FormView она осуществляется так (код из примера PgxWTL):

LRESULT MyWTLFormView::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
    GetDlgControl( IDC_PGXGRID1, __uuidof(IPGXGrid), (void**)&m_spGrid );
    m_propSet.LoadFromResource( _Module.m_hInstResource, IDR_PROPSET );
    m_spGrid->PutDataSet( m_propSet );
    return 0;
} 

Исходные тексты компонента

31.03.2004

Выложены исходные тексты компонента. Код для регистрации компонента - DF9F-ZD43-Z9E2-84BE.

Из-за багфиксов требуется пропатчить дистрибутив чтобы собирались примеры.

  1. надо скопировать все бинари из проекта PragmaGrid\Release в "Program Files\PGXP" (Примечание PGDSG.dll и PGXP.dll - СОМ библиотеки).
  2. все содержимое "Program Files\PGXP\INCLUDE" надо прибить и заменить на файлы из PragmaGrid\PGXHTL.
  3. перед компиляцией примера требуется открыть соответсвующий ему файл Sample.pgx в дизайнере PGXWIZ и перегенерить класс.

Визард генерит классы с типом TCHAR по умолчанию. Однако это можно настроить через реестр HKEY_CURRENT_USER\Software\www.pragmaworks.com\PGXWIZ\CharType поставив TCHAR,char или wchar_t. В проекте PragmaGrid\PGDSG есть файл itmprops.dsx класс для которого надо генерить с типом wchar_t. по умолчанию генерится ItemInfoBase.hxx который ручками переименовывается в ItemInfoBase.h. Все остальное вроде как обычно т.е. голые сырцы без тонкостей.

Сам грид написан на АПИ и завернут в ATL обертку, которую в принципе легко убрать. Единственная трудность в том, что визард заточен генерить определенные классы. Здесь я вижу два пути: либо переписать визард (вернее шаблоны генерации PragmaGrid\PGDSG\template). Либо переписать хидеры из PragmaGrid\PGXHTL (шаблонные обертки вокруг COM для С++) и заточить их под обертки вокруг родных С++ классов, которые представлены в файлах PragmaGrid\GridItemCombo.h, PragmaGrid\GridItemSpin.h и т.п.

И еще. В Гриде во всю используется паттерн посетитель. Для обхода по дереву свойст используется базовый класс IHTAction. Вся отрисовка и прочее сделаны через него. Наверное это было не лучшее решение однако теперь уже не переделаешь. Вообще зачем-то все было сделано на базе интерфейсов, и всю фактически структуру грида можно увидеть в файле PragmaGrid\INCLUDE\htgrid.h

И последнее. В Debug версии при запуске визарда и при открытии файла лезут ассерты. Их надо игнорировать. Грид писался под WTL 3.1 в которой это не проявлялось. В WTL 7.0 зачем-то сделали дурацкие проверки на IsWindow.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 20    Оценка 275 [+1/-0]         Оценить