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

Trampinho Fácil, Fácil!


McBlade

Pergunta

Tipo só q tem q ser assim:

O checkbox tem q aparecer em todas as linhas!!

E depois eu tenho q saber se o checkbox da linha 1 por exemplo ta marcado ou não!!

Tipo:

==================================
= Coluna 1 | Coluna 2 | Coluna 3 =
==================================
= Check  s |          |          =
= Check  s |          |          =
= Check  n |          |          =
= Check  n |          |          =
= Check  s |          |          =
==================================

Onde você tem Check s seria um CheckBox marcado no Grid e Check n um não marcado.

Mas depois eu vou precisar saber se ele tá marcado ou não!!!

Alguém aí já fez algo parecido?

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Olá McBlade,

Coloque um StringGrid e um CheckBox. Coloque o CheckBox com Visible:=False;

No Evento OnDrawCell do StringGrid, coloque esse código:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

const IsChecked : array[Boolean] of Integer = 
      (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  DrawState: Integer;
  DrawRect: TRect;

begin
  if (gdFocused in State) then
    begin
     CheckBox1.Left := Rect.Left + StringGrid1.Left + 2;
     CheckBox1.Top := Rect.Top + StringGrid1.top + 2;
     CheckBox1.Width := Rect.Right - Rect.Left;
     CheckBox1.Height := Rect.Bottom - Rect.Top;
     CheckBox1.Visible := True;
    end;
end;

Obs.: Eu não testei.

qualquer coisa posta ae.

Abs.

Kiko

Link para o comentário
Compartilhar em outros sites

  • 0

então o checkbox aparece no grid!! Mas ele é o mesmo pra todas as linhas!!

E ele tem que ficar aparecendo nas linhas!!! também preciso de uma forma de, por exemplo, saber se ele está marcado ou não. Adicionando um valor na célula em que ele está desenhado!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá,

Vamos lá...

- Adicione um StringGrid e um CheckBox;

- Coloque ChekBox Visible:=False;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 ShowMessage('O q fazer??');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[0,0] := 'FIXO';
  StringGrid1.Cells[1,0] := 'Id';
  StringGrid1.Cells[2,0] := 'Nome';
  StringGrid1.Cells[3,0] := 'Idade';
  StringGrid1.Cells[4,0] := 'Admin';
  AdicionarCheckBoxes; //rotina que adiciona os Check
end;
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] := 'A';
       StringGrid1.Cells[2,i] := 'B';
       StringGrid1.Cells[3,i] := 'C';
       NovoCheckBox := TCheckBox.Create(Application);
       NovoCheckBox.Width := 0;
       NovoCheckBox.Visible := false;
       NovoCheckBox.Caption := 'OK';
       NovoCheckBox.Color := clWindow;
       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 celular
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;
        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;

qualquer coisa posta ae.

Abs.

Kiko

Link para o comentário
Compartilhar em outros sites

  • 0

Ow funciono!!! é isso mesmo!!!

Agora como fazer pra que se eu clicar no CheckBox da linha 1, por exemplo, a célula que ele se encontra receber o valor 1 para não checado e 2 para checado e salvar no banco de dados.

E quando trazer os dados, se a célula estiver com o numero (String) 1 o check fica desmarcado e se vier 2 o check fica marcado??

Link para o comentário
Compartilhar em outros sites

  • 0

Segue abaixo o código completo ta unit, vlw Kikonanet peguei o seu código e implementei ele com o restante q o MdBlade precisava:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ExtCtrls, Mask, DBCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    CheckBox1: TCheckBox;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    ADOTable1Fixo: TWideStringField;
    ADOTable1Id: TWideStringField;
    ADOTable1Nome: TWideStringField;
    Label1: TLabel;
    EdtFixo: TDBEdit;
    Label2: TLabel;
    EdtId: TDBEdit;
    Label3: TLabel;
    edtNome: TDBEdit;
    Button2: TButton;
    ADOTable1Admin: TWideStringField;
    Label4: TLabel;
    EdtAdmin: TDBEdit;
    ADOTable1Cb: TWideStringField;
    Label5: TLabel;
    EdtCb: TDBEdit;
    procedure FormCreate(Sender: TObject);
    procedure Limpabuffer;
    procedure AdicionarCheckBoxes;
    procedure AlinhaCheck;
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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] := 'A';
      StringGrid1.Cells[2,i] := 'B';
      StringGrid1.Cells[3,i] := 'C';
      NovoCheckBox := TCheckBox.Create(Application);
      NovoCheckBox.Width := 0;
      NovoCheckBox.Visible := false;
      NovoCheckBox.Caption := 'OK';
      NovoCheckBox.Color := clWindow;
      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 celular
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;
       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.FormCreate(Sender: TObject);
begin
 StringGrid1.Cells[0,0] := 'FIXO';
 StringGrid1.Cells[1,0] := 'Id';
 StringGrid1.Cells[2,0] := 'Nome';
 StringGrid1.Cells[3,0] := 'Admin';
 AdicionarCheckBoxes; //rotina que adiciona os Check
 ADOTable1.Active := True;
 EdtFixo.Clear;
 EdtId.Clear;
 EdtNome.Clear;
 EdtAdmin.Clear;
 EdtCb.Clear;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  If DataSource1.State in [dsInsert, dsEdit] Then
    ADOTable1.Post;
end;

procedure TForm1.Button2Click(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
    begin
      ADOTable1.Append;
      EdtFixo.Text := StringGrid1.Cells[0,i];
      EdtId.Text := StringGrid1.Cells[1,i];
      EdtNome.Text := StringGrid1.Cells[2,i];
      EdtAdmin.Text := StringGrid1.Cells[3,i];
      EdtCb.Text := 'SIM';
      ADOTable1.Post;
    end;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ADOTable1.Active := False;
end;

end.

falou

Link para o comentário
Compartilhar em outros sites

  • 0

Galera valeu pela ajuda de TODOS!!!

Pequei o código do "Vivendo&Aprendendo" e só adaptei o OnClick do CheckBox, ficou assim!!!

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;

Depois do um for no Grid e salvo no .fdb FireBird!! laugh.gif

VALEU MESMO GALERA!!! biggrin.gif

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

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