1 Востаннє редагувалося Betterthanyou (12.11.2015 22:57:25)

Тема: Builder C++ DBGrid добавлення компонента в таблицю

От я знайшов код який закрашує окремі комірки таблиці (в коментаріях написав де це) і спеціальні комірки де сума перевищує 100, а коли захотів туди записати текст за допомогою Canvas він пишеться зверху в таблиці а не в комірці, що я зробив не так з текстом ?
Builder C++

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect,
          int DataCol, TColumn *Column, TGridDrawState State)
{
// закрашувати через одну
if (ADOTable1->RecNo & 1)
    DBGrid1->Canvas->Brush->Color = clAqua;
else
    DBGrid1->Canvas->Brush->Color= clWhite;

if (DataCol==1)
    DBGrid1->Canvas->Font->Color= clRed;

// закрашувати спеціальні комірки де сума більша рівна чим 100
if (Table1->FieldByName("_int_")->AsInteger>=100 && Column->FieldName=="_int_")
{
DBGrid1->Canvas->Font->Color= clWhite;
DBGrid1->Canvas->Brush->Color= clRed;
}
// невдала спроба написати текст
if(Column->FieldName=="CB")
{
DBGrid1->Canvas-> Font-> Color = clRed;

DBGrid1->Canvas-> Font-> Size = 20;

DBGrid1->Canvas-> Font-> Name = "Times";

DBGrid1->Canvas->TextOut(0,0,"sdfdfsdf");
}

DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);

}

Але основна моя задача добавити в кожну комірку компонент кнопку (button) Підкажіть як це зробити.
я найшов декілька прикладів на Делфі алей так і не розібрався як їх можна записати в С++ 1 і 2

2

Re: Builder C++ DBGrid добавлення компонента в таблицю

Дивіться. Ви робите

DBGrid1->Canvas->TextOut(0,0,"sdfdfsdf");

Що, очевидно, означає "вивести текст на DBGrid1->Canvas за координатами 0,0". 0,0 - лівий верхній куток, очевидно, так? А тепер дивіться, як за вашим посиланням роблять:

with  DBGrid1.Canvas do 
...
    TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);

Бачите, куди виводять там?

3

Re: Builder C++ DBGrid добавлення компонента в таблицю

koala написав:

Дивіться. Ви робите

DBGrid1->Canvas->TextOut(0,0,"sdfdfsdf");

Що, очевидно, означає "вивести текст на DBGrid1->Canvas за координатами 0,0". 0,0 - лівий верхній куток, очевидно, так? А тепер дивіться, як за вашим посиланням роблять:

with  DBGrid1.Canvas do 
...
    TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);

Бачите, куди виводять там?

Взагалі це не те що я хотів, тому що TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text); записує текс в ту комірку по який клацнути (зрозуміло що через передані координати Rect.Left+2,Rect.Top+2), але і це не правильно працює коли закрашувати комірки

Прихований текст

if (ADOTable1->RecNo & 1)
    DBGrid1->Canvas->Brush->Color = clAqua;
else
    DBGrid1->Canvas->Brush->Color= clWhite;

if (DataCol==1)
    DBGrid1->Canvas->Font->Color= clRed;

if (Table1->FieldByName("_int_")->AsInteger>=100 && Column->FieldName=="_int_")
{
DBGrid1->Canvas->Font->Color= clWhite;
DBGrid1->Canvas->Brush->Color= clRed;
}

TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text); не працює

Тепер про те що я хочу, я хочу в кожній комірці записати текст мене це варіант частково влаштовує (частково тому що він не працює з кодо закрашення комірок) але як дізнатися координати кожної комірки, в параметрах методу є int DataCol, TColumn *Column, DataCol - це (скорій за все) рядок по рахунку, а от Column містить багато всього алей мені так і не вдалося з нього отримати координати комірки

4

Re: Builder C++ DBGrid добавлення компонента в таблицю

Будь ласка, замість "неправильно працює" і "не працює" описуйте конкретно, що відбувається (якщо нічого - то так і пишіть). А то вам будуть давати поради "виправити це".
Код в спойлері не містить жодної команди, яка мала б щось зафарбовувати, тому незрозуміло, що саме у вас "не працює".
А координати, ще раз, в Rect-і.

5

Re: Builder C++ DBGrid добавлення компонента в таблицю

але як дізнатися координати кожної комірки, в параметрах методу є int DataCol, TColumn *Column, DataCol - це (скорій за все) рядок по рахунку, а от Column містить багато всього алей мені так і не вдалося з нього отримати координати комірки

Який жах...
Подивись на оброблювач свій:

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect,
          int DataCol, TColumn *Column, TGridDrawState State)

Rect - це координати (габаріти) де треба малювати
Що ще треба для малювання?

А взагалі то я б описував OnDrawCell, бо ця подія універсальна.

Подякували: koala1

6 Востаннє редагувалося Betterthanyou (13.11.2015 19:55:14)

Re: Builder C++ DBGrid добавлення компонента в таблицю

koala написав:

Код в спойлері не містить жодної команди, яка мала б щось зафарбовувати, тому незрозуміло, що саме у вас "не працює".
А координати, ще раз, в Rect-і.

А що робить Brush->Color = clAqua; Font->Color= clRed; ? (це як заливка в Excel)
щодо Rect я його записав так а як потрібно ?

DBGrid1->Canvas->TextOut((&Rect)->Left+2,(&Rect)->Top+2,"Text");

не працює - я маю на увазі нічого не відбувається

щоб було зрозуміліше що не так ось код

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect,
          int DataCol, TColumn *Column, TGridDrawState State)
{



if (ADOTable1->RecNo & 1)
    DBGrid1->Canvas->Brush->Color = clAqua;
// СПЕЦІАЛЬНО ЗАБРАВ else DBGrid1->Canvas->Brush->Color= clWhite; ЩОБ БУЛО ВИДНО РІЗНИЦЮ
if (DataCol==1)
    DBGrid1->Canvas->Font->Color= clRed;

if (Table1->FieldByName("_int_")->AsInteger>=100 && Column->FieldName=="_int_")
{
DBGrid1->Canvas->Brush->Color= clRed;
}

DBGrid1->Canvas->TextOut((&Rect)->Left+2,(&Rect)->Top+2,"Text");

DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);

}

і програма https://yadi.sk/d/TqetHgz3kSV66 (якщо вона в вас не працює напишіть)
http://s8.hostingkartinok.com/uploads/images/2015/11/fa55720da0005c0756cd18a1f215cb34.png