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 организовать объединение ячеек. |
Вручную! |
|
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;
|
И разделяющую (серую) линию убрал!
С наступающим! |
|
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.
Вообщем работает вполне удовлетворительно. Как делают "мастера" не знаю, хотелось-бы услышать мнение общественности: — "Годится такой метод?" т. к. более усложненный вариант сам использую в своем компоненте.
Да, что-бы не напрягать Ваши пальчики проект в аттаче.
|
|
vvoid |
Отправлено: 30.12.2004, 15:34 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Ну что мне остаётся сказать.
Спасибо!!!
|
|