Fórum Ajuda nos comandos if e elser #444536

02/06/2013

0

Boa Tarde a todos, estou com o seguinte problema e gostaria da ajuda dos amigos. Criei uma situação no delphi que e a seguinte: para cada tipo de condição colocada no campo status da minha tabela, vai ser direcionada uma cor para ser exibida no dbgrid, esta tudo funcionando, porem quando vou no dbgrid e vou no regsitro que era para estar em vermelho, todos regsitro ficam vermelho, se vou em um que tenha que ser verde, todos ficam verde, quero que cada um fique com sua cor, independente se eu clicar em um ou outro. Desde ja fico agradecido. Att, Felipe. Segue abaixo o codigo:

procedure TFRAtendimento.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if IBTable5.FieldByName ('STATUS').Value='FINALIZADA' then

begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clRed;
end else

begin
if IBTable5.FieldByName ('STATUS').Value='AGUARDANDO RETORNO' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clBlue;
end else

begin
if IBTable5.FieldByName ('STATUS').Value='EM ANDAMENTO' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clGreen;
end else

begin
if IBTable5.FieldByName ('STATUS').Value='RETORNAR' then

begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clpurple;
end;
end;
end;
end;
DBGrid1.DefaultDrawDataCell(Rect, Column.field, State);
end;
Felipe Arruda

Felipe Arruda

Responder

Posts

02/06/2013

Demian Soares

if IBTable5.FieldByName ('STATUS').Value='FINALIZADA' then

begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clRed;
end
else if IBTable5.FieldByName ('STATUS').Value='AGUARDANDO RETORNO' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clBlue;
end
else if IBTable5.FieldByName ('STATUS').Value='EM ANDAMENTO' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clGreen;
end
else if IBTable5.FieldByName ('STATUS').Value='RETORNAR' then

begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clpurple;
end;
Responder

Gostei + 0

02/06/2013

Felipe Arruda

Boa Noite amigo, desde ja agradeço a ajuda, porem o codigo que você passou agora nem colore as linhas.

Obrigado.
Att, Felipe.
Responder

Gostei + 0

02/06/2013

Alan Souza

tem um begin depois de cada else que encadeia errado sua sequência de if's. O código do Demian corrige isso, mas provavelmente você retirou a linha:

 DBGrid1.DefaultDrawDataCell(Rect, Column.field, State); 


caso interesse, segue meu teste (baseado no DBDEMOS):

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Table1LAST_NAME.AsString='Davis' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clRed;
end
else
if Table1LAST_NAME.AsString='Jones' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clBlue;
end else
if Table1LAST_NAME.AsString='Parker' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clGreen;
end else
if Table1LAST_NAME.AsString='Sawyer' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clpurple;
end;
DBGrid1.DefaultDrawDataCell(Rect, Column.field, State);
end;
Responder

Gostei + 0

03/06/2013

Felipe Arruda

Bom dia a todos, alanps, vc disse corretamente eu tinha apagado a linha, porem o erro continua, esse codigo que vc ate poderia ajudar, porem como e uma aplicação simples não estou usando DBDEMOS e também nem sei como usa-la direito. O cdigo do Demian tem algo errado vc's podem me ajudar?

procedure TFRAtendimento.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

begin
if IBTable5.FieldByName ('STATUS').Value='FINALIZADA' then

begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clRed;
end
else if IBTable5.FieldByName ('STATUS').Value='AGUARDANDO RETORNO' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clBlue;
end
else if IBTable5.FieldByName ('STATUS').Value='EM ANDAMENTO' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clGreen;
end
else if IBTable5.FieldByName ('STATUS').Value='RETORNAR' then

begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clpurple;
end;
DBGrid1.DefaultDrawDataCell(Rect, Column.field, State);
end;
Responder

Gostei + 0

03/06/2013

Guilherme Wiethaus

Ola meu querido,

Seguinte você também esqueceu de colocar o método Fillrect() que informa a área que se deseja colorir. Quando o evento é disparado, o Rect possui os dados da região (Coordenadas) que se aplica. Pode-se alterar esta região restringindo ou ampliando ela.

Outra coisa errada que constatei é que ao invéz de usar DefaultDrawColumnCell() está se usando DefaultDrawDataCell()

procedure TFRAtendimento.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if IBTable5.FieldByName ('STATUS').Value='FINALIZADA' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clRed;
end else if IBTable5.FieldByName ('STATUS').Value='AGUARDANDO RETORNO' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clBlue;
end else if IBTable5.FieldByName ('STATUS').Value='EM ANDAMENTO' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clGreen;
end else if IBTable5.FieldByName ('STATUS').Value='RETORNAR' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clpurple;
end;

DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


