Mudar cor da Fonte da linha selecionada do grid....
Bom dia..
Estava tentado fazer para que quando eu clicava duas vezes na linha do grid a cor da fonte mudaria!
Tentei fazer mais ou menos parecido de quando eu mudo a cor no evento drawcell(alguma coisa assim) mas não deu muito certo, alguém poderia me ajudar???
Estava tentado fazer para que quando eu clicava duas vezes na linha do grid a cor da fonte mudaria!
Tentei fazer mais ou menos parecido de quando eu mudo a cor no evento drawcell(alguma coisa assim) mas não deu muito certo, alguém poderia me ajudar???

Robinhocne
Curtidas 0
Respostas

Du_nirvana
05/08/2008
Olá, pensei em algo simples, talvez ajude:
Crie uma variavel global:
No DrawColumnCell:
Por fim no DblClick:
É simples, você continua com seu código de pintar as linhas normal, a diferença é que você o avisa para pintar a linha atual de uma cor diferente caso a variavel clik2 mude de valor.
Crie uma variavel global:
var Form1: TForm1; clic2: boolean;
No DrawColumnCell:
if odd(ClientDataSet1.RecNo) then DBGrid1.Canvas.Brush.Color:= clmenubar else DBGrid1.Canvas.Brush.Color:= clCream; TDbGrid(Sender).Canvas.font.Color:= clBlack; if gdSelected in State then with (Sender as TDBGrid).Canvas do begin Brush.Color := clmoneygreen; FillRect(Rect); Font.Style := [fsbold]; if clic2 = TRUE then begin Font.Color := clRed; clic2 := FALSE; end; end; TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);
Por fim no DblClick:
clic2 := TRUE; DBGrid1.Repaint;
É simples, você continua com seu código de pintar as linhas normal, a diferença é que você o avisa para pintar a linha atual de uma cor diferente caso a variavel clik2 mude de valor.
GOSTEI 0

Robinhocne
05/08/2008
bom fiz exatamente o que vc fez:
ai ele para o cursor no (Sender as DbgCarChe).
e da um erro:
ai adaptei mais ou menos assim!
Ai aparece em vermelho a linha selececionada mas só a primeira coluna e quando clico eu clico fora ele volta ao normal,
pois é assim que eu quero, eu seleciono varios cheques da minha carteira de cheque e quando eu clico na linha do cheque
para repassar ou depositar eu quero que essa linha fica com outra cor para que o cliente sabe qual cheques está sendo
repassado.
essa é uma imagem do que eu falei;
[url]http://www.4shared.com/file/57974691/64b85f7d/imagem.html[/url]
if odd(DtsCarChe.DataSet.RecNo) then DbgCarChe.Canvas.Brush.Color:= clmenubar else DbgCarChe.Canvas.Brush.Color:= clCream; TDbGrid(Sender).Canvas.font.Color:= clBlack; if gdSelected in State then with (Sender as DbgCarChe).canvas do begin Brush.Color := clmoneygreen; FillRect(Rect); Font.Style := [fsbold]; if clic2 = TRUE then begin Font.Color := clRed; clic2 := FALSE; end; end; TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);
ai ele para o cursor no (Sender as DbgCarChe).
e da um erro:
Incompatible types: ´HDC´ and ´TRect´
ai adaptei mais ou menos assim!
if odd(DtsCarChe.DataSet.RecNo) then DbgCarChe.Canvas.Brush.Color:= clmenubar else DbgCarChe.Canvas.Brush.Color:= clCream; TDbGrid(Sender).Canvas.font.Color:= clBlack; if gdSelected in State then begin DbgCarChe.Canvas.Brush.Color := clSkyBlue; DbgCarChe.Canvas.Font.Style := DbgCarChe.Canvas.Font.Style + [fsBold]; if clic2 = TRUE then begin DbgCarChe.Canvas.Brush.Color := clRed; clic2 := FALSE; end; end; TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);
Ai aparece em vermelho a linha selececionada mas só a primeira coluna e quando clico eu clico fora ele volta ao normal,
pois é assim que eu quero, eu seleciono varios cheques da minha carteira de cheque e quando eu clico na linha do cheque
para repassar ou depositar eu quero que essa linha fica com outra cor para que o cliente sabe qual cheques está sendo
repassado.
essa é uma imagem do que eu falei;
[url]http://www.4shared.com/file/57974691/64b85f7d/imagem.html[/url]
GOSTEI 0

Webjoel
05/08/2008
Olá!
Este tópico já foi abordado antes e já tem solução:
[url]
http://forum.clubedelphi.net/viewtopic.php?t=94795&start=0&postdays=0&postorder=asc&highlight=dbgrid&sid=98730bfa591fa4de025ea0dad9513b60[/url]
Este tópico já foi abordado antes e já tem solução:
[url]
http://forum.clubedelphi.net/viewtopic.php?t=94795&start=0&postdays=0&postorder=asc&highlight=dbgrid&sid=98730bfa591fa4de025ea0dad9513b60[/url]
GOSTEI 0

Robinhocne
05/08/2008
peguei tudo certo, mais não aconteceu nada, ele não muda nada!
GOSTEI 0

Robinhocne
05/08/2008
fiz dessa maneira no evento ondrawcolumncell
no datachange do meu datasource coloquei assim :
e no ondlclick do grid:
ele mostra a linha inteira em vermelho, mas ai quando eu clico na outra linha ele volta ao normal!
Será que tem alguém capacitado para me ajudar a resolver isso ?
... if odd(DtsCarChe.DataSet.RecNo) then DbgCarChe.Canvas.Brush.Color:= clmenubar else DbgCarChe.Canvas.Brush.Color:= clCream; TDbGrid(Sender).Canvas.font.Color:= clBlack; if gdSelected in State then begin DbgCarChe.Canvas.Brush.Color := clSkyBlue; DbgCarChe.Canvas.Font.Style := DbgCarChe.Canvas.Font.Style + [fsBold]; if clic2 = TRUE then DbgCarChe.Canvas.Brush.Color := clRed; end else DbgCarChe.Canvas.Font.Style := DbgCarChe.Canvas.Font.Style - [fsBold]; TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State); end;
no datachange do meu datasource coloquei assim :
clic2 := false;
e no ondlclick do grid:
clic2 := true;
ele mostra a linha inteira em vermelho, mas ai quando eu clico na outra linha ele volta ao normal!
Será que tem alguém capacitado para me ajudar a resolver isso ?
GOSTEI 0

Du_nirvana
05/08/2008
A linha volta ao normal porque o dbgrid foi atualizado e a condição que indica a troca de cor já está falsa, você precisa criar um metodo para identificar a linha clicada, e onde ocorre o teste do click você testa com essa nova indicação. Tente substituir a variavel booleana click por uma outra que indice o registro no ClientDataSet.
Obs.: Quanto ao erro que você mencionou é meio estranho, você está usando outro componente que não seja o dbGrid?
Em relação ao seu desabafo na ultima linha foi meio grosseiro da sua parte no meu ponto de vista, já que estamos apenas tentando ajuda-lo. O objetivo do forum é auxilialo nas dificuldades demonstrando novas possibilidades e não resolver o problema para você.
Obs.: Quanto ao erro que você mencionou é meio estranho, você está usando outro componente que não seja o dbGrid?
Em relação ao seu desabafo na ultima linha foi meio grosseiro da sua parte no meu ponto de vista, já que estamos apenas tentando ajuda-lo. O objetivo do forum é auxilialo nas dificuldades demonstrando novas possibilidades e não resolver o problema para você.
GOSTEI 0

Du_nirvana
05/08/2008
Pensei em algo novamente com base na ideia anterior;
1- Crie um vetor onde você seta o tamanho em tempo de execução, no caso esse tamanho será o total de registros no cds.
2- Dentro do onDrawColumnCell faça uma verificação onde você mantém as linhas pintadas de vermelho caso o registro atual esteja contido no vetor é só pintar.
3- Abaixo segue o exemplo, faça as alterações que você mencionou antes caso seja necessário. Se for o caso você só precisa de mais duas coisas, redimencionar o vetor no caso de novos registros e um tratamento para voltar a cor ao normal.
Segue o código:
Nova declaração das variaveis
Dimencione o vetor, no meu exemplo coloquei no forCreate, porque nesse ponto meu cds já foi aberto, coloque-o onde achar melgor, desde que o cds já tenha recuperado os registros
Novo onDrawColumnCell
Fiz o código meio na pressa, qualquer coisa posta ai novamente que tentamos ajudar.
1- Crie um vetor onde você seta o tamanho em tempo de execução, no caso esse tamanho será o total de registros no cds.
2- Dentro do onDrawColumnCell faça uma verificação onde você mantém as linhas pintadas de vermelho caso o registro atual esteja contido no vetor é só pintar.
3- Abaixo segue o exemplo, faça as alterações que você mencionou antes caso seja necessário. Se for o caso você só precisa de mais duas coisas, redimencionar o vetor no caso de novos registros e um tratamento para voltar a cor ao normal.
Segue o código:
Nova declaração das variaveis
procedure TForm1.FormCreate(Sender: TObject); begin SetLength(clic2, ClientDataSet1.RecordCount); end; var Form1: TForm1; clic2: array of integer;
Dimencione o vetor, no meu exemplo coloquei no forCreate, porque nesse ponto meu cds já foi aberto, coloque-o onde achar melgor, desde que o cds já tenha recuperado os registros
procedure TForm1.FormCreate(Sender: TObject); begin SetLength(clic2, ClientDataSet1.RecordCount); end;
Novo onDrawColumnCell
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var i: integer; begin if odd(ClientDataSet1.RecNo) then DBGrid1.Canvas.Brush.Color:= clmenubar else DBGrid1.Canvas.Brush.Color:= clCream; TDbGrid(Sender).Canvas.font.Color:= clBlack; if gdSelected in State then with (Sender as TDBGrid).Canvas do begin Brush.Color := clmoneygreen; FillRect(Rect); Font.Style := [fsbold]; end; for i:= 1 to ClientDataSet1.RecordCount do begin if clic2[i] = ClientDataSet1.RecNo then begin (Sender as TDBGrid).Canvas.Font.Color := clRed; end; end; TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State); end;
Fiz o código meio na pressa, qualquer coisa posta ai novamente que tentamos ajudar.
GOSTEI 0

Robinhocne
05/08/2008
Consegui resolver com ajuda de uns amigos
ficou assim>
no type do form
no private:
ficou assim>
no type do form
type THakGrid = class(TCustomGrid);
no private:
private FSelecionados : array of integer; function GetIndex(Value : Integer) : Integer; procedure SelecionaCheque;
function TFrmCarteiraDeCheque.GetIndex(Value: Integer): Integer; var I : Integer; begin for I := 0 to High(FSelecionados) do begin if FSelecionados[I] = Value then //poderia fazer uma busca indexada pra agilizar //mas vai ficar pra proxima. begin Result := I; Exit; end; end; Result := -1; end;
procedure TFrmCarteiraDeCheque.DbgCarCheDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if GetIndex(QryCarChe.RecNo) > -1 then DbgCarChe.Canvas.Brush.Color := clRed; DbgCarChe.DefaultDrawDataCell(Rect, Column.Field, State); END;
procedure TFrmCarteiraDeCheque.SelecionaCheque; var I, I2 : Integer; begin I := GetIndex(QryCarChe.RecNo); if I < 0 then begin I := High(FSelecionados) + 1; SetLength(FSelecionados, I + 1); FSelecionados[I] := QryCarChe.RecNo; end else begin I2 := High(FSelecionados); if I2 > I then Move(FSelecionados[I+1], FSelecionados[I], I2-I); SetLength(FSelecionados, I2); end; THakGrid(DbgCarChe).InvalidateRow(THakGrid(DbgCarChe).Row); end;
GOSTEI 0