Сообщений 20 Оценка 275 [+1/-0] Оценить |
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(); // обновить экран } |
За более подробной информацией обратитесь к примерам.
Использование 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; } |
Выложены исходные тексты компонента. Код для регистрации компонента - DF9F-ZD43-Z9E2-84BE.
Из-за багфиксов требуется пропатчить дистрибутив чтобы собирались примеры.
Визард генерит классы с типом 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] Оценить |