Ajuda nos comandos if e elser
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;
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
Curtidas 0
Respostas
Demian Soares
02/06/2013
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;
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;
GOSTEI 0
Felipe Arruda
02/06/2013
Boa Noite amigo, desde ja agradeço a ajuda, porem o codigo que você passou agora nem colore as linhas.
Obrigado.
Att, Felipe.
Obrigado.
Att, Felipe.
GOSTEI 0
Alan Souza
02/06/2013
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:
caso interesse, segue meu teste (baseado no DBDEMOS):
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;
GOSTEI 0
Felipe Arruda
02/06/2013
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;
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;
GOSTEI 0
Guilherme Wiethaus
02/06/2013
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()
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()
Abraços
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
GOSTEI 0
Alan Souza
02/06/2013
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.
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.
GOSTEI 0
Felipe Arruda
02/06/2013
Boa Tarde a todos, Guilherme so copiei o codigo e coloquei no evento mencionado, porem agora ele nem colori a kinha.
Obrigado.
Obrigado.
GOSTEI 0
Guilherme Wiethaus
02/06/2013
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.
GOSTEI 0
Felipe Arruda
02/06/2013
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.
Desde ja fico agradecio. Obrigado.
GOSTEI 0
Guilherme Wiethaus
02/06/2013
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.
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.
GOSTEI 0
Demian Soares
02/06/2013
Felipe se vc quiser me mandar para eu depurar aqui posso tentar demian_diablo@hotmail.com
GOSTEI 0
Felipe Arruda
02/06/2013
Ja foi demian, assim que tiver a resposta posto aqui.
Obrigado, novamente
Obrigado, novamente
GOSTEI 0
Alan Souza
02/06/2013
se te ajudar o meu teste está em: [url]http://www.4shared.com/zip/3nLkqQ4T/cor_grid.html[/url]
GOSTEI 0
Felipe Arruda
02/06/2013
alanps e exatamente isso, mas aplico aqui no meu aplicativo e so funciona errado.
GOSTEI 0
Claudia Nogueira
02/06/2013
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:
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);
GOSTEI 0
Felipe Arruda
02/06/2013
Bom dia Pessoal, como eu tinha um DBlookupcombox puxando os dados "STATUS" em uma outra tabela, estava dando o tal erro que eu estava falando, um amigo aqui me ajudou e segue abaixo a resolução, colocando no evento OnDrawColumnCell da DBGrid:
Experimente colocar o código abaixo no evento OnDrawColumnCell da DBGrid:
if IBTable1.FieldByName('STATUS').Value='4' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clRed;
end
else
if IBTable1.FieldByName('STATUS').Value='3' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clBlue;
end
else
if IBTable1.FieldByName('STATUS').Value='2' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clGreen;
end
else
if IBTable1.FieldByName('STATUS').Value='1' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clpurple;
end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
Obrigado a todos que me ajudaram.
Problema resolvido.
Experimente colocar o código abaixo no evento OnDrawColumnCell da DBGrid:
if IBTable1.FieldByName('STATUS').Value='4' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clRed;
end
else
if IBTable1.FieldByName('STATUS').Value='3' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clBlue;
end
else
if IBTable1.FieldByName('STATUS').Value='2' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clGreen;
end
else
if IBTable1.FieldByName('STATUS').Value='1' then
begin
DBGrid1.Canvas.Brush.Color:=clMenu;
DbGrid1.Canvas.Font.Color := clpurple;
end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
Obrigado a todos que me ajudaram.
Problema resolvido.
GOSTEI 0