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

(Resolvido) Indices com DBGrid


toretto_PHP

Pergunta

Boa tarde.

Faz tempo que não posto aqui no ScriptBrasil... como estão?

Bom, estou montando um sistema em Delphi (sou iniciante) e, embora o meu programa esteja funcionando bem, ainda apresenta alguns problemas que desejo solucionar.

Como faço para saber qual o índice que está sendo selecionado pelo usuário no DBGrid?

Fiz um form que monta uma requisição de materiais. O usuário entra com os materiais e automáticamente este vai salvando no bd e exibe no dbgrid. Mas da mesma forma que ele insere eu também quero que seja alterado, excluido, etc. Eu fiz da seguinte forma:

procedure TFReqMat.btnInsereClick(Sender: TObject);
var s: string;
begin
    s := matQtde.Text;
    while Pos(',',s) > 0 do
        s[Pos(',',s)] := '.';
        matQtde.Text := s;

   qLstM.Active;
   qLstM.Close;
   qLstM.SQL.Clear;
   qLstM.SQL.Add('INSERT INTO lst_reqm (id_mat, reqm_qtde, id_reqm)');
   qLstM.SQL.Add('VALUES (');
   qLstM.SQL.Add('"'+ IntToStr(idmat) +'",');
   qLstM.SQL.Add('"'+ matQtde.Text +'",');
   qLstM.SQL.Add('"'+ IntToStr(idreqm) +'");');
   qLstM.ExecSQL;

   qlstM.Close;
   qlstM.SQL.Clear;
   qlstM.SQL.Add('SELECT');
   qlstM.SQL.Add('materiais.mat_eam, materiais.mat_descr,');
   qlstM.SQL.Add('lst_reqm.reqm_qtde');
   qlstM.SQL.Add('FROM materiais, lst_reqm');
   qlstM.SQL.Add('WHERE materiais.id_mat = lst_reqm.id_mat ');
   qlstM.SQL.Add('  AND lst_reqm.id_reqm = ' + IntToStr(idreqm) + ';');
   qlstM.ExecSQL;
   qlstM.Open;

   if qlstM.RowsAffected > 0 then begin
      lstReq.Refresh;  // ATUALIZA O DBGRID
   end;

end;
Ao apertar o botão Add o usuário vai cadastrar os produtos no bd. Está básico, é claro. Até aí funciona legal. Porém o problema é quando eu quero ver o índice da linha. Suponha que eu inclui dois materiais na requisição, eu selecionei com o mouse a linha 2. Para isso eu fiz um botão e nele fiz o seguinte código
procedure TFReqMat.removerClick(Sender: TObject);
var
i, val: integer;
begin
  With lstReq do
  Begin
    showmessage(IntToStr(lstReq.SelectedIndex)); // O QUE ME RETORNA É SEMPRE 0.
  end;
end;

O que me retorna é sempre zero, independentemente de onde esteja apontando o ponteiro. Porque?

Obrigado quem vier a me ajudar...

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
procedure TFReqMat.removerClick(Sender: TObject);

var

i, val: integer;

begin

With lstReq do

Begin

showmessage(IntToStr(lstReq.SelectedIndex)); // O QUE ME RETORNA É SEMPRE 0.

end;

end;

O que me retorna é sempre zero, independentemente de onde esteja apontando o ponteiro. Porque?

Tenta desta maneira:

procedure TFReqMat.lstReqCellClick(Column: TColumn);
var
i, val: integer;
begin
  With lstReq do
  Begin
         Label1.Caption := lstReq.Columns[lstReq.SelectedIndex].FieldName; // mostra o titulo da coluna onde esta o cursor

         Label2.Caption := lstReq.Columns[lstReq.SelectedIndex].Field.AsString; // mostra o conteudo do campo onde esta o cursor

         Label3.Caption := inttostr(lstReq.SelectedIndex); // mostra o numero da coluna onde esta o cursor

         Label4.caption := inttostr(lstReq.DataSource.DataSet.RecNo); //mostra o numero da linha onde esta o cursor
  end;
end;

OBS: estou supondo que o nome do seu Dbgrid seja lstReq... observe que o codigo foi colocado no evento OnCellClick do DBGrid

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Porém o problema é quando eu quero ver o índice da linha. Suponha que eu inclui dois materiais na requisição, eu selecionei com o mouse a linha 2. Para isso eu fiz um botão e nele fiz o seguinte código

procedure TFReqMat.removerClick(Sender: TObject);
var
i, val: integer;
begin
  With lstReq do
  Begin
    showmessage(IntToStr(lstReq.SelectedIndex)); // O QUE ME RETORNA É SEMPRE 0.
  end;
end;

toretto_PHP, com relação a forma de verificar o número da linha selecionada (na verdade o registro selecionado) o Jhonas já deu uma sugestão - RecNo e pode ser usado em qualquer ponto do programa, não apenas no evento citado.

Mas observando que você parece querer utilizar isto para implementação da opção de Exclusão, então eu acrescentaria que (dependendo do componente utilizado) para excluir a linha correntemente selecionada, bastaria que você chamasse o método Delete do dataset ligado a este DBGrid.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Micheus e Jhonas.

Ambos contribuiram para que eu conseguisse resolver. Com base no que vocês me passaram eu fiz o seguinte, a grosso modo:

procedure TFReqMat.removerClick(Sender: TObject);
var
i, idMat: integer;
begin
  With lstReq do
  Begin
       idMat := DataSource.DataSet.FieldValues['id_mat'];
       qlstM.Close;
       qlstM.SQL.Clear;
       qlstM.SQL.Add('DELETE FROM lst_reqm WHERE idMat = "' +codEam +'";');
       qlstM.ExecSQL;
  end;
end;

Aqui funcionou... mas beleza... vocês me ajudaram bastante, obrigado novamente.

Abraços,

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

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