Botão dentro do DBGrid

Delphi

01/08/2007

Pessoal, fiz um esquema para colocar botões dentro de uma coluna do dbgrid.

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  BUTTON: Integer;
  R: TRect;
begin
  if Column.FieldName = ´CITY´ then
  begin
    DBGrid1.Canvas.FillRect(Rect);
    BUTTON := 0;
    R:=Rect;
    InflateRect(R,-2,-2); //Diminue o tamanho do Botão
    DrawFrameControl(DBGrid1.Canvas.Handle,R,BUTTON, BUTTON or BUTTON);
  end;
end;

Ateh aqui blz, mostra Botões dentro da dbGrid, na coluna que eu quero (no caso CITY).

Depois fiz com que chame outro form ao clicar no button do dbgrid
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
 if DBGrid1.SelectedField.FieldName = ´CITY´ then
  begin
   form2.show;
   form2.Edit1.text:=vdadosdbgrid;//Variavel global mandando os dados para o form2
  end;
end;

Tambem esta certo chama o segundo form (Tem que ser neste evento, pois nao eh o CPS_Ellipsis do dbgrid)

Bom o problema eh saber se tem como colocar o nome no caption do button que fica dentro do dbgrid.

Se tiver como gostaria de colocar somente o nome [b:76360426f7]Alterar[/b:76360426f7] em todos os botoes.

Obs: Pode ser de outra forma tambem, mais gostaria que o resultado seja botoes dentro do dbgrid.

No aguardo
Grato a ajuda de todos
Adriano


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Adriano_servitec

Adriano_servitec

01/08/2007

Fica desta forma no dbgrid
http://adrianoservitec.fotos.uol.com.br/delphi/photo.html?currentPage=1


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

tente assim:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  BUTTON: Integer;
  R: TRect;
  bcolor: TColor;
begin
  if Column.FieldName = ´CITY´ then
  begin
    DBGrid1.Canvas.FillRect(Rect);
    BUTTON := 0;
    R:=Rect;
    InflateRect(R,-1,-1); //Diminue o tamanho do Botão
    DrawFrameControl(DBGrid1.Canvas.Handle,R,BUTTON, BUTTON or BUTTON);
    bcolor := DBGrid1.Canvas.Brush.Color; // guarda a cor de fundo original
    DBGrid1.Canvas.Brush.Color := clBtnFace; // muda a cor de fundo
    DrawText(DBGrid1.Canvas.Handle,´Alterar´,7,R,DT_VCENTER or DT_CENTER);
    DBGrid1.Canvas.Brush.Color := bcolor; // devolve a cor original
  end;
end;


procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if DBGrid1.SelectedField.FieldName = ´CITY´ then
  begin
    form2.Edit1.text:=vdadosdbgrid;//Variavel global mandando os dados para o form2
    form2.show;
    DBGrid1.SelectedIndex := DBGrid1.SelectedIndex - 1;
  end;
end;



GOSTEI 0
Adriano_servitec

Adriano_servitec

01/08/2007

Mais uma vez vc me ajudou amigo.

Funcionou sim :D

Muito obrigado

Valeu.


GOSTEI 0
Rinez

Rinez

01/08/2007

Caro Adriano:

Testei a dica do Emerson e notei que quanto o DBGRID esta focado na primeira ou ultima celula ao clicar, o botão desaparece aparecendo o conteudo do campo.
Tem como arrumar isso?
Mas, mesmo assim é show de bola. Parabens.
Abraços


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/08/2007

Caro Adriano: Testei a dica do Emerson e notei que quanto o DBGRID esta focado na primeira ou ultima celula ao clicar, o botão desaparece aparecendo o conteudo do campo. Tem como arrumar isso? Mas, mesmo assim é show de bola. Parabens. Abraços
Bom Rinez, aqui eu tive a ideia de fazer este button por motivos de que minha grid eh apenas para mostrar o resultado, e caso eu tenha que alterar algo, clico no button para abiri outro form, portanto nao preciso editar nada nesta grid, alem do que o select que envolve ela nao aceita um updeta assim tao facil :D

Por isso para que nao apareça no dbgrid em forma de texto, eu fui na propriedade Options --dsEditing = False, assim evita de editar no campo.


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/08/2007

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if DBGrid1.SelectedField.FieldName = ´CITY´ then
  begin
    form2.Edit1.text:=vdadosdbgrid;//Variavel global mandando os dados para o form2
    form2.show;
    DBGrid1.SelectedIndex := DBGrid1.SelectedIndex - 1;
  end;
end;

Emerson, estou com problemas no foco do dbgrid.


[b:a05356061d]DBGrid1.SelectedIndex := DBGrid1.SelectedIndex - 1;
[/b:a05356061d]

Se eu passar para as linhas de baixo funciona certo, mais se eu retornar para cima preciso dar dois cliques no button que foi criar dentro do dbgrid para poder mostrar os dados no form2.

Sabe o pq disso?


GOSTEI 0
Adriano_servitec

Adriano_servitec

01/08/2007

Vou deixar postado aqui, como chamo o outro form, pode ser que fique mais facil do pessoal entender


Todos sao chamados atravez de variavies globais
begin

if DBGradeFunc.SelectedField.FieldName = ´MARCAR´ then
  begin
    fAlteraFolha.Label2.Caption:=vLabel2;//Variavel global mandando os dados para o form
    fAlteraFolha.L1.Caption:=vL1;//Variavel global mandando os dados para o form
    fAlteraFolha.L3.Caption:=vL3;//Variavel global mandando os dados para o form
    //--formata a variavel com ponto e virgula
    if vl5 <> ´´ then
    begin
       vl5:=FormatFloat(´#,0.00´,(dm.zspSomaFunc.FieldbyName(´valor_inss´).value));
       fAlteraFolha.L5.Caption:=vL5;//Variavel global mandando os dados para o form
    end else
    begin
       fAlteraFolha.L5.Caption:=´´;//Nao passa nada se a variavel estiver vazia
    end;
    //--formata a variavel com ponto e virgula
    if vl2 <> ´´ then
    begin
       vl2:=FormatFloat(´#,0.00´,(dm.zspSomaFunc.FieldbyName(´salario´).value));
       fAlteraFolha.L2.Caption:=vL2;//Variavel global mandando os dados para o form
    end else
    begin
       fAlteraFolha.L2.Caption:=´´;//Nao passa nada se a variavel estiver vazia
    end;
    //--formata a variavel com ponto e virgula
    if vl4 <> ´´ then
    begin
       vl4:=FormatFloat(´,0.00´,(dm.zspSomaFunc.FieldbyName(´aliquota_inss´).value));
       fAlteraFolha.L4.Caption:=vL4;//Variavel global mandando os dados para o form
    end else
    begin
       fAlteraFolha.L4.Caption:=´´;//Nao passa nada se a variavel estiver vazia
    end;
    fAlteraFolha.ShowModal;
    //dbGradeFunc.SetFocus;
    //DBGradeFunc.SelectedIndex := 0;
    DBGradeFunc.SelectedIndex:= -1;
    //dm.zspSomaFunc.GotoBookmark(Pointer(dbGradeFunc.SelectedRows.Items[i - 1]));
  end;
end;



GOSTEI 0
Adriano_servitec

Adriano_servitec

01/08/2007

Ja resolvi o problema


Obrigado


GOSTEI 0
POSTAR