Imagem checkbox na StringGrid
22/09/2017
0
É o seguinte, possuo uma stringGrid e nela criei métodos para verificar meus dados e preencher os dados com uma imagem de checked fornecido por um imagelist. Image 1 "checked", image 2 "unchecked". O que eu quero é que ao clicar sobre a célula que possua está imagem, faça a verificação, se a imagem é 1, mude para a 2, se for 2, mude para a 1. Só isso, no meio disso quero executar uma função de verificação, é óbvio.
Neste ínterin, quero realizar uma função ao clicar.
Exemplo:
if strGrd.cells[click do mouse] = imgLst.imagem1 then //imagem checked
Begin
mudeaImagemParaImagem2;//método imagem unchecked
dao.delete; //deletar item da tabela do banco
End;
if strGrd.cells[click do mouse] = imgLst.imagem2 then //imagem unchecked
Begin
mudeaImagemParaImagem1;//método imagem checked
dao.insert; //deletar item da tabela do banco
End;
É tudo que eu preciso. Podem me ajudar?
Wilton Santos
Posts
22/09/2017
Natanael Ferreira
[url:descricao=http://www.planetadelphi.com.br/dica/6477/colocar-check-box-em-stringgrid-ou-dbgrid(especial-simples)]http://www.planetadelphi.com.br/dica/6477/colocar-check-box-em-stringgrid-ou-dbgrid(especial-simples)[/url]
22/09/2017
Wilton Santos
Se eu tiver errado me corrija com provas.
22/09/2017
Natanael Ferreira
Vamos ver se consigo te ajudar:
Lógica: Se na primeira célula tiver um .(ponto), você atribui a imagem de "checado" senão imagem de não "checado".
Códigos:
Evento OnClick do Stringgrid (escrevendo o ponto ou não na primeira célula da linha clicada):
var coluna, Linha: Integer; begin MouseCell(TStringGrid(Sender), coluna, Linha); if coluna = 0 then if (TStringGrid(Sender).Cells[0, Linha] = '') then TStringGrid(Sender).Cells[0, Linha] := '.' else TStringGrid(Sender).Cells[0, Linha] := ''; end;
Evento OnDrawCell (Desenha a imagem: se tiver o ponto atribui a imagem de check):
if (ACol = 0) and (ARow > 0) then if TStringGrid(Sender).Cells[ACol, ARow] = '.' then // mostra Checado ImageList1.Draw(TStringGrid(Sender).Canvas, Rect.Left + 4, Rect.Top + 4, 0) else if strGrid.Cells[ACol, ARow] = '' then // mostra Não Checado ImageList1.Draw(TStringGrid(Sender).Canvas, Rect.Left + 4, Rect.Top + 4, 1);
Qualquer dúvida, a disposição.
22/09/2017
Wilton Santos
22/09/2017
Natanael Ferreira
Existem algumas outras maneiras de se colocar o checkbox no Stringgrid.
1- Desenhando o checkbox no Stringgrid (lógica parecida com a que postei anteriormente):
http://www.planetadelphi.com.br/dica/7412/-checkbox-no-stringgrid-
2-Criando checkboxes em runtime e posicionando no Stringgrid (não testei):
http://cc.embarcadero.com/Item.aspx?id=15441
25/09/2017
Wilton Santos
30/09/2017
Wilton Santos
procedure TFrmAccesoPerfil.strGd1DblClick(Sender: TObject);
var
Coluna, Linha: integer;
begin
MouseCell(strGd1, coluna, Linha);
if coluna = 3 then
//se o id do form for igual a [ace_idform] e [ace_idPerfil] for igual a Fperfil
if not TelaAutorizadaParaPerfil(StrToInt(strGd1.Cells[0, Linha]), StrToInt(FPerfil)) then
inserirAccessoAoPerfil(StrToInt(strGd1.Cells[0, Linha]), StrToInt(FPerfil))
else
deletarAccesoDoPerfil(FAce_id);
end;
procedure TFrmAccesoPerfil.strGd1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
s, a, b, c: string;
begin
s:= consultaAcessoPorPerfil;
c:= s;
if (ACol = 0) and (ARow > 0) then //se for a 1ª coluna(id) e a linha for maior que a primeira(se nao for o titulo da Grid)
begin
while Length(S)>0 do //enquanto o tamanho da string for maior que 0 (ou seja, se for '')
begin
a:= strGd1.Cells[ACol, ARow]; //variavel que recebe o valor da celula na coluna 0 e linha maior que 0
b:= subString(',',S); //variavel que guarda todos os itens(id) da consulta separado por virgula em uma string
begin
if SameText(a,b) then //se os valores forem iguais
begin
//desenha o CheckBox já "Checado"
ImageList1.Draw(strGd1.Canvas, Rect.Right-20, Rect.Top +4 , 7);
Break
end
else
//desenha o CheckBox nao "Checado"
ImageList1.Draw(strGd1.Canvas, Rect.Right-20, Rect.Top +4 , 9);
end;
end;
if (Length(S)= 0) then
begin
//repreencher os valores iniciais
s:= c;
b:= c;
end;
end;
end;
30/09/2017
Wilton Santos
procedure TFrmAccesoPerfil.strGd1DblClick(Sender: TObject); var Coluna, Linha: integer; begin MouseCell(strGd1, coluna, Linha); if coluna = 3 then //se o id do form for igual a [ace_idform] e [ace_idPerfil] for igual a Fperfil if not TelaAutorizadaParaPerfil(StrToInt(strGd1.Cells[0, Linha]), StrToInt(FPerfil)) then inserirAccessoAoPerfil(StrToInt(strGd1.Cells[0, Linha]), StrToInt(FPerfil)) else deletarAccesoDoPerfil(FAce_id); end; procedure TFrmAccesoPerfil.strGd1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var s, a, b, c: string; begin s:= consultaAcessoPorPerfil; c:= s; if (ACol = 0) and (ARow > 0) then //se for a 1ª coluna(id) e a linha for maior que a primeira(se nao for o titulo da Grid) begin while Length(S)>0 do //enquanto o tamanho da string for maior que 0 (ou seja, se for '') begin a:= strGd1.Cells[ACol, ARow]; //variavel que recebe o valor da celula na coluna 0 e linha maior que 0 b:= subString(',',S); //variavel que guarda todos os itens(id) da consulta separado por virgula em uma string begin if SameText(a,b) then //se os valores forem iguais begin //desenha o CheckBox já "Checado" ImageList1.Draw(strGd1.Canvas, Rect.Right-20, Rect.Top +4 , 7); Break end else //desenha o CheckBox nao "Checado" ImageList1.Draw(strGd1.Canvas, Rect.Right-20, Rect.Top +4 , 9); end; end; if (Length(S)= 0) then begin //repreencher os valores iniciais s:= c; b:= c; end; end; end;
Clique aqui para fazer login e interagir na Comunidade :)