C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обьединение ячеек в StringGrid  (Прочитано 9912 раз)
WaRK
Участник


Сказали спасибо: +4/-1
Offline

Сообщений: 207


« : 07 Декабрь 2009, 18:16:07 »

Как можно обьединить ячейки в StringGrid ?
или с помощью этого компонента это невозможно?
Записан
Doga
Давний друг


Сказали спасибо: +31/-1
Offline

Сообщений: 241


« Ответ #1 : 07 Декабрь 2009, 20:43:01 »

Привет.

Для TStringGrid, чтоб работало по-человечески - практически невозможно. Может быть для TDrawGrid (в свое время, я делал такое для TRxDrawGrid (RxLib)), и то, через одно место.

Не тратте зря время, воспользуйтесь каким-либо готовым компонентом. Например,  здесь, в файловом архиве, вроде как есть бесплатный TRGrid, он это умеет.
Ну, или ещё чего-нибудь...
Записан
WaRK
Участник


Сказали спасибо: +4/-1
Offline

Сообщений: 207


« Ответ #2 : 07 Декабрь 2009, 23:54:08 »

скачал TRGrid.115.Demo.BCB6
хотел запустить проэкт и получил ошибки:
[C++ Error] uxtheme.h(176): E2146 Need an identifier to declare
[C++ Error] uxtheme.h(546): E2146 Need an identifier to declare
 здесь:
Код
typedef enum THEMESIZE
{
   TS_MIN,             // minimum size
   TS_TRUE,            // size without stretching
   TS_DRAW,            // size that theme mgr will use to draw part
};
и здесь:
Код
typedef enum PROPERTYORIGIN
{
   PO_STATE,           // property was found in the state section
   PO_PART,            // property was found in the part section
   PO_CLASS,           // property was found in the class section
   PO_GLOBAL,          // property was found in [globals] section
   PO_NOTFOUND         // property was not found
};
В чём дело? 
Записан
immortal1977
Участник


Сказали спасибо: +4/-2
Offline

Сообщений: 23


« Ответ #3 : 08 Декабрь 2009, 00:27:40 »

Объединение ячеек в StringGrid делается элементарно, вот за 3 минуты накалякал пример:
Код
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
 TRect &Rect, TGridDrawState State)
{
  AnsiString S = "Hello";
  TStringGrid *AGrid = dynamic_cast<TStringGrid*>(Sender);
  if(1==ARow && 0 != ACol)
  {
 int i = AGrid->ColWidths[0] * AGrid->ColCount - 1;
 Rect.Left = AGrid->ColWidths[0] + 1;
 Rect.Top = AGrid->RowHeights[0] + 1;
 Rect.Right = i - 1;
 AGrid->Canvas->FillRect(Rect);
 
 int txtWidth = AGrid->Canvas->TextWidth(S);
 int txtHeight = AGrid->Canvas->TextHeight("Hg");
 
 int txtX = i / 2 - txtWidth / 2 + AGrid->ColWidths[0] / 2;
 int txtY = Rect.Top + Rect.Height() / 2 - txtHeight / 2;
 AGrid->Canvas->TextOutA(txtX, txtY, S);
  }
}
 

Можно также обрабатывать и прорисовывать состояния gdSelected, gdFocused, лень было прикручивать...
Записан
BEERZONE
Участник


Сказали спасибо: +26/-3
Offline

Сообщений: 181


« Ответ #4 : 08 Декабрь 2009, 02:06:35 »

Объединение ячеек в StringGrid делается элементарно, вот за 3 минуты накалякал пример:
Не в обиду будет сказано: Вы проверяли как работает ваш пример? Практически Excel 2007...
Цитировать
Не тратте зря время, воспользуйтесь каким-либо готовым компонентом.
Сам занимался этим давно. Просто могу описать алгоритм:
1. Создаётся двумерный текстовый массив, равный по размеру Вашему СтрингГриду.
2. В этот массив записывается информация о всех ячейках (текст в ячейке, где начинается объединение, где оно заканчивается, цвет шрифта в ячейке, выравнивание и т.д и т.п.).
3. В OnDrawCell анализируется массив и рисуются соответствующие Rect функцией DrawTextW (позволяет выравнивать текст флагами и отображает Unicode).
4. В событии StringGridDblClick снова анализируется массив (какую ячейку кликнули 2 раза для редактирования?) и создается TEdit в соответствующем месте и соответствующего размера.
5. В событии OnKeyDown (например) проверяете, нажат ли Enter. Если да, то вносите изменение в массив и удаляете TEdit.
Это алгоритм простейшего Excel листа и непаханное поле для его усовершенствования. Оно Вам сильно надо?
Записан
Doga
Давний друг


Сказали спасибо: +31/-1
Offline

Сообщений: 241


« Ответ #5 : 08 Декабрь 2009, 16:13:18 »

Цитировать
В чём дело?

BCB6 изначально содержит некоректную версию файла Uxtheme.h. В сборке RvaLib.115.Src.Hlp.zip  есть его правильная версия (см. файл !!!.txt).
Записан
Povorot
Участник


Сказали спасибо: +4/-4
Offline

Сообщений: 72

cpp day & night


« Ответ #6 : 15 Январь 2011, 21:18:39 »

Столкнулся с той же проблемой. Использовал код товарища immortal1977 , однако он выдает странный результат, вместо того, чтобы объединить ячейки определенной строки, он объединяет всю область до ячейки. Пример прилагается в архиве.
код:
Код
if((ARow==2+StrToInt(Edit7->Text))&&ACol!=1)
  {
 AnsiString S = "COCKPIT AND ATTENDANT";
 TStringGrid *AGrid = dynamic_cast<TStringGrid*>(Sender);
 int i = AGrid->ColWidths[0] * AGrid->ColCount - 1;
 Rect.Left = AGrid->ColWidths[0] + 1;
 Rect.Top = AGrid->RowHeights[0] + 1;
 Rect.Right = i - 1;
 AGrid->Canvas->FillRect(Rect);
 int txtWidth = AGrid->Canvas->TextWidth(S);
 int txtHeight = AGrid->Canvas->TextHeight("Hg");
 int txtX = i / 2 - txtWidth / 2 + AGrid->ColWidths[0] / 2;
 int txtY = Rect.Top + Rect.Height() / 2 - txtHeight / 2;
 AGrid->Canvas->TextOutA(txtX, txtY, S);
}
 
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #7 : 16 Январь 2011, 13:25:33 »

Используйте компоненты от Virtual Components, т.е. например TVirtualStringTree / TVirtualDrawTree.
Записан
Povorot
Участник


Сказали спасибо: +4/-4
Offline

Сообщений: 72

cpp day & night


« Ответ #8 : 08 Март 2011, 17:52:41 »

В помощь "потомкам":
Правильное название компонентов Virtual Controls
Брать с оф сайта (бесплатно) http://www.soft-gems.net/
Там же и инструкция на англ.
« Последнее редактирование: 25 Март 2011, 14:45:44 от Povorot » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.103 секунд. Запросов: 22.