Dúvida com DbGrid - Ordenação do Bookmark
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:
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?
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
Curtidas 0
Respostas
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
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
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
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
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
11/03/2009
Para remover tente a seguinte sintaxe
Lista.Delete(Lista.IndexOf(´ELEMENTO´));
Exemplo para remover ´Bola´
Lista.Delete(Lista.IndexOf(´Bola´));
Lista.Delete(Lista.IndexOf(´ELEMENTO´));
Exemplo para remover ´Bola´
Lista.Delete(Lista.IndexOf(´Bola´));
GOSTEI 0
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
11/03/2009
Considerando que esteja usando um TDBGrid
Talvez no onCellClick o codigo abaixo faria a inversão a cada click
//eu acho que usando o CurrentRowSelected é o caminho, só não sei se este evento seria o correto
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
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
11/03/2009
Onde se le isso
entenda isso
GravaItensSelecionado(grdOcorrencias);
entenda isso
popula_lista;
GOSTEI 0
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
11/03/2009
Tem como não manter a ordenação do Grid em BookmarkList?
GOSTEI 0