Permitir Edição e proibir INSERT no DBGrid

Delphi

14/10/2009

Como fazer para Permitir Edição e proibir INSERT no DBGrid. Se coloco Edição = TRuE o DBGrid permiti edição das células, mas também permiti a inserção de novas linhas/records!

Quero impedir novas linhas e permitir a reedição das células!


Dogu

Dogu

Curtidas 0

Respostas

Marco Salles

Marco Salles

14/10/2009

A Edição ja é default

A Inserção vc enibe gerando uma Exceção no BeforeInsert do controle
DataWare Associado


GOSTEI 0
Dogu

Dogu

14/10/2009

Karamba!! Já estou perdendo a paciência com este Delphi. É tanta coisinha aqui, coisinha ali e nunca ficamos sabendo de tudo que é preciso!

Ah se eu pudesse aplicar Ruby on Rails neste trabalho, ah se eu pudesse!

procedure TDataModule1.cdsHorariosBeforeInsert(DataSet: TDataSet);
begin
    if cdsHorarios.RecordCount = 6 then
        raise Exception.Create(´Operação não permitida!´);
end;



GOSTEI 0
Afarias

Afarias

14/10/2009

|raise Exception.Create(´Operação não permitida!´);

vc pode usar Abort para impedir de forma silenciosa.


|Ruby on Rails neste trabalho, ah se eu pudesse!

Adoro Ruby.

Não se desespere, se estudar um pouco de Delphi como fez com o Ruby vai dominá-lo tb. No começo tudo parece complicado, mas verá q é muito simples.


T+


GOSTEI 0
Lehapan

Lehapan

14/10/2009

Caro Dogu, tenha paciência, pois não será da noite para o dia que você irá dominar uma linguagem de programação.
Abaixo segue o código:

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;

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;



procedure Tform.dbgrQueryKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  { Para não deixar apagar o registro }
  if  Key = VK_DELETE then
      Key := VK_NONAME
  ;

  Key := NaoInsereDBGrid( TDBGrid(Sender), TDBGrid(Sender).DataSource.DataSet, Key );
end;


Espero ter ajudado.


GOSTEI 0
Marco Salles

Marco Salles

14/10/2009

[b:12044cce68]lehapan [/b:12044cce68], muito mais indicado a exceção com raise ou com abort

e pareceque o Dogu ja captou isto

procedure TDataModule1.cdsHorariosBeforeInsert(DataSet: TDataSet); 
begin 
    if cdsHorarios.RecordCount = 6 then 
        raise Exception.Create(´Operação não permitida!´); 
end;


para que complicar algo simples ???? com ifs e cases e multiplos eventos ???


GOSTEI 0
Dogu

Dogu

14/10/2009

Sim meus amigos, a dica deu certo e vou aproveitar a dica do Abort também!


GOSTEI 0
POSTAR