Fórum Mudar cor da Fonte da linha selecionada do grid.... #362084
05/08/2008
0
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
Curtir tópico
+ 0Posts
05/08/2008
Du_nirvana
Crie uma variavel global:
1 2 3 | var Form1: TForm1; clic2: boolean; |
No DrawColumnCell:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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:
1 2 | 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
06/08/2008
Robinhocne
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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:
ai adaptei mais ou menos assim!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
06/08/2008
Webjoel
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
06/08/2008
Robinhocne
Gostei + 0
07/08/2008
Robinhocne
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ... 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 :
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 ?
Gostei + 0
07/08/2008
Du_nirvana
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
07/08/2008
Du_nirvana
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
1 2 3 4 5 6 7 8 | 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
1 2 3 4 | procedure TForm1.FormCreate(Sender: TObject); begin SetLength(clic2, ClientDataSet1.RecordCount); end; |
Novo onDrawColumnCell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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
08/08/2008
Robinhocne
ficou assim>
no type do form
1 2 | type THakGrid = class(TCustomGrid); |
no private:
1 2 3 4 | private FSelecionados : array of integer; function GetIndex(Value : Integer) : Integer; procedure SelecionaCheque; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; |
1 2 3 4 5 6 7 8 9 10 | 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; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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
Clique aqui para fazer login e interagir na Comunidade :)