Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цвета строк в DBGrid, наступил на грабли :) 
:(
    Опции темы
Ptica
Дата 24.3.2005, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 27.7.2004

Репутация: нет
Всего: 2



Проблема следующая: нужно отображать разные строки в таблице разным цветом в зависимости от условия. Прочел тучу примеров того, как это делается, сделал... работает! Похвастался коллеге. Он у себя давай то же самое делать... не работает! Во блин... Фрагменты кода практически идентичные, но у меня работает, а у него - нет. Бились мы с ним, бились... вот и у меня перестало работать. smile smile . Что же выяснилось: я в своих экспериментах просто кинул на форму DBGrid, подсоединил к DataSource, и успокоился. А у коллеги в программе колонки грида были добавлены через Column Editor. И как только я сделал то же самое... вся моя радуга с экрана пропала.
Вот код (Delphi 6)
Код

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  If Table1.FieldByName('age').AsInteger > 30 then
     DBGrid1.Canvas.Font.Color := clNavy
  Else
     DBGrid1.Canvas.Font.Color := clRed;
     
  DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;

Есть ли методы получше?

Это сообщение отредактировал(а) Ptica - 24.3.2005, 14:32
PM MAIL   Вверх
bursa
Дата 24.3.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 25.2.2005
Где: Липецк

Репутация: 1
Всего: 1



Цитата(Ptica @ 24.3.2005, 14:30)
А у коллеги в программе колонки грида были добавлены через Column Editor

Если просто, оставляя всё как есть - прибить колонки в DBGrid, а добавить их из FieldEditor самого TTable или TQuery. Эффект тот же (название, длина, маска,видимость), а глюков меньше. Ну а главное, твой код выше будет работать

PM MAIL   Вверх
Ptica
Дата 24.3.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 27.7.2004

Репутация: нет
Всего: 2



bursa
Спасибо, попробую. Пока что я обнаружил, что если вместо
Цитата
DrawDataCell
использовать
Цитата
DrawColumnCell
то все будет нормально. И правильно; написано же в хэлпе, что DrawDataCell оставлен только для обратной совместимости.
PM MAIL   Вверх
Cetus
Дата 24.3.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



смотри DRKB23 там все прекрасно расписано smile
--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
Bes
Дата 5.4.2005, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



Кстати, а можно ячейки закрашивать, а не цвет шрифта менять?
PM MAIL   Вверх
DimW
Дата 5.4.2005, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
Кстати, а можно ячейки закрашивать, а не цвет шрифта менять?


DBGrid1DrawDataCell:
Код

if gdFocused in State then
with (Sender as TDBGrid).Canvas do
   begin
     Font.Color := $D56A00;
     FillRect(Rect);
     TextOut(Rect.Left,Rect.top, Field.AsString);
   end;

PM MAIL ICQ   Вверх
Bes
Дата 5.4.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2DimW: У меня ничего не произошло...?
А, нет, все заработало, только все равно не то.
Надо сделать "шахматную доску" из DBGrid-а.

Это сообщение отредактировал(а) Bes - 5.4.2005, 09:51
PM MAIL   Вверх
DimW
Дата 5.4.2005, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Во класс, ну тебя прет...
А поподробнее можно!!!! smile
Может тему новую откроешь?
PM MAIL ICQ   Вверх
Bes
Дата 5.4.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



smile Не, ну т.е. есл каждую клеточку в особый цвет можно покрасить, значит любую задачу связаную с расцветкой ДБГрида решить можно.
PM MAIL   Вверх
DimW
Дата 5.4.2005, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
Надо сделать "шахматную доску" из DBGrid-а.


Все понял это ты образно сказал... а я и думаю почему DBGrig...
PM MAIL ICQ   Вверх
Bes
Дата 5.4.2005, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



Ага, ну дак че, есть идеи. додумался только до того, чтобы программно модифицировать Рект в таком коде,

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var
     REC:TRect;
begin
     If ADOQuery1.FieldByName('sm').AsInteger = 12 then
     begin
          DBGrid1.Canvas.Font.Color := clNavy;
          DBGrid1.Canvas.Brush.Color:=clYellow;
          Rec:=Rect;
          Rec.Left:=DBGrid1.Columns[0].Width+13;
          Rec.Right:=Rec.Left+DBGrid1.Columns[1].Width;

     //REC.Right:=2;
     DBGrid1.DefaultDrawColumnCell(Rec,DataCol,Column,State);// (Rect, DataCol, State); }
     end Else
     begin
          DBGrid1.Canvas.Font.Color := clRed;
          //DBGrid1.Columns[1].Color:=clBlack;
          DBGrid1.Canvas.Brush.Color:=clBlack;
          DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);// (Rect, DataCol, State); }
     end;
     {Rec:=Rect;
     Rec.Left:=1;
     REC.Right:=2;
     DBGrid1.DefaultDrawColumnCell(Rec,DataCol,Column,State);// (Rect, DataCol, State); }


end;


но может есть что-то человеческое?
PM MAIL   Вверх
DimW
Дата 6.4.2005, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Bes вот тебе шахматная доска из DBGrid:

Код

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
if Table1.RecNo mod 2<>0 then
  begin
  if  (Field.FieldNo mod 2=0) then DBGrid1.Canvas.Brush.Color := clblack;
  if  (Field.FieldNo mod 2<>0)then DBGrid1.Canvas.Brush.Color := clYellow;
  end;

if Table1.RecNo mod 2=0 then
  begin
  if  (Field.FieldNo mod 2=0) then DBGrid1.Canvas.Brush.Color :=clYellow;
  if  (Field.FieldNo mod 2<>0)then DBGrid1.Canvas.Brush.Color :=clblack;
  end;
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;


Все оказалось довольно просто, ведь правда? smile
PM MAIL ICQ   Вверх
Cetus
Дата 7.4.2005, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 18.4.2004

Репутация: нет
Всего: 1



в догонку ...
я бы к DataSet через DBGrid.DataSource.DataSet обращался

procedure ...
var DS : TDataSet;
begin
DS := DBGrid.DataSource.DataSet;
if DS.RecNo = ...
...
end;

и тогда эту процедуру на несколько DBGrid можно будет завести
--------------------
Легко внести изменения в код.Трудно сделать это корректно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1611 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.