O código acima é mais apropriado para colorir colunas ou uma célula em especifico, o mais adequado seria colorir a linha de acordo com o status que deseja do registro, então o melhor seria colocar seu código no evento OnDrawDataCell()

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if IBTable5.FieldByName ('STATUS').Value='FINALIZADA' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clRed;
end else if IBTable5.FieldByName ('STATUS').Value='AGUARDANDO RETORNO' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clBlue;
end else if IBTable5.FieldByName ('STATUS').Value='EM ANDAMENTO' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clGreen;
end else if IBTable5.FieldByName ('STATUS').Value='RETORNAR' then begin
  DBGrid1.Canvas.Brush.Color:=clMenu;
  DbGrid1.Canvas.Font.Color := clpurple;
end;

DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;


Abraços
Responder

Gostei + 0

03/06/2013

Alan Souza

engraçado, o meu funcionou sem o FillRect...
e eu só citei o DBDEMOS por que usei as tabelas do BDE para não ter que criar um banco, era para adaptar para as suas necessidades.
Responder

Gostei + 0

03/06/2013

Felipe Arruda

Boa Tarde a todos, Guilherme so copiei o codigo e coloquei no evento mencionado, porem agora ele nem colori a kinha.
Obrigado.
Responder

Gostei + 0

03/06/2013

Guilherme Wiethaus

Boa tarde, depura cada linha e veja se esta entrando dentro dos blocos if...eu posso ter errado nisto. veja se ele executa dentro de cada bloco if. Não copie simplesmente apenas adapte, somente cuide das questões colocadas.
Responder

Gostei + 0

03/06/2013

Felipe Arruda

Boa Tarde amigo, mas uma vez obrigado pela ajuda, porem como sou novo em delphi, não estou conseguindo fazer o problema se resolver, gostaria de saber se posso te enviar a aplicação para vc da uma olhada, pois ja tentei varios procedimentos achados em forum e outros, porem nenhum esta dando certo, e com certeza e algo que eu estou fazendo errado.
Desde ja fico agradecio. Obrigado.
Responder

Gostei + 0

03/06/2013

Guilherme Wiethaus

Amigo, hoje não terei como ver para você isto. Tenho uma participação numa apresentação de TCC. Poderei ver isto quando me enviares e te retornarei. Antes de me enviar somente preciso apenas da parte que é seu grid de seu executável funcionando e todas as instruções caso enviar um exemplo de banco de dados junto apenas para teste. Se existe alguma característica que precisa ser configurado. Se for Delphi 7, não tem problema eu converto para teste aqui em XE2.

Só não consigo ver porque tens tanto problema assim. Eu mesmo já fiz isto em outra época e funcionou bem. Posso inclusive fazer um exemplo e te enviar. Mas tenha paciência, pois nos minha agenda há algumas tarefas a serem feitas antes.

:-)

Abraços.
Responder

Gostei + 0

03/06/2013

Demian Soares

Felipe se vc quiser me mandar para eu depurar aqui posso tentar demian_diablo@hotmail.com
Responder

Gostei + 0

03/06/2013

Felipe Arruda

Ja foi demian, assim que tiver a resposta posto aqui.
Obrigado, novamente
Responder

Gostei + 0

03/06/2013

Alan Souza

se te ajudar o meu teste está em: [url]http://www.4shared.com/zip/3nLkqQ4T/cor_grid.html[/url]
Responder

Gostei + 0

03/06/2013

Felipe Arruda

alanps e exatamente isso, mas aplico aqui no meu aplicativo e so funciona errado.
Responder

Gostei + 0

04/06/2013

Claudia Nogueira

Muito estranho, pois era pra estar funcionando com o código do pessoal.
Por curiosidade eu testei aqui, e fiz igual você fala e não ocorreu o problema.
O que pode ser, é algum código estar em algum evento do seu DBGrid, como onEnter, onKeyUp, onKeyDown, ou ainda em algum evento do DataSet, como o onAfterScroll que atrapalhe a situação, e por nisso em nossos projetos o erro não ocorre.
Se for a situação acima que está causando o problema, nós não vamos conseguir identificar o problema sem ter acesso a esse seu Form
Eu fiz aqui assim:
  if DBGrid1.DataSource.DataSet.FieldByName('STATUS').Value = 'FINALIZADA' then
  begin
    DBGrid1.Canvas.Brush.Color := clMenu;
    DbGrid1.Canvas.Font.Color := clRed;
  end
  else
  if DBGrid1.DataSource.DataSet.FieldByName('STATUS').Value = 'AGUARDANDO RETORNO' then
  begin
    DBGrid1.Canvas.Brush.Color := clMenu;
    DbGrid1.Canvas.Font.Color := clBlue;
  end
  else
  if DBGrid1.DataSource.DataSet.FieldByName('STATUS').Value = 'EM ANDAMENTO' then
  begin
    DBGrid1.Canvas.Brush.Color := clMenu;
    DbGrid1.Canvas.Font.Color := clGreen;
  end
  else
  if DBGrid1.DataSource.DataSet.FieldByName('STATUS').Value = 'RETORNAR' then
  begin
    DBGrid1.Canvas.Brush.Color := clMenu;
    DbGrid1.Canvas.Font.Color := clpurple;
  end;
  DBGrid1.DefaultDrawDataCell(Rect, Column.field, State);
Responder

Gostei + 0

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

Aceitar