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


Автор: rOOxus 24.10.2006, 16:03
Господа, на разных форумах я видел много статей о том как это делается на Delphi. Давайте поговорим о том как то же можно сделать с помощью Builder!  smile 

Автор: Rodman 24.10.2006, 20:38
Ну вот к http://www.compdoc.ru/prog/builder/grid/

Автор: rOOxus 25.10.2006, 09:01
спасибо. помогло. но вот в чем загвоздка! не могу понять как работать с TGridDrawState State!  smile 
на Delphi это выглядит так

if gdFocused in State then
 begin
  <рисуем так>
 end
 else
 begin
  <рисуем сяк>
 end

а в Builder if (State  == gdFocused ) - не катит  smile

Автор: Rodman 25.10.2006, 11:47
У меня тоже не работало...

Я слелал сравнение с номерами столбцов и строк ячейки... попробуй вместо 
Код


if gdFocused in State then
 begin
  <рисуем так>
 end
 else
 begin
  <рисуем сяк>
 end


такое 
Код


if (ACol==2) then //или че нить подобное
 begin
  <рисуем так>
 end
 else
 begin
  <рисуем сяк>
 end

Автор: rOOxus 25.10.2006, 13:00
помоему ты не понял. мне надо чтобы так:

СОБЫТИЕ ПРОРИСОВКИ КОЛОНОК

Код

void __fastcall TDeclarantsForm::DBGridDrawColumnCell(
      TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
 if(State == gdSelected) // ОТ ЭТО УСЛОВИЕ ВЫДАЕТ ОШИБКУ
 {
  //<рисуем так>
 }
 else
 {
  //<рисуем этак>
 }
}


в Delphi делается так:

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
BEGIN
 IF (gdSelected in State) Then { А ОТУТ ВСЕ ОК}
 BEGIN
  {<рисуем так>}
 END
 ELSE
 BEGIN
  {<рисуем этак>}
 END
END


Короче надо правильно заменить условие с синтаксиса Delphi на синтаксис C++ Builder. вот.

Автор: rOOxus 25.10.2006, 14:36
а надо так
Код

void __fastcall TDeclarantsForm::DBGridDrawColumnCell(
      TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
 if(State.Contains(gdSelected)) // И ВСЕ РАБОТАЕТ
 {
  //<рисуем так>
 }
 else
 {
  //<рисуем этак>
 }
}

в help-е нашел  smile 

Автор: Rodman 25.10.2006, 17:42
rOOxus, сори что запутал... я думал ты обрабатываешь OnDrawCells...

Автор: CLIPSA 27.10.2006, 02:21
Вот здесь всё очень подробно об этом:

http://www.sources.ru/builder/builder_db.shtml

Автор: bas 27.10.2006, 11:51
http://www.citforum.ru/programming/advice/advice04.shtml
http://www.citforum.ru/programming/delphi/nogrid

Автор: aleks88 5.2.2012, 18:16
Код

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
if ((Dataset1->FieldByName("SUMMA")->Value==500) &&
Column->FieldName=="SUMMA"  )
{
//DBGrid1->Canvas->Brush->Color=clRed;
DBGrid1->Canvas->Font->Color=clRed;
DBGrid1->Canvas->FillRect(Rect);
DBGrid1->Canvas->TextOutA(Rect.left+2, Rect.top+2, Column->Field->Text);
}


Вот так закрашиваю ячейку, в которой числовое значение равно 500.
Но задача несколько иная - закрасить если дата в ячейке, позднее сегодняшней.

Вот так сравниваю даты:

Код

TDate A=Now().CurrentDate();
TDate B=StrToDate(Dataset1->FieldByName("dDate")->AnsiString);
signed char Result=CompareDate(A,B);

Если  StrToDate() возвращает -1, значит ячейку нужно закрасить, как это сделать ? Или есть другой способ закрасить ячейку по условию с датами ?


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