C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
StingGrid — Объеденение ячеек
Bigzone
Отправлено: 26.12.2004, 20:28


Не зарегистрирован







StingGrid — Объединение ячеек


С наступающим.
Подскажите как в StingGrid организовать объединение ячеек.
Aptem
Отправлено: 27.12.2004, 12:20


Мастер участка

Группа: Участник
Сообщений: 349



В StringGrid не знаю, но есть отличный компонент TAdvStringGrid! Там есть объединение!!!
Boyko
Отправлено: 28.12.2004, 15:33


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Bigzone @ 26/12/2004, 20:30)
Подскажите как в StingGrid организовать объединение ячеек.

Вручную! wink.gif
vvoid
Отправлено: 28.12.2004, 18:05


Машинист паровоза

Группа: Участник
Сообщений: 171



Мне тоже интересна данная проблема. Если можно по подробнее, что значит вручную. Я например вообще не имею представления, как например между двумя ячейками убрать разделяющую (серую) линию?

Заранее спасибо и с наступающим!
Георгий
Отправлено: 28.12.2004, 21:34


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (vvoid @ 28/12/2004, 19:07)
Если можно по подробнее, что значит вручную.

вручную = совсем вручную

стивим свой обработчик OnDrawCell и сами всё рисуем, включая текст, рамки, заголовки.
Boyko
Отправлено: 29.12.2004, 15:56


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (vvoid @ 28/12/2004, 18:07)
Мне тоже интересна данная проблема. Если можно по подробнее, что значит вручную. Я например вообще не имею представления, как например между двумя ячейками убрать разделяющую (серую) линию?



Объединяю 1-ую и 2-ую колону. Вручную!!!

CODE

for (int i=0; i<StringGrid1->RowCount; i++)
StringGrid1->Cells[0][i]=StringGrid1->Cells[0][i]+StringGrid1[1][i];
StringGrid1->ColWidths[0]=StringGrid1->ColWidths[0]+StringGrid1->ColWidths[1];
for (int i=0; i<StringGrid1->ColCount-1; i++)
{
StringGrid1->Cols[i]=StringGrid1->Cols[i+1];
StringGrid1->ColWidths[i]=StringGrid1->ColWidths[i+1];
}
StringGrid1->ColCount=StringGrid1->ColCount-1;


И разделяющую (серую) линию убрал! smile.gif

С наступающим!
GIZMO
Отправлено: 30.12.2004, 10:15


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (vvoid @ 28/12/2004, 19:07)
Мне тоже интересна данная проблема. Если можно по подробнее, что значит вручную. Я например вообще не имею представления, как например между двумя ячейками убрать разделяющую (серую) линию?

Заранее спасибо и с наступающим!

Идея простая (хотя может и не правильная?) — обработать событие WM_PAINT:
CODE

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
   TStringGrid *StringGrid1;

private: // User declarations
   TWndMethod OldGridProc;
   void __fastcall NewGridProc(TMessage &Msg);
public:     // User declarations
   __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   OldGridProc = StringGrid1->WindowProc;
   StringGrid1->WindowProc = NewGridProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewGridProc(TMessage &Msg)
{
   TRect Rect1, Rect2, Rect;
   String Caption;
   int CaptionLength;

   switch (Msg.Msg)
   {
       case WM_PAINT:
       {
           OldGridProc(Msg);

           Rect1 = StringGrid1->CellRect(1, 1);
           Rect2 = StringGrid1->CellRect(2, 1);
           ::UnionRect(&Rect, &Rect1, &Rect2);
           StringGrid1->Canvas->Brush->Color = StringGrid1->FixedColor;
           StringGrid1->Canvas->FillRect(Rect);
           Frame3D(StringGrid1->Canvas, Rect, clBtnHighlight, clWindowFrame, 1);
           Caption = "Union cells";
           CaptionLength = Caption.Length();
           ::SetBkMode(StringGrid1->Canvas->Handle, TRANSPARENT );
           ::DrawText(StringGrid1->Canvas->Handle, Caption.c_str(), CaptionLength, &Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER );

           Msg.Result = 0;

           return;
       }

       case WM_DESTROY:
       {

           StringGrid1->WindowProc = OldGridProc;

           break;
       }
   }
   OldGridProc(Msg);
}

Это самый простой пример — для "шапки таблицы" т. к. не требует обработки перехода между ячейками и т. п.
1. Сабклассим оконную процедуру StringGrid1:
2. Объединение в событии WM_PAINT:
2.1. Вызываем обработку по умолчанию
- OldGridProc(Msg);
2.2. Объединяем
- No comment
Замечание:
В данном примере (для простоты) выполняется "двойная работа" DefaultDrawing = true, реально нужно DefaultDrawing = false и добавить OnDrawCell.

Вообщем работает вполне удовлетворительно. Как делают "мастера" не знаю, хотелось-бы услышать мнение общественности: — "Годится такой метод?" т. к. более усложненный вариант сам использую в своем компоненте.

Да, что-бы не напрягать Ваши пальчики проект в аттаче.


User Attached Image Скачать файл
Project1.rar


vvoid
Отправлено: 30.12.2004, 15:34


Машинист паровоза

Группа: Участник
Сообщений: 171



Ну что мне остаётся сказать.
Спасибо!!!

Вернуться в Вопросы программирования в C++Builder