Bloquear Insert no Grid

23/02/2010

20

Estou atualizando dados de uma tabela diretamente no dbgrid, porem quando o usuario chega no final automaticamente é inserido um registro em branco, gostaria de bloquear isso, porem somente quando for inserido um novo registro pelo dbgrid, porque nesse mesmo formulario tenho um botao para inserir novos registros e estou usando o mesmo clientdataset.   Obrigado
Responder

Post mais votado

23/02/2010

Você pode utilizar como o nosso amigo Thiago disse, mas se você tiver que editar registros no DBGrid e não permitir a inclusão e exclusão, segue as rotinas abaixo.

{ Retorna o índice da última coluna visível }
function  RetIdxUltimaColVisivel(DBGrid: TDBGrid): integer;
var
  x: integer;
begin
  Result := -1;

  for x := DBGrid.Columns.Count-1 downto 0 do
  begin
    if  DBGrid.Columns.Items[x].Visible then
      begin
        Result := x;
        Break;
      end
    ;
  end;
end;

function  NaoInsereDBGrid(DBGrid: TDBGrid; DataSet: TDataSet; Key: Word): Word;
begin
  { Não deixa inserir registros no DBGrid caso:
    1- estiver em modo de edição: E
    1.1- se clicar na tecla "Insert"; OU
    1.2- se clicar na tecla "Seta para baixo" E estiver no último registro; OU
    1.2- se clicar na tecla "Tab" E estiver no último registro E estiver na
         última coluna visível. }
  Result := Key;

  if  dgEditing in DBGrid.Options then
    begin
      if  ( Key = VK_INSERT )
      or  ( (Key = VK_DOWN) and (DataSet.RecNo = DataSet.RecordCount) ) then
          Result := 0
      else
        if  ( Key = VK_TAB ) and ( DataSet.RecNo = DataSet.RecordCount ) then
          begin
            if  ( DBGrid.SelectedIndex = RetIdxUltimaColVisivel(DBGrid) ) then
                Result := 0
            ;
          end
        ;
     
    end
  ;
end;


No evento OnKeyDown do DBGrid coloque o seguinte:

procedure dbgrPadraoKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  { Não permite excluir }
  if  Key = VK_DELETE then
      Key := VK_NONAME
  ;

  { Não permite incluir }
  Key := NaoInsereDBGrid( TDBGrid(Sender), TDBGrid(Sender).DataSource.DataSet, Key );
end;


Espero ter colaborado.
Responder

Mais Posts

23/02/2010

Thiago Santana

Se foi o que eu entendi vc pode determinar o local onde sua grid será apenas de leitura! Dbgrid.readonly := true; Espero ter ajudado! Caso não tenha chegado  a solução, peço que poste detalhando... AbraçoO
Responder
ou, ainda:

aproveitando o evento OnKeyDown do Paulista:
procedure dbgrPadraoKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  { Não permite excluir }
  if  Key = VK_DELETE then
      Key := VK_NONAME
  ;
end;

e, para não permitir a inclusão, implemente o evento OnNewRecord do dataset:
procedure TForm12.ClientDataSet1NewRecord(DataSet: TDataSet);
begin
  DataSet.Cancel;
end;


Responder

23/02/2010

Wilson Junior

Caro Emerson,

A sua opinião é de grande avalia quando utilizado ClientDataSet que nunca poderá ser incluído no mesmo. Mas em casos em que determinados momentos poderá ser incluído registros, não será possível utilizar deste modo, e além disto, se você estiver utilizando este mesmo ClientDataSet para outras coisas, no mesmo nunca poderá ser incluído registros também.

Lembrando, a resposta do Emerson está corretíssima, mas vale lembrar de alguns detalhes.

Espero ter colaborado.
Responder