Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
toretto_PHP

(Resolvido) Indices com DBGrid

Question

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...

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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,

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Cloud Computing


  • Forum Statistics

    • Total Topics
      148602
    • Total Posts
      644294
×
×
  • Create New...