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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2007, 16:34   #1
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию Раскрасить DBGrid

Здравствуйте, уважаемые программисты, помогите мне пожалуйста, буду очень признателен, мне нужно в программе реализовать одну штуку, опишу ниже:
1.Есть база данных сделанная в Database Desktop и оформлена в Delphi 6.0
2.Есть в ней два поля в каждой из существующих строк, первое - Дата приема, второе - Дата возврата(разница 21 день, допустим приняли-1.09.2007, вернуть должны 22.09.2007, причем заполнение ячеек происходит с помощью datetostr(date) и следовательно datetostr(date + 21))
3.Нужно что-то типа напоминания, чтобы выделялись другим шрифтом(или вообще выделялись как-нибудь) те строки в таблице, у которых с момента приема к моменту возврата остается 2 дня(т.е. следовательно исходя из примера выше допустим сегодня 19.09.2007 и при запуске программы должна быть проверка и результат в виде выделения в таблице), если что-то не полностью понятно, пишите, всё дорасскажу спасибо огромнейшее заранее!!!
alex_base вне форума Ответить с цитированием
Старый 26.10.2007, 16:59   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ничего сложного на горизонте не наблюдаю...
Используется обработка штатного события OnDrawDataCell для ДБГрида, т.е. при отрисовке проверяется ваше условие и при его выполнении строке или ячейке назначается красный шрифт (или красный фон с белым шрифтом).
mihali4 вне форума Ответить с цитированием
Старый 26.10.2007, 22:45   #3
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию HELP!!!

Спасибо за подсказку, но мне нужна помощь непосредственно с условием, буду рад если поможете...
alex_base вне форума Ответить с цитированием
Старый 27.10.2007, 09:06   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  if Table1.FieldByName('aDAte').asdatetime > date + 21 then
begin
    DBGrid1.Canvas.Font.Color := clRed;
  dbGrid1.DefaultDrawDataCell(Rect,Field,State);
end;
end;
А лучше юзать DBGridEh. Там есть событие OnGetCellParams. Работает раз в 10 быстрее, чем OnDrawDataCell. И никаких Рект-ов не нужно...
Код:
procedure TForm1.DBGridEh1GetCellParams(Sender: TObject; Column: TColumnEh;
   AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
   if Table1.FieldByName('aDAte').asdatetime > date + 21 then
   begin
      Background := clYellow;
      AFont.Color := clRed;
   end;
end;

Последний раз редактировалось _SERGEYX_; 27.10.2007 в 09:11.
_SERGEYX_ вне форума Ответить с цитированием
Старый 27.10.2007, 12:12   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Заливка делается гораздо проще:
DBGrid1.Canvas.FillRect(Rect);
Цитата:
А лучше юзать DBGridEh. Там есть событие OnGetCellParams. Работает раз в 10 быстрее, чем OnDrawDataCell.
Это, может быть, на 386-м процессоре?
У меня на "старичке" Р-2 400мгц я не замечаю процесса раскраски, все моментально происходит...

Последний раз редактировалось mihali4; 27.10.2007 в 13:43.
mihali4 вне форума Ответить с цитированием
Старый 27.10.2007, 12:23   #6
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию HELP!!!

Спасибо огромное за помощь, но почему-то матерится на Field что он неописанный идентификатор, прикреплю файл скрина...
Изображения
Тип файла: jpg error.JPG (76.9 Кб, 157 просмотров)
alex_base вне форума Ответить с цитированием
Старый 27.10.2007, 12:57   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Похоже, у вас ДБГрид не привязан ни к одному DataSet через DataSource...
Или у DataSet не определена привязка к базе...
Сделайте, чтобы у вас в ДБГриде отображалась информация, а уж потом займитесь раскраской.

Последний раз редактировалось mihali4; 27.10.2007 в 13:00.
mihali4 вне форума Ответить с цитированием
Старый 27.10.2007, 13:04   #8
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию HELP!!!

Всё привязано, просто может из-за того что все связи через datamodule?
alex_base вне форума Ответить с цитированием
Старый 27.10.2007, 14:17   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Это не влияет.
Вот обычно используемое мной универсальное решение:
Добавляем в юниту процедурку:
Код:
procedure TForm1.WriteText(ACanvas: TCanvas; ARect: TRect; DX, DY: Integer;
  const Text: string; Alignment: TAlignment);
const
  AlignFlags : array [TAlignment] of Integer =
    ( DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
      DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
      DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX );
var
  I, Left: Word;
begin
  I := ColorToRGB(ACanvas.Brush.Color);
  if GetNearestColor(ACanvas.Handle, I) = I then
  begin
   case Alignment of
      taLeftJustify:
        Left := ARect.Left + DX;
      taRightJustify:
        Left := ARect.Right - ACanvas.TextWidth(Text) - 3;
    else
    Left := ARect.Left + (ARect.Right - ARect.Left) shr 1
        - (ACanvas.TextWidth(Text) shr 1);
    end;
    ExtTextOut(ACanvas.Handle, Left, ARect.Top + DY, ETO_OPAQUE or
      ETO_CLIPPED, @ARect, PChar(Text), Length(Text), nil);
  end;
end;
А вот обработчик (пример):
Цитата:
procedure TForm1.DBGrid1DrawColumnCell(Sender : TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataModule.Table1.FieldByName('MyFi eld').Value... (условие) then
with DBGrid1.Canvas do
begin
Font.Color := clRed;
FillRect(Rect);
Brush.Color:=clWhite;
end;
WriteText(DBGrid1.Canvas,Rect,2,2,C olumn.Field.AsString,Column.Alignme nt);
end;
mihali4 вне форума Ответить с цитированием
Старый 27.10.2007, 17:01   #10
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию HELP!!!

Спасибо всем кто отозвался и попытался помочь, но к сожалению ничего толком и не заработало...
Попрошу просто разобраться с тем почему у меня в DBGrid1DrawDataCell матюкается на TField скрин приведен выше(файл прикреплен)... Мне подоходит тот вариант так как меньше писанины может быть хоть он заработает и наконец-то у меня таблица начнет выделять поля...
Ну а mihali4 спасибо за такой длинный пример, но мой мозг не смог понять что и как должно в таком коде работать, я всего лишь студент колледжа...

Последний раз редактировалось alex_base; 27.10.2007 в 17:04.
alex_base вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGrid Valera Помощь студентам 4 22.04.2009 16:54
DBGrid DOLBY Компоненты Delphi 29 08.10.2008 00:05
DBGrid Ane4ka БД в Delphi 28 01.06.2008 10:00
Как раскрасить ячейку внутри StringGrid. GarfieldX Общие вопросы Delphi 5 14.02.2008 21:59
Как раскрасить ячейки StringGrid'а в разные цвета в соответствии с условием? monushka Компоненты Delphi 12 05.11.2007 23:44