Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменять цвет строк в DBGride, на основе данных в его строках 
:(
    Опции темы
Ner-zul
  Дата 13.9.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я работаю в Delphi6 и база у меня под Interbase7.1

Я хотел бы разрешить два вопроса:
1) Можно ли раскрашивать строки DBGrida разными цветами??? Как это сделать на основании данных в строках самого DBGrida?
2)Можно ли найти разность в днях или к примеру в часах между двумя переменными типа Даты ???



--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Rodman
Дата 13.9.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Код

unit atcDBGrid;  
(*  
  (c) Aveen Tech  
  2001 - 2002  

  FileName: atcDBGrid.pas  

  Version        Date            Author              Comment  
  1.0            13/06/2000      Majid Vafai Jahan  Create.  

OVERVIEW  
  - This grid is inherited from DBGrid and add some required functionality to it.  

Functionality:  
  - Record type are all records that may be modified, unmodified, inserted, deleted.  
  - Coloring according to Record type.  
  - show selected Record Type.  

*)  

interface  

uses  
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
  Grids, DBGrids, dbTables, db;  
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 );  
  RTL: array [Boolean] of Integer = (0, DT_RTLREADING);  
type  
  TCachedShow = (csModify, csUnModify, csRemoved, csInserted, csAll, csNormal);  
  TatcDBGrid = class(TDBGrid)  
  private  
    FCachedShow: TCachedShow;  
    FModifiedColor: TColor;  
    FInsertedColor: TColor;  
    FDeletedColor: TColor;  
    procedure SetCachedShow(const Value: TCachedShow);  
  protected  
    procedure DrawDataCell(const Rect: TRect; Field: TField;  
      State: TGridDrawState); override;  
    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;  
      Column: TColumn; State: TGridDrawState); override;  
  public  
    constructor Create(AOwner: TComponent); override;  
  published  
    property atcCachedShow: TCachedShow read FCachedShow write SetCachedShow;  
    property atcDeletedColor: TColor read FDeletedColor write FDeletedColor;  
    property atcInsertedColor: TColor read FInsertedColor write FInsertedColor;  
    property atcModifiedColor: TColor read FModifiedColor write FModifiedColor;  
  end;  

procedure Register;  

implementation  

(******************************************************************************)  
procedure Register;  
begin  
  RegisterComponents('ATC DB Compo', [TatcDBGrid]);  
end;  

(******************************************************************************)  
constructor TatcDBGrid.Create(AOwner: TComponent);  
(*  
  Description: Record Type Showing is All except Deletes.  
*)  

begin  
  inherited;  
  FCachedShow := csNormal;  
  FDeletedColor := clGray;  
  FInsertedColor := clAqua;  
  FModifiedColor := clRed;  
end;  

(******************************************************************************)  
procedure TatcDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;  
  Column: TColumn; State: TGridDrawState);  
(*  
  Description: On Drawing Column Color Updated Records.  
*)  
var  
  ARect: TRect;  
begin  
  inherited;  
  if not Assigned(Column.Field) then  
    exit;  
  // Copy Rect into Variable.  
  CopyRect(ARect, Rect);  
  if Assigned(DataLink) and (DataLink.Active) and (DataLink.DataSet <> nil) then  
  begin  
    // если текущая запись изменена 
    if DataLink.DataSet.UpdateStatus = usModified then  
    begin  
      Canvas.Brush.Color := atcModifiedColor;  
      Canvas.Font.Color := clBlack;  
      Canvas.FillRect(Rect);  
      DrawText(Canvas.Handle, PChar(Column.Field.Text), Length(Column.Field.Text), ARect,  
       AlignFlags[Column.Alignment] or RTL[UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)]);  
    end  
    // если текущая запись добавлена. 
    else if DataLink.DataSet.UpdateStatus = usInserted then  
    begin  
      Canvas.Brush.Color := atcInsertedColor;  
      Canvas.Font.Color := clBlack;  
      Canvas.FillRect(Rect);  
      DrawText(Canvas.Handle, PChar(Column.Field.Text), Length(Column.Field.Text), ARect,  
       AlignFlags[Column.Alignment] or RTL[UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)]);  
    end  
    // если текущая запись удалена. 
    else if DataLink.DataSet.UpdateStatus = usDeleted then  
    begin  
      Canvas.Brush.Color := atcDeletedColor;  
      Canvas.Font.Color := clWhite;  
      Canvas.FillRect(Rect);  
      DrawText(Canvas.Handle, PChar(Column.Field.Text), Length(Column.Field.Text), ARect,  
       AlignFlags[Column.Alignment] or RTL[UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)]);  
    end;  
  end;  
end;  

(******************************************************************************)  
procedure TatcDBGrid.DrawDataCell(const Rect: TRect; Field: TField;  
  State: TGridDrawState);  
(*  
  Описание: Рисуем ячейки 
*)  
var  
  ARect: TRect;  
begin  
  inherited;  
  CopyRect(ARect, Rect);  

  if Assigned(DataLink) and (DataLink.Active) and (DataLink.DataSet <> nil) then  
  begin  
    // если текущая запись изменена 
    if DataLink.DataSet.UpdateStatus = usModified then  
    begin  
      Canvas.Brush.Color := clRed;  
      Canvas.Font.Color := clBlack;  
      Canvas.FillRect(Rect);  
      DrawText(Canvas.Handle, PChar(Field.Text), Length(Field.Text), ARect,  
       AlignFlags[Field.Alignment] or RTL[UseRightToLeftAlignmentForField(Field, Field.Alignment)]);  
    end  
    // если текущая запись добавлена. 
    else if DataLink.DataSet.UpdateStatus = usInserted then  
    begin  
      Canvas.Brush.Color := clAqua;  
      Canvas.Font.Color := clBlack;  
      Canvas.FillRect(Rect);  
      DrawText(Canvas.Handle, PChar(Field.Text), Length(Field.Text), ARect,  
       AlignFlags[Field.Alignment] or RTL[UseRightToLeftAlignmentForField(Field, Field.Alignment)]);  
    end  
    // если текущая запись удалена. 
    else if DataLink.DataSet.UpdateStatus = usDeleted then  
    begin  
      Canvas.Brush.Color := clGray;  
      Canvas.Font.Color := clWhite;  
      Canvas.FillRect(Rect);  
      DrawText(Canvas.Handle, PChar(Field.Text), Length(Field.Text), ARect,  
       AlignFlags[Field.Alignment] or RTL[UseRightToLeftAlignmentForField(Field, Field.Alignment)]);  
    end;  
  end;  
end;  

(******************************************************************************)  
procedure TatcDBGrid.SetCachedShow(const Value: TCachedShow);  
(*  
  Description: Record type for showing in grid.  
  Parameters: Value cached record show.  
*)  

begin  
  FCachedShow := Value;  
  if ComponentState = [csDesigning] then  
    exit;  
  if not Assigned(DataSource) or not Assigned(DataSource.DataSet) then  
    exit;  
  // для показа только выбранного типа записей. 
  if Assigned(DataLink) and Assigned(DataLink.DataSet) and (DataLink.Active) then  
  begin  
    case FCachedShow of  
    csAll:  
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtModified, rtInserted, rtDeleted, rtUnmodified];  
    csModify:  
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtModified];  
    csUnModify:  
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtUnmodified];  
    csInserted:  
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtInserted];  
    csRemoved:  
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtDeleted];  
    csNormal:  
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtModified, rtInserted, rtUnmodified];  
    end;  
  end;  
end;  

(******************************************************************************)  
end. 


или 
Код

type  
  TCustomDBGridCracker = class(TCustomDBGrid);  

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;  
  const Rect: TRect; DataCol: Integer; Column: TColumn;  
  State: TGridDrawState);  
begin  
  with Cracker(Sender) do  
    if DataLink.ActiveRecord = Row - 1 then  
      Canvas.Brush.Color := clRed  
    else  
      Canvas.Brush.Color := clWhite;  
  DefaultDrawColumnCell(Rect, DataCol, Column, State);  
end; 



PM MAIL WWW Skype GTalk YIM MSN   Вверх
Ner-zul
Дата 13.9.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



эммм..

а можно ли както обращаться к строке DBGrida анализируя информацию в ней?
Например, если DBGrid.Fields[5].Value = 5 then  DBGrid.Fields[5].Color := red ??????

Ну что нибудь в этом роде?
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Rodman
Дата 13.9.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Я вот нашел пример, но на C++Builder
Код

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{    TDataSet *dataset = Column->Field->DataSet;

    // Если страна из Южной Америки, то выделяем её жёлтым
    if(dataset->FieldByName("Continent")->AsString == "South America")
    {
        DBGrid1->Canvas->Brush->Color = clYellow;
    }

    // Если ячейка выбрана, то делаем текст красным и жирным
    if(State.Contains(Grids::gdSelected))
    {
        DBGrid1->Canvas->Font->Color = clRed;
        DBGrid1->Canvas->Font->Style = TFontStyles() << fsBold;
    }

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




PM MAIL WWW Skype GTalk YIM MSN   Вверх
Fedia
Дата 13.9.2006, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

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



Цитата(Ner-zul @  13.9.2006,  16:22 Найти цитируемый пост)
а можно ли както обращаться к строке DBGrida анализируя информацию в ней?Например, если DBGrid.Fields[5].Value = 5 then  DBGrid.Fields[5].Color := red ??????

Например так:
Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  //если поле пятое по счету и содержит значение 5-ть, то закрашиваем
  if Column.Field.FieldNo = 5 then
  if Column.Field.Value = 5 then
  begin
    DBGrid1.canvas.Brush.Color:=clInfoBk;
    DBGrid1.canvas.FillRect(Rect);
    DBGrid1.canvas.TextOut(Rect.left+3, Rect.Top+2, Column.Field.Value);
  end;
end;


Цитата(Ner-zul @  13.9.2006,  15:51 Найти цитируемый пост)
Можно ли найти разность в днях или к примеру в часах между двумя переменными типа Даты ???

количество дней: trunc(dt1-dt2);
количество часов:  trunc((dt1-dt2)/24);



--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
SergeBS
Дата 14.9.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

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



DelphiKingdom - статья "разноцветный DBGrid". Там ответы на все вопросы.
PM MAIL   Вверх
Ner-zul
Дата 14.9.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Fedia, то что надо ! очень благодарен!!!
Также благодарен всем за подробные консультации!
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
SergeBS
Дата 14.9.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

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



Fedia
Цитата

количество часов:  trunc((dt1-dt2)/24);

Не так. Правильно:
(dt1-dt2)*24 - всего часов (т.е. 2 дня 5 часов -> 53 часа)
или 
((dt1-dt2) - trunc(dt1-dt2))*24
если только часов (т.е. 2 дня 5 часов -> 5 часов)

Для DateTime.
Спешишь smile

PM MAIL   Вверх
Ner-zul
Дата 14.9.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Только для нахождения часов надо не 

  trunc((dt1-dt2)/24);
 
а умножать на 24 :

  trunc((dt1-dt2)*24);

=)) ну эт пустяки...
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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