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

22/03/2013

0

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

Responder

Posts

23/03/2013

Landerson Santos

Olá
Dê umma olhada em CANVAS... para o seu grid.
Responder

23/03/2013

Joel Rodrigues

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

24/03/2013

Lindolfo Junior

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...
Responder

24/03/2013

Deivison Melo

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!!
Responder

25/03/2013

Lindolfo Junior

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;
Responder

02/04/2013

Lindolfo Junior

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
Responder

02/04/2013

Rafael Cunha

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.
Responder

02/04/2013

Lindolfo Junior

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???
Responder

02/04/2013

Rafael Cunha

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.
Responder

02/04/2013

Lindolfo Junior

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!!
Responder

02/04/2013

Rafael Cunha

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

02/04/2013

Lindolfo Junior

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


Valeu Rafael!!!! abs!
Responder

03/04/2013

Lindolfo Junior

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

abs..
Responder

03/04/2013

Ana Santos

Veja este link :

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

Espero que ajude
Responder

03/04/2013

Lindolfo Junior

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..
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar