Dúvida com DbGrid - Ordenação do Bookmark

Delphi

11/03/2009

Senhores, preciso fazer uma rotina que grave em uma outra tabela alguns registros que são mostrados num grid. Como é ,ultiselect o meu grid, eu uso Bookmar e BookmarList para guardar as informações e ddepois transferir para outra tabela. Na minha regra, o ultimo registro escolhido, é o que nós chamamos de pai. Isto é para uma associação, tipo árvore(não é exatamente árvore, lembra a idéia). O que passa é que, como eles são selecionados e marcados pelo bookmark e depois descarregados, estão seguindo a ordem do bookmark e este do grid. deixa-me explicar com exemplos.
Eu tenho isto conforme ordem abaixo no grid principal:
Linha Bola Balão Livro Boneca Papel Vidro
Aí eu escolho assim:?
Bola Vidro Boneca Linha
Linha foi a minha última escolha, o novo grid(outra tabela) deveria ficar assim conforme escolha acima, mas está ficando assim abaixo:
Linha Bola Boneca Vidro

Ou seja, ele seguiu a ordem do Grid anterior e não conforme a minha escolha. Sei que é devido ao Bookmark, pois ele segue a ordem do grid de onde ele foi acionado. Como faço para contornar isto?


Paulo

Paulo

Curtidas 0

Respostas

Paulo

Paulo

11/03/2009

Colocando um StringList e retirando o bookmark, eu consigo. Agora só pergunto uma coisa: Ao desmarcar, preciso retirar da StringList aquela linha e não pode haver mais de 11 linhas(Registros) na StringList.


GOSTEI 0
Paulo

Paulo

11/03/2009

Este código está retornando um List Index Out of Bound. Porque?
for i := 0 to Pred(grdOcorrencias.SelectedRows.Count) do
      if i = 11 then
        lista_ocorrencia.Delete(i);



GOSTEI 0
Paulo

Paulo

11/03/2009

Mais uma pergunta: Como faço para cada vez que eu desmarcar o Grid, seja deletada da StringList o registro referente aquele desmarcado?


GOSTEI 0
Paulo

Paulo

11/03/2009

resolvi o List Index Out of Bounds. O For estava num lugar errado, ou seja, havia uma validação de não aceitar mais de 11 linhas e depois disso eu chamava o For. Claro, era no máximo 11 linhas e eu estava validando com 12(deletar a 12ª), logo estava fora da lista. Coloquei o For logo após eu popular a StringList e funcionou. Mas quanto a minha pergunta para Desmarcar ainda não consegui fazê-lo.


GOSTEI 0
Paulo

Paulo

11/03/2009

Deixa-me explicar melhor. Tenho uma StringList que está cheia de registros. O que desejo é que quando eu desmarcar a linha do Grid que está selecionada, preciso retirar da StringList o registro equivalente. Isto é que está me deixando louco.


GOSTEI 0
Delmar

Delmar

11/03/2009

Para remover tente a seguinte sintaxe

Lista.Delete(Lista.IndexOf(´ELEMENTO´));

Exemplo para remover ´Bola´

Lista.Delete(Lista.IndexOf(´Bola´));


GOSTEI 0
Paulo

Paulo

11/03/2009

Sim Delmar, isto sem problemas. O fato é que eu só posso apagar aquilo que foi desmarcado no Grid. Meu Grid é Multiselect e posso marcar até 11 itens(regra). Quando eu marco, eu coloco na lista, agora quando eu desmarco eu deveria retirá-lo de lá e é isto que não estou conseguindo. Penso em fazer um FOR na lista e correr toda ela e o registro que eu tenho na lista não tiver um bookmark, eu deleto, mas isso eu não sei fazer.


GOSTEI 0
Delmar

Delmar

11/03/2009

Considerando que esteja usando um TDBGrid

Talvez no onCellClick o codigo abaixo faria a inversão a cada click

   if DBGrid1.SelectedRows.CurrentRowSelected then
     retira da lista //está selecionado, logo deve estar na lista, então retira da lista
   else
     coloca na lista; //não está selecionando ainda, logo não deve estar  na lista, então coloca na lista



//eu acho que usando o CurrentRowSelected é o caminho, só não sei se este evento seria o correto


GOSTEI 0
Paulo

Paulo

11/03/2009

Abaixo o código todo. O que passa que ele está replicando as informações. Isto é lógico, porque eu usei bookmarks no grid e como o código está no OnCellClick, cada vez que é marcado alguma linha, o evento é chamado e gravado, independente do que já esteja populado na tabela. Só preciso fazer é retirar o novo valor, caso ele já esteja inserido na tabela, e isto não estou conseguindo.
procedure TfrmOcorrenciaPendente.grdOcorrenciasCellClick(Column: TColumn);
  procedure popula_lista;
  var
    contador,j: Integer;
    bkm: TBookmarkList;
  begin
    frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Open;
    bkm     := grdOcorrencias.SelectedRows;
    frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Open;

    //Pegar todos os itens selecionados somente - Paulo Correa - 17/02/2009
    for contador:= 0 to Pred(bkm.Count) do
    Begin
      if Contador > 11 then
      begin
        MessageDlg(´Só é permitido associar 10 ocorrências a uma ocorrência pai´,mtInformation,[mbOk],0);
        associa := True;
        Break;
      end;
      qryOcorrencias.BookMark := bkm[contador];

      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Append;
      qryTem_Ocor.FieldByName(´TMP_ID´).AsInteger := contador;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName(´TMP_ANO_OCORRENCIA´).AsString := copy(grdOcorrencias.Fields[1].AsString,1,4);
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName(´TMP_NUM_OCORRENCIA´).AsString := copy(grdOcorrencias.Fields[1].AsString,6,Length(grdOcorrencias.Fields[1].AsString));
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName(´TMP_DEFEITO_FALHA´).AsString := grdOcorrencias.Fields[3].AsString;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName(´TMP_ALIM_PRIMARIO´).AsString := grdOcorrencias.Fields[4].AsString;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName(´TMP_SUBESTACAO´).AsString := Copy(grdOcorrencias.Fields[4].AsString,1,3);
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName(´TMP_QTD_COMUNICACAO´).AsInteger := grdOcorrencias.Fields[13].AsInteger;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Post;

      //for j := 0 to Pred(frmAssociarOcor_Ocor_Direta.qryTem_Ocor.RecNo) do
        //if frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Locate()
    end;
  end;

begin
  if not Assigned(frmAssociarOcor_Ocor_Direta) then
    frmAssociarOcor_Ocor_Direta := TfrmAssociarOcor_Ocor_Direta.Create(Self);

  GravaItensSelecionado(grdOcorrencias);
end;



GOSTEI 0
Paulo

Paulo

11/03/2009

Onde se le isso
GravaItensSelecionado(grdOcorrencias);

entenda isso
popula_lista;



GOSTEI 0
Paulo

Paulo

11/03/2009

Uma pergunta. Quando faço várias marcações no Grid(Grid Multiselect), eu após escolher todos os itens, preciso chamar um Menu Popup. Se eu matenho a tecla Ctrl pressionada e chamar o Popup. o evento OnCellClick não é chamado. Se não pressiono a tecla Ctrl e aperto o botão direito do Mouse, os itens marcados são desmarcados e eu perco as informações do BoorkMark do Grid? Como eu resolvo isso? Ou chamo o popup sem Ctrl pressionada e sem desmarcar o Grid ou mantenho pressionado a tecla Ctrl, mas chamando o evento OnCellClick.


GOSTEI 0
Paulo

Paulo

11/03/2009

Tem como não manter a ordenação do Grid em BookmarkList?


GOSTEI 0
POSTAR