Imagem checkbox na StringGrid

22/09/2017

0

Como faço para alterar a imagem "checked" para "unchecked" ao clicar sobre ela dentro de um stringGrid?

É 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

Wilton Santos

Responder

Posts

22/09/2017

Natanael Ferreira

Veja se a dica do link abaixo ajuda:

[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]
Responder

22/09/2017

Wilton Santos

Nao, nao! Isso eu já vi e foi isso que eu usei para criar as imagens no Stringgrid ao entrar no form. Mas se você leu direitinho minha pergunta, vai perceber que quero clicar sobre a imagem que aparece depois de usar este código aí e fazer ela mudar. Este código está no evento onDrawCell que tem comportamento totalmente diferente de um click sobre a imagem. Eu quero usar o evento onClick.

Se eu tiver errado me corrija com provas.
Responder

22/09/2017

Natanael Ferreira

Tenho um programa aqui que eu criei uma tela parecida com a sua funcionando.

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.
Responder

22/09/2017

Wilton Santos

Parece que é um tipo de solução. Mas seria possível verificar que imagem está atribuída à coluna, em lugar de verificar o ponto?
Responder

22/09/2017

Natanael Ferreira

Se existe eu desconheço. Fiquei curioso, se você descobrir ou outro usuário souber favor postar.

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
Responder

25/09/2017

Wilton Santos

Meu amigo Natanael, com suas valiosas dicas eu consegui fazer o que precisava. Te agradeço muito, e depois vou postar a solução. Mas a coisa caminha daquela forma que você disse mesmo. Valeu!
Responder

30/09/2017

Wilton Santos

Minha solução foi essa:


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;

Responder

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;

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar