Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Grid + Checkbox


Автор: Сергей Т. 15.8.2005, 20:13
Подскажите пожалуйста как правильно организовать Grid в котором есть несколько столбцов. Один скажем просто отображает перечень предметов(объектов), а остальные столбики состоят из checkbox.

Автор: chaos 16.8.2005, 12:38
берешь класс наследуемый от CListCtrl
и реализуешь в нем необходимую функциональность, необходимо его создать со свойством LVS_OWNERDRAWFIXED и перегружаешь DrawItem и добовляешь там чекбоксы

Автор: Сергей Т. 17.8.2005, 16:05
Уважаемый chaos, можно ли привести небольшой пример. Я только недавно начал использовать Builder и изучать C++, поэтому еще немного теряюсь, как это нужно сделать.

Сергей smile

Автор: chaos 20.8.2005, 10:38
вот тебе пример: Возьмешь кинешь на форму StringGrid
а вот мой код
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char *Checked;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
    TStringGrid *SG = dynamic_cast<TStringGrid *>(Sender);
    TCanvas *c = SG->Canvas;
    c->Brush->Color = 0x0FF000;
    c->FillRect(Rect);

    if (2 == ACol)
    {
        TRect r = Rect;
        r.Left += 2;
        r.Right = r.Left + 14;
        if (Checked[ARow])
            DrawFrameControl(c->Handle, &r, DFC_BUTTON,DFCS_BUTTONCHECK|DFCS_CHECKED);
        else
            DrawFrameControl(c->Handle,&r,DFC_BUTTON,DFCS_BUTTONCHECK);
    }
    c->TextOut(Rect.Left+18,Rect.Top+5,SG->Cells[ACol][ARow]);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Checked = new char[StringGrid1->RowCount];
    char str[10];
    for (int i = 0; i < StringGrid1->ColCount; i++)
    {
        for (int j = 0; j < StringGrid1->RowCount; j++)
        {
           sprintf(str, "Cells: %d:%d", i, j);
           StringGrid1->Cells[i][j] = str;
        }
        Checked[i] = 0;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    delete[] Checked;        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
     int ARow, ACol;

     TStringGrid *SG = dynamic_cast<TStringGrid *>(Sender);;
     SG->MouseToCell(X, Y, ACol, ARow);
     if (2 == ACol)
        Checked[ARow] = (0 == Checked[ARow] ? 1 : 0);
}
//---------------------------------------------------------------------------

Автор: Сергей Т. 29.8.2005, 10:30
chaos большое спасибо. Все работает. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)