Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2008, 15:57   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию Совсем необычная раскраска DBGrid-a

Добрый день!
Я знаю как раскрасить ячейки по признаку, столбцы, строки DBGrid-а и иже с ними. А вопрос у меня такой:
Допустим у меня всего одна строка и 31 столбец. Столбцы - это числа месяца. В одну из ячеек ставим Ноль - это значит изделие запущено в производство. В более правую ячейку ставим Единицу (я сделаю проверку, чтобы нельзя было поставить 1 перед 0, это детали) - значит уже изготовлено.
Вопрос: можно ли закрасить ячейки от той где ноль до той где единица (т.е. период) без цикла.
Можно, конечно написать for i:=0 to grid.columns.count и т.п.
Но цикл будет дико тормозить систему. Можно ли как-нибудь нарисовать Rect "одним махом"? Мне что-то в голову ничего не приходит. (наверно, муза отвернулась )
_SERGEYX_ вне форума Ответить с цитированием
Старый 24.09.2008, 17:51   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Если строка действи одна, то вот это должно работать
Код:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  if Field.Tag = 1 then
    with DBGrid1.Canvas do begin
      Brush.Color := clMoneyGreen;
      FillRect (Rect);
    end;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
  i, j: Integer;
begin
  j := 0;
  with Table1 do
    for i := 0 to Fields.Count - 1 do begin
      if Fields [i].AsString = '0' then j := 1;
      Fields [i].Tag := j;
      if Fields [i].AsString = '1' then j := 0;
    end;
  DBGrid1.Repaint;
end;
Sibedir вне форума Ответить с цитированием
Старый 26.09.2008, 09:51   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Можно и так, но как я говорил, цикл будет создавать большие тормоза.
Я решил проблему по-другому. Добавил 2 поля OPENED и CLOSED. Если в какое-то поле ставлю ноль, то в поле OPENED ставлю число месяца, если удаляю его - в поле OPENED ставлю ноль. То же и для поля CLOSED.
И далее без цикла (делал в DBGridEh):

Код:
procedure TfrmMain.GridGetCellParams(Sender: TObject; Column: TColumnEh;
  AFont: TFont; var Background: TColor; State: TGridDrawState);
    if (Column.Index  + 1 <= SampleCLOSED.Value) and
      (Column.Index + 1 >= SampleOPENED.Value)
      then Background := clRed;
end;
Работает очень быстро даже при больших объемах данных.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
совсем тупым новичкам..include Yo-yo Помощь студентам 7 12.03.2012 07:27
помогите совсем начинающему с Dev-C++! Monkey Помощь студентам 9 27.03.2011 00:33
компьютер издает какую-то азбуку морзе - один длинный и два коротких гудка и не грузиться совсем Красавчег))) Свободное общение 13 18.01.2008 04:27
не совсем Random Аlex Общие вопросы Delphi 10 15.04.2007 13:23
Создание wap сайта – совсем не сложное дело! Hallo Обсуждение статей 14 04.01.2007 17:12