Ir para conteúdo
Fórum Script Brasil
  • 0

Estou Utilizando Um Tstringgrid E Quero fazer Uma Checkbox Para Cada L


mestre fyoda

Pergunta

1 resposta a esta questão

Posts Recomendados

  • 0

* Declare as Private Procedures

    procedure AdicionarCheckBoxes;
    procedure AlinhaCheck;
    procedure LimpaBuffer;
* Coloque um StringGrid na tela com 5 colunas e 1 CheckBox * No FormCreate
  AdicionarCheckBoxes; //rotina que adiciona os Check
  CheckBox1Click(nil);
*E o resto é
procedure TForm1.AdicionarCheckBoxes;
var i: Integer;
   NovoCheckBox: TCheckBox;
begin
  limpaBuffer; //é bom não esquecer de limpar   controles não utilizados
  for i := 1 to StringGrid1.RowCount do
  begin
    StringGrid1.Cells[0,i] := IntToStr(i);
    StringGrid1.Cells[1,i] := IntToStr(i);
    StringGrid1.Cells[2,i] := DateToStr(Now);
    StringGrid1.Cells[3,i] := '';
    NovoCheckBox := TCheckBox.Create(Application);
    NovoCheckBox.Width := 0;
    NovoCheckBox.Visible := false;
    NovoCheckBox.Caption := 'OK';
    NovoCheckBox.Tag := i;
    NovoCheckBox.OnClick :=  CheckBox1.OnClick; //Associar um evento OnClick já existente para o Novo CheckBox
    NovoCheckBox.Parent := Form1;
    StringGrid1.Objects[4,i] := NovoCheckBox;
    StringGrid1.RowCount := i;
  end;
  AlinhaCheck; // agora vamos alinhar o check na celula
end;

procedure TForm1.AlinhaCheck;
var
 NovoCheckBox: TCheckBox;
 Rect: TRect;
 i: Integer;
begin
  for i := 1 to StringGrid1.RowCount do
  begin
    NovoCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
    if NovoCheckBox <> nil then
      begin
        Rect := StringGrid1.CellRect(4,i); // aqui descobrimos a posição da celula para utilizarmos no check
        NovoCheckBox.Left := StringGrid1.Left + Rect.Left+2;
        NovoCheckBox.Top := StringGrid1.Top + Rect.Top+2;
        NovoCheckBox.Width := Rect.Right - Rect.Left;
        NovoCheckBox.Height := Rect.Bottom - Rect.Top;
        NovoCheckBox.Visible := True;
        NovoCheckBox.Color := clWindow;        
     end;
  end;
end;

procedure TForm1.LimpaBuffer;
var
 NovoCheckBox: TCheckBox;
 i: Integer;
begin
  for i := 1 to StringGrid1.RowCount do
  begin
    NovoCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
    if NovoCheckBox <> nil then // o objeto deve existir para poder ser destruído
    begin
       NovoCheckBox.Visible := false;
       StringGrid1.Objects[4,i] := nil;
    end;
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if not (gdFixed in State) then
    AlinhaCheck;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
var
  NovoCheckBox: TCheckBox;
  Rect: TRect;
  i: Integer;
begin
  for i := 1 to StringGrid1.RowCount do
  begin
    NovoCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
    if NovoCheckBox.Checked = True then
      StringGrid1.Cells[3,i] := 'SIM'
    else
      StringGrid1.Cells[3,i] := 'NÃO'
  end;
end;

Funciona para Delphi 6 e 7, acho que funciona pro 4... Cá pra nós, num tá na hora de migrar pra um delphi mais novo não???

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...