McBlade Postado Junho 15, 2005 Denunciar Share Postado Junho 15, 2005 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 More sharing options...
0 Kikonanet Postado Junho 15, 2005 Denunciar Share Postado Junho 15, 2005 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 More sharing options...
0 Guest Guest Postado Junho 15, 2005 Denunciar Share Postado Junho 15, 2005 No OnDrawCell os CheckBox'es fica "Piscando" porque fikam sendo desenhados constantemente!!! Link para o comentário Compartilhar em outros sites More sharing options...
0 McBlade Postado Junho 15, 2005 Autor Denunciar Share Postado Junho 15, 2005 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 More sharing options...
0 Kikonanet Postado Junho 16, 2005 Denunciar Share Postado Junho 16, 2005 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 More sharing options...
0 McBlade Postado Junho 16, 2005 Autor Denunciar Share Postado Junho 16, 2005 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 More sharing options...
0 Kikonanet Postado Junho 16, 2005 Denunciar Share Postado Junho 16, 2005 Olá,porque você não usa um DBGrid??Abs.Kiko Link para o comentário Compartilhar em outros sites More sharing options...
0 Vivendo&Aprendendo Postado Junho 17, 2005 Denunciar Share Postado Junho 17, 2005 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 More sharing options...
0 McBlade Postado Junho 17, 2005 Autor Denunciar Share Postado Junho 17, 2005 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!! VALEU MESMO GALERA!!! Link para o comentário Compartilhar em outros sites More sharing options...
0 Kikonanet Postado Junho 17, 2005 Denunciar Share Postado Junho 17, 2005 Tópico resolvido, tópico fechado Abs.Kiko Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
McBlade
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:
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