Pintar linha em várias DBGrids em tempo de execução...URGENTE

Delphi

22/03/2013

Boa tarde a todos!!

Acabo de me registrar no fórum, ainda não sei bem como funciona, mas enfim, vamos ao meu problema..

Tenho uma aplicação desenvolvida em Delphi6+Firebird, nela tenho uma agenda de compromissos, e vários profissionais, então, quando seleciono um profissional, mostra numa gride todos os compromissos, e as linhas variam de cor de acordo com o status do compromisso.

Agora quero fazer uma mapa global da agenda, então, peguei um form em branco e nele estou criando uma grid pra cada profissional em tempo de execução. Até ai td bem, esta criando e mostrando os dados, porém, não estou conseguindo pintar as linhas de acordo com o status de cada compromisso, como faço na agenda simples.

Alguém pode me dar uma luz????

abs

Junior
Lindolfo Junior

Lindolfo Junior

Curtidas 0

Respostas

Landerson Santos

Landerson Santos

22/03/2013

Olá
Dê umma olhada em CANVAS... para o seu grid.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

22/03/2013

Está ocorrendo algum erro? Qual é exatamente a dificuldade?
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Está ocorrendo algum erro? Qual é exatamente a dificuldade?


Então, não acontece nenhum erro, porém a única grid que esta colorindo e ainda incorretamente é a ultima grid criada, mas com corres nada a ver...
GOSTEI 0
Deivison Melo

Deivison Melo

22/03/2013

Verifique essa Unit, acho que ela tem tudo que você precisa!!

------------------------------------------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBClient, ComCtrls, ImgList;

type
TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
ClientDataSet1CUSTOMER_ID: TAutoIncField;
ClientDataSet1NAME: TStringField;
ClientDataSet1GENDER: TStringField;
ClientDataSet1COMPANY_ID: TIntegerField;
ClientDataSet1BIRTHDAY: TDateField;
ClientDataSet1BALANCE: TCurrencyField;
ClientDataSet1PICTURE: TBlobField;
ClientDataSet1ENABLED: TBooleanField;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ClientDataSet1NOTE: TBlobField;
ClientDataSet2: TClientDataSet;
ClientDataSet2VendorNo: TFloatField;
ClientDataSet2VendorName: TStringField;
ClientDataSet2Address1: TStringField;
ClientDataSet2Address2: TStringField;
ClientDataSet2City: TStringField;
ClientDataSet2State: TStringField;
ClientDataSet2Zip: TStringField;
ClientDataSet2Country: TStringField;
ClientDataSet2Phone: TStringField;
ClientDataSet2FAX: TStringField;
ClientDataSet2Preferred: TBooleanField;
ClientDataSet1COMPANY_NAME: TStringField;
DateTimePicker1: TDateTimePicker;
ImageList1: TImageList;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure DBGrid1TitleClick(Column: TColumn);
procedure DBGrid1EditButtonClick(Sender: TObject);
procedure DateTimePicker1Change(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure DBGrid1ColEnter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses ExtDlgs, DBCtrls;

{$R *.dfm}

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
R : TRect;
begin
// alternating color
if not odd(ClientDataSet1.RecNo) then
if not (gdselected in State) then
begin
DBGrid1.canvas.Brush.Color := $00FFEFDF;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);
end;
// calendar
DateTimePicker1.Visible := DBGrid1.SelectedField = ClientDataSet1BIRTHDAY;
if DateTimePicker1.Visible then
if gdFocused in State then
begin
DateTimePicker1.Date := ClientDataSet1BIRTHDAY.AsDateTime;
DateTimePicker1.SetBounds(Rect.Left,Rect.Top,
Rect.Right-Rect.Left,Rect.Bottom-Rect.Top);
end;
// highlight
if Column.Field = ClientDataSet1BALANCE then
if ClientDataSet1BALANCE.AsCurrency < 200 then
begin
DBGrid1.Canvas.Font.Style := DBGrid1.Canvas.Font.Style + [fsbold];
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(rect,Column.Field,state);
end;
// checkbox
if Column.Field = ClientDataSet1ENABLED then
begin
DBGrid1.Canvas.FillRect(Rect);
ImageList1.Draw(DBGrid1.Canvas,Rect.Left+10,Rect.top, 1);
if ClientDataSet1ENABLED.AsBoolean then
ImageList1.Draw(DBGrid1.Canvas,Rect.Left+10,Rect.top, 2)
else
ImageList1.Draw(DBGrid1.Canvas,Rect.Left+10,Rect.top, 0);
end;
// gender
if Column.Field = ClientDataSet1GENDER then
begin
DBGrid1.Canvas.FillRect(rect);
DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);
if ClientDataSet1GENDER.AsString = 'M' then
ImageList1.Draw(DBGrid1.Canvas,rect.Left,rect.top,3);
if ClientDataSet1.FieldByName('GENDER').AsString = 'F' then
ImageList1.Draw(DBGrid1.Canvas,rect.Left,rect.Top,4);
end;
// picture
if Column.Field = ClientDataSet1PICTURE then
begin
if not (gdSelected in State) then
DBGrid1.Canvas.FillRect(rect);
with TPicture.Create do
begin
Assign(ClientDataSet1PICTURE);
DBGrid1.Canvas.StretchDraw(rect,Bitmap);
Free;
end;
end;
// memo
R := Rect;
Dec(r.Bottom,2);
if Column.Field = ClientDataSet1NOTE then
begin
if not (gdSelected in State) then
DBGrid1.Canvas.FillRect(rect);
DrawText(DBGrid1.Canvas.Handle,
pchar(ClientDataSet1NOTE.AsString),
length(ClientDataSet1NOTE.AsString),
R,DT_WORDBREAK);
end;
end;

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if ClientDataSet1.IndexFieldNames <> '' then
DBGrid1.Columns[ClientDataSet1.FieldByName(
ClientDataSet1.IndexFieldNames).Index].Title.Color :=
DBGrid1.fixedColor;
if not (Column.Field.DataType in [ftBlob,ftMemo]) then
begin
ClientDataSet1.IndexFieldNames := Column.FieldName;
Column.Title.Color := $00FFBB77;
end;
end;

procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
var
OD: TOpenPictureDialog;
Frm: TForm;
MM: TDBMemo;
begin
if DBGrid1.SelectedField = ClientDataSet1PICTURE then
begin
OD := TOpenPictureDialog.Create(nil);
try
OD.Execute();
ClientDataSet1.Edit;
ClientDataSet1PICTURE.LoadFromFile(OD.FileName);
ClientDataSet1.Post;
finally
OD.Free;
end;
end;
if DBGrid1.SelectedField = ClientDataSet1NOTE then
begin
Frm := TForm.Create(nil);
try
Frm.Width := 240;
Frm.Height := 120;
Frm.top := Mouse.CursorPos.Y;
Frm.Left := Mouse.CursorPos.X;
Frm.BorderStyle := bsToolWindow;
Frm.Caption := 'Editing';
MM := TDBMemo.Create(nil);
try
MM.Parent := Frm;
MM.Align := alClient;
MM.DataSource := DataSource1;
MM.DataField := 'NOTE';
Frm.ShowModal;
if ClientDataSet1.State in [dsEdit,dsInsert] then
ClientDataSet1.Post;
finally
MM.Free;
end;
finally
Frm.Free;
end;
end;

end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
ClientDataSet1.Edit;
ClientDataSet1BIRTHDAY.AsDateTime := DateTimePicker1.Date;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if Column.Field = ClientDataSet1ENABLED then
begin
ClientDataSet1.Edit;
ClientDataSet1ENABLED.AsBoolean := not ClientDataSet1ENABLED.AsBoolean
end;
end;

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
if DBGrid1.SelectedField = ClientDataSet1ENABLED then
DBGrid1.Options := DBGrid1.Options - [dgEditing]
else
DBGrid1.Options := DBGrid1.Options + [dgEditing];
end;

end.

------------------------------------------------------------------------

Abraços e bons códigos!!
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Deivison, nesse seu código, sua grid ja esta no form, certo? Bom, vou postar o meu código que acho melhor pra vcs me ajudarem

nesse primeiro evento eu crio as dbgrids,querys,datasource, etc..

var
FPanorama: TFPanorama;
VIni,VFim,vStatus,vGrid : String;
vLocked : Integer;
DBGrid : TDBGrid;
QGrid : TADOQuery;
DSource : TDataSource;

procedure TFPanorama.FormShow(Sender: TObject);
var
I,B,D : Integer;
varLeft,varLeftLabel,varTop,varTopLabel,varWidth,varHeight : integer;
vLabel : TLabel;
begin
//--------------------- definição do ponto inicial da criação da grid ---------------------------------
varLeft := 9;
varLeftLabel := 9;
varTop := 50;
varTopLabel := 35;
varWidth := 250;
varHeight := 440;
//--------------------- abertura da tabela de médicos cadastrados -------------------------------------
QMedicos.Close;
QMedicos.Open;
QMedicos.First;
For i := 0 to QMedicos.RecordCount -1 do
begin
//----------------- criação dos componentes e suas configurações ----------------------------------
DBGrid := TDBGrid.Create( Self );
DSource := TDataSource.Create( self );
QGrid := TADOQuery.Create(Self);
vLabel := TLabel.Create( Self );

DBGrid.Name := 'grid'+QMedicosE03_CODMED.AsString;
DSource.Name := 'ds'+QMedicosE03_CODMED.AsString;
QGrid.Name := 'Q'+QMedicosE03_CODMED.AsString;
vLabel.Name := 'lb'+QMedicosE03_CODMED.AsString;

vLabel.Parent := Self;
vLabel.Top := varTopLabel;
vLabel.Left := varLeftLabel;
vLabel.Caption := QMedicosE03_NOMEMED.AsString;

DSource.DataSet := QGrid;
DBGrid.Parent := Self;
DBGrid.Left := varLeft;
DBGrid.Top := varTop;
DBGrid.Width := varWidth;
DBGrid.Height := varHeight;
DBGrid.DataSource := DSource;
DBGrid.Options := [dgRowSelect,dgTitles,dgColLines,dgTabs,dgConfirmDelete,dgCancelOnExit];
DBGrid.FixedColor := clSilver;

//------------------- seleção dos horarios livres dos profissionais -------------------------------
QGrid.Connection := DMGeral.Conect1;
QGrid.Close;
QGrid.SQL.Clear;
QGrid.SQL.Add('Select e10_hora,e10_codpac,e10_paciente,e10_status,e10_locked from GE010,GE003 where E10_Data = '+QuotedStr(DMGeral.ConvertDataFB(VIni)));
QGrid.SQL.Add(' and E10_Medico = '+QuotedStr(QMedicosE03_CODMED.AsString)+' and E10_Medico = E03_CodMed order by e10_hora');
QGrid.Open;
vGrid := 'grid'+QMedicosE03_CODMED.AsString;
For B := 0 To QGrid.FieldCount - 1 Do
With DBGrid.Columns.Add Do Begin
FieldName := QGrid.Fields[B].FieldName;
End;
DBGrid.Columns[0].Title.Alignment := taCenter;
DBGrid.Columns[0].Title.Caption := 'Hora';
DBGrid.Columns[1].Title.Alignment := taCenter;
DBGrid.Columns[1].Title.Caption := 'Código';
DBGrid.Columns[2].Title.Alignment := taCenter;
DBGrid.Columns[2].Title.Caption := 'Paciente';
for D := 0 to QGrid.RecordCount - 1 do
begin
vStatus := QGrid.Fields[3].asstring;
TDBGrid(FindComponent(vGrid)).OnDrawColumnCell := ColorirGrid;
end;
varLeft := varLeft+260;
varLeftLabel := varLeftLabel+260;
QMedicos.Next;
end;
end;

depois criei essa procedure pra colorir as linhas das grids criadas de acordo com o status da linha:

Procedure TFPanorama.ColorirGrid(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
If vStatus = 'Atendido' then
begin
TDBGrid(FindComponent(vGrid)).Canvas.Brush.Color:= $00F0F0FF; ***** aqui fiz uma tentativa ta tentar localizar o
TDBGrid(FindComponent(vGrid)).Canvas.Font.Color := clBlack; ***** componente e colorir
// DBGrid.Canvas.Brush.Color:= $00F0F0FF;
// DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Chegou' then
begin
DBGrid.Canvas.Brush.Color:= clMoneyGreen;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Inativo' then
begin
DBGrid.Canvas.Brush.Color:= $00D5FFD5;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Espera' then
begin
DBGrid.Canvas.Brush.Color:= clPurple;
DBGrid.Canvas.Font.Color := clWhite;
end
else If vStatus = 'Faltou' then
begin
DBGrid.Canvas.Brush.Color:= $0089E1FE;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'SemGuia' then
begin
DBGrid.Canvas.Brush.Color:= clRed;
DBGrid.Canvas.Font.Color := clWhite;
end
else If vStatus = 'Cirurgia' then
begin
DBGrid.Canvas.Brush.Color:= $004FA7FF;
DBGrid.Canvas.Font.Color := clWhite;
end
else If vStatus = 'Cortesia' then
begin
DBGrid.Canvas.Brush.Color:= clCream;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Curso' then
begin
DBGrid.Canvas.Brush.Color:= clAqua;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Exame' then
begin
DBGrid.Canvas.Brush.Color:= clTeal;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Retorno' then
begin
DBGrid.Canvas.Brush.Color:= clGreen;
DBGrid.Canvas.Font.Color := clWhite;
end
else If vStatus = 'Reunião' then
begin
DBGrid.Canvas.Brush.Color:= clActiveCaption;
DBGrid.Canvas.Font.Color := clWhite;
end
else If vStatus = 'Encaixe' then
begin
DBGrid.Canvas.Brush.Color:= $0084FFFF;
DBGrid.Canvas.Font.Color := clBlack;
end
else If vStatus = 'Plantão' then
begin
DBGrid.Canvas.Brush.Color:= $007C9AAF;
DBGrid.Canvas.Font.Color := clBlack;
end
else
begin
if vLocked = agLocked then
begin
DBGrid.Canvas.Brush.Color:= clSilver;
DBGrid.Canvas.Font.Color := clNavy;
end
else
begin
DBGrid.Canvas.Brush.Color:= $F3F3F3;
DBGrid.Canvas.Font.Color := clNavy;
end;
end;
DBGrid.DefaultDrawDataCell(Rect, DBGrid.Columns[DataCol].Field, State);

if (TAuxDBGrid(DBGrid).DataLink.ActiveRecord + 1 = TAuxDBGrid(DBGrid).Row) or (gdSelected in State) then
begin
DBGrid.Canvas.Brush.Color := clSkyBlue;
DBGrid.Canvas.Font.Style := DBGrid.Canvas.Font.Style + [fsBold];
DBGrid.Canvas.Font.Color := clWhite;
end;
DBGrid.Canvas.FillRect(Rect);
DBGrid.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString);
end;
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Então pessoal, ainda não consegui resolver o meu problema, será que alguém poderia analisar o meu código e me dizer onde estou errando?? Desde já agradeço a atenção de todos..

abraços
GOSTEI 0
Rafael Cunha

Rafael Cunha

22/03/2013

Cara seu problema é o seguinte, você está utilizando variável global, então quando você for colorir a grid no método "ColorirGrid" o mesmo irá utilizar a ultima referencia da variável. Isso está ocorrendo para vStatus, vGrid e DBGrid.
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Cara seu problema é o seguinte, você está utilizando variável global, então quando você for colorir a grid no método "ColorirGrid" o mesmo irá utilizar a ultima referencia da variável. Isso está ocorrendo para vStatus, vGrid e DBGrid.


Então Rafael, mas na criação da grid estou fazendo um for nessas variáveis pra identificar a situação de cada uma, dessa forma não funciona???
GOSTEI 0
Rafael Cunha

Rafael Cunha

22/03/2013

Não pós sempre que você fizer "vStatus := QGrid.Fields[3].asstring;" o vStatus irá ser o valor da linha não, não permanecendo o valor anterior.
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Não pós sempre que você fizer "vStatus := QGrid.Fields[3].asstring;" o vStatus irá ser o valor da linha não, não permanecendo o valor anterior.


então oque eu faço??? oque eu preciso mudar?? me da uma luz por favor!!
GOSTEI 0
Rafael Cunha

Rafael Cunha

22/03/2013

Vou tentar fazer um código te exemplo hoje e posto aqui.
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Vou tentar fazer um código te exemplo hoje e posto aqui.


Valeu Rafael!!!! abs!
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

continuo com o problema, alguém me ajude, desculpe a insistência, mas é que estou precisando muito resolver isso...

abs..
GOSTEI 0
Ana Santos

Ana Santos

22/03/2013

Veja este link :

http://delphi.about.com/od/usedbvcl/l/aa031699.htm

Espero que ajude
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Veja este link :

http://delphi.about.com/od/usedbvcl/l/aa031699.htm

Espero que ajude


Oi ana, então, nesse caso a grid esta no form e aí é feito o código pra colorir, nesse formato eu tenho uma grid que já funciona, o meu problema é que quero colorir uma grid em tempo de execução, ou seja, ela ainda não existe e não estou conseguindo, não sei se vc viu o meu código, mas mesmo assim, muito obrigado pela ajuda..
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Veja este link :

http://delphi.about.com/od/usedbvcl/l/aa031699.htm

Espero que ajude


Oi ana, então, nesse caso a grid esta no form e aí é feito o código pra colorir, nesse formato eu tenho uma grid que já funciona, o meu problema é que quero colorir uma grid em tempo de execução, ou seja, ela ainda não existe e não estou conseguindo, não sei se vc viu o meu código, mas mesmo assim, muito obrigado pela ajuda..
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Vou tentar fazer um código te exemplo hoje e posto aqui.


Rafael, vc conseguiu alguma novidade com relação à dbgrid que conversamos???
GOSTEI 0
Lindolfo Junior

Lindolfo Junior

22/03/2013

Aí pessoal, eu continuo com o meu problema, será que alguém pode me dar uma ajuda, tem o meu código num post acima..

vlw
GOSTEI 0
POSTAR