Таблицы в Vc++
такой вопрос: Каким образом можно в VC++ отображать данные в виде таблицы, раньше делал это с MSFlexGrid'oм, но он очень органичен и хочется чегонить более гибкое и ваще у него куча недостатков... В нете конечно есть куча всяких ActiveX таблиц, но я думаю неужели нет в самом VC++ таблицы и единственный вариант использовать ActiveX элементы?
Если да, то какую лучше использовать(из бесплатных), и если писать свою то с чего начать, ведь это не C++ Builder где можно написать компанент?
Здрасте,
такой вопрос: Каким образом можно в VC++ отображать данные в виде таблицы, раньше делал это с MSFlexGrid'oм, но он очень органичен и хочется чегонить более гибкое и ваще у него куча недостатков... В нете конечно есть куча всяких ActiveX таблиц, но я думаю неужели нет в самом VC++ таблицы и единственный вариант использовать ActiveX элементы?
Если да, то какую лучше использовать(из бесплатных), и если писать свою то с чего начать, ведь это не C++ Builder где можно написать компанент?
ListView одним словом! Тем более он стандартный
Здрасте,
такой вопрос: Каким образом можно в VC++ отображать данные в виде таблицы, раньше делал это с MSFlexGrid'oм, но он очень органичен и хочется чегонить более гибкое и ваще у него куча недостатков... В нете конечно есть куча всяких ActiveX таблиц, но я думаю неужели нет в самом VC++ таблицы и единственный вариант использовать ActiveX элементы?
Если да, то какую лучше использовать(из бесплатных), и если писать свою то с чего начать, ведь это не C++ Builder где можно написать компанент?
Для Visual C++ существует множество классов сторонних разработчиков, есть и хорошие бесплатные варианты. Просто поройся по нужным сайтам и все найдешь. Я бы тебе посоветовал хорошодокументированный и бесплатный класс таблиц - но боюсь сочтут за рекламу (хоть и не я его писал, но просто общался с автором) или флуд (просто и раньше я о нем упоминал)
На codeproject.com есть очень хороший класс CGridCtrl. Я его использоваль уже во многих программах.
Не могли бы вы подсказать как подключить этот грид (gridctrl) к проекту?
Не могли бы вы подсказать как подключить этот грид (gridctrl) к проекту?
1. Нужно добавить к проекту *.h и *.cpp файлы из каталогов NewCellTypes и GridCtrl_src.
2. К .h файлу модуля, где будет использоваться этот класс подключить GridCtrl.h.
И объявить переменную, напр.
CGridCtrl *m_Grid;
3.В срр написать ф-ию создания и напр. вызвать в InitDialog()
m_Grid = new CGridCtrl;
m_Grid->Create(r, this, 1000);
m_Grid->SetDlgCtrlID(IDC_GRID);
m_Grid->SetGridBkColor(RGB(252,252,252));
m_Grid->EnableDragAndDrop(FALSE);
m_Grid->GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(248, 248, 248));
m_Grid->SetEditable(FALSE);
m_Grid->SetVirtualMode(FALSE);
m_Grid->SetListMode(TRUE);
m_Grid->SetSingleRowSelection(TRUE);
m_Grid->SetDefCellHeight(19);
TRY
{
m_Grid->SetRowCount(1);
m_Grid->SetColumnCount(7);
m_Grid->SetFixedRowCount(1);
m_Grid->SetFixedColumnCount(1);
m_Grid->SetHeaderSort();
m_Grid->SetFixedColumnSelection(FALSE);
m_Grid->SetFixedRowSelection(FALSE);
m_Grid->SetTrackFocusCell(FALSE);
m_Grid->SetHeaderSort(FALSE);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
m_Grid->SetRowHeight(0,24);
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_BKCLR|GVIF_FGCLR|GVIF_PARAM;
Item.row = 0;
Item.crBkClr = RGB(212,208,200);
Item.crFgClr = RGB(0, 0, 0);
Item.lParam = 0;
Item.col = 0;
str = _T("##");
Item.strText = str;
m_Grid->SetItem(&Item);
Item.col = 1;
str = _T("Oper");
Item.strText = str;
m_Grid->SetItem(&Item);
Item.col = 2;
str = _T("Name ID");
Item.strText = str;
m_Grid->SetItem(&Item);
...
UINT uFormat;
int col;
for(col=0;col<7;col++)
{
m_Grid->SetColumnResize(FALSE);
uFormat = m_Grid->GetItemFormat(0, col);
uFormat |= DT_VCENTER|DT_CENTER;
m_Grid->SetItemFormat(0,col, uFormat);
m_Grid->SetItemFgColour(0, col, RGB(0,0,128));
}
m_Grid->SetRowResize(FALSE);
m_Grid->EnableColumnHide(FALSE);
m_Grid->AutoSize(FALSE);
m_Grid->SetCompareFunction (CGridCtrl::pfnCellTextCompare);
m_Grid->SetColumnWidth(0, 48);
m_Grid->SetColumnWidth(1, 34);
...
1. Нужно добавить к проекту *.h и *.cpp файлы из каталогов NewCellTypes и GridCtrl_src.
2. К .h файлу модуля, где будет использоваться этот класс подключить GridCtrl.h.
И объявить переменную, напр.
CGridCtrl *m_Grid;
3.В срр написать ф-ию создания и напр. вызвать в InitDialog()
m_Grid = new CGridCtrl;
m_Grid->Create(r, this, 1000);
m_Grid->SetDlgCtrlID(IDC_GRID);
m_Grid->SetGridBkColor(RGB(252,252,252));
m_Grid->EnableDragAndDrop(FALSE);
m_Grid->GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(248, 248, 248));
m_Grid->SetEditable(FALSE);
m_Grid->SetVirtualMode(FALSE);
m_Grid->SetListMode(TRUE);
m_Grid->SetSingleRowSelection(TRUE);
m_Grid->SetDefCellHeight(19);
TRY
{
m_Grid->SetRowCount(1);
m_Grid->SetColumnCount(7);
m_Grid->SetFixedRowCount(1);
m_Grid->SetFixedColumnCount(1);
m_Grid->SetHeaderSort();
m_Grid->SetFixedColumnSelection(FALSE);
m_Grid->SetFixedRowSelection(FALSE);
m_Grid->SetTrackFocusCell(FALSE);
m_Grid->SetHeaderSort(FALSE);
}
CATCH (CMemoryException, e)
{
e->ReportError();
return;
}
END_CATCH
m_Grid->SetRowHeight(0,24);
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_BKCLR|GVIF_FGCLR|GVIF_PARAM;
Item.row = 0;
Item.crBkClr = RGB(212,208,200);
Item.crFgClr = RGB(0, 0, 0);
Item.lParam = 0;
Item.col = 0;
str = _T("##");
Item.strText = str;
m_Grid->SetItem(&Item);
Item.col = 1;
str = _T("Oper");
Item.strText = str;
m_Grid->SetItem(&Item);
Item.col = 2;
str = _T("Name ID");
Item.strText = str;
m_Grid->SetItem(&Item);
...
UINT uFormat;
int col;
for(col=0;col<7;col++)
{
m_Grid->SetColumnResize(FALSE);
uFormat = m_Grid->GetItemFormat(0, col);
uFormat |= DT_VCENTER|DT_CENTER;
m_Grid->SetItemFormat(0,col, uFormat);
m_Grid->SetItemFgColour(0, col, RGB(0,0,128));
}
m_Grid->SetRowResize(FALSE);
m_Grid->EnableColumnHide(FALSE);
m_Grid->AutoSize(FALSE);
m_Grid->SetCompareFunction (CGridCtrl::pfnCellTextCompare);
m_Grid->SetColumnWidth(0, 48);
m_Grid->SetColumnWidth(1, 34);
...
Спасибо, буду пробовать.
А в виртуальном режиме использовал? Можно ли его заставить работать в виртуальном режиме с объединением ячеек?
2Mongoose
А в виртуальном режиме использовал? Можно ли его заставить работать в виртуальном режиме с объединением ячеек?
В виртуальном нет, но пример на codeproject.com работает в виртуальном режиме. Как установить описано с прмерами на html странице компонента. (Или callback ф-я или обработка сообщения GVN_GETDISPINFO.)
Чем отличается TRY-CATCH-END CATCH от стандартного сишного try-catch
TRY-CATCH-END CATCH используются а архитектуре MFC. Поэтому, если вы пишете с MFC, есть смысл их использовать, чтобы код был как-то более единообразным по отношению к используемым средствам. Однако, в своих частях кода можно писать и C++-ные try-catch-...
Если же проект не содержит MFC, можно пользоваться только стандартными try-catch-...
TRY-CATCH-END CATCH используются а архитектуре MFC. Поэтому, если вы пишете с MFC, есть смысл их использовать, чтобы код был как-то более единообразным по отношению к используемым средствам. Однако, в своих частях кода можно писать и C++-ные try-catch-...
Если же проект не содержит MFC, можно пользоваться только стандартными try-catch-...
А чем все-таки они отличаются...
Развивается ли MFC или ему на смену идет более современная технология?
А чем все-таки они отличаются...
Развивается ли MFC или ему на смену идет более современная технология?
Немношко отличаются. Напр. CATCH макрос автоматически удаляет исключение, а при catch нужно его самому удалить, если оно обработано. Но c++ обработчики исключений генерируются в меньший код и они более универсальны. Макросы считаются устаревшими хоть и поддерживаются в MFC. Если ты имел в виду TRY-CATCH в коде, что я привел, то я думал, что эти макросы определил автор CGridCtrl. Раньше с такими макросами не встречался.
MFC вроде не развивается начиная с VC 4. Теперь некоторые кодеры сильно хвалят WTL, она похожа на MFC, но использует ATL.
А чем все-таки они отличаются...
Развивается ли MFC или ему на смену идет более современная технология?
1. Отличаются они тем, что TRY/CATCH предназначены для использования с CException и выведенными из него классами. MFC активно использует эти классы для обработки своих исключений. Например, CDatabase генерирует CDBException. При получении такого исключения у нас сразу есть возможность получить не только некий код ошибки, но и описание, предоставленное классом CDatabase, а также строку, возвращаемую драйвером базы данных. Это сильно упрощает обработку ошибок при обращении к БД. Обычно бывает достаточно показать эти две строки, чтобы понять, что именно надо сделать.
2. Сейчас Microsoft продвигает свою платформу .NET, а в ней используется более мощная вешь: .NET Framework. MFC по-прежнему есть, и некоторые части её реализации изменились по сравнению с предыдущей версией, но в общем она осталась та же. Думаю, MFC ждёт судьба STL и подобных библиотек: Microsoft будет её поддерживать, но развивать не будет. И ссылки на неё постепенно пропадут из документации, потому что Билл Гейтс будет заставлять людей пользоваться .NET Framework. Симптоматично в этом смысле то, что в списке фильтров для хелпа MFC вовсе нет, а .NET Framework занимает первую позицию.
Однако, это лишь мои предположения. Утверждать ничего не берусь. Как говаривал Кот Бегемот, история нас рассудит.
Помогите добрым советом как все-таки объединять ячейки в таблице, созаддной на основе CGridCtrl. Или может посоветуете другой способ отображения таблицы, но чтобы можно было объединять ячейки.
Заранее благодарен.