ListView: Ordenação Descendente no OnTitleClick

Delphi

13/09/2004

Olá programadores bom dia.


Através de um artigo da Clube Delphi 30, estou usando o componente
ListView para exibir os dados de uma tabela(pasmem dbf).

Agora o que eu gostaria de fazer e que não explica no artigo é
a ordenação descendente.

a procedure para ordenação ascendente é esta:

[color=green:eb6073e625]

procedure TFrmBoletoLaser.lsvRetornoColumnClick(Sender: TObject;
  Column: TListColumn);
const
  aCampo : array [0..13] of string = (´TIPO´,´TITULO´,´DESCRICAO´,
           ´DATVEN´,´VLRTITULO´,´VLRPGTO´,´DATENT´,´DATLIQ´,´VLRJUROS´,´VLRABAT´,
           ´VLRIOF´,´VLRDESC´,´VLRMORA´,´NBANCO´);
var
  sCampo : string;
begin
  sCampo := aCampo[Column.index];
  try
    cdsRetorno.IndexDefs.FindIndexForFields(sCampo);
  except
    on EDatabaseError do
    cdsRetorno.AddIndex(´Index´+sCampo,sCampo,[]);
  end;
  cdsRetorno.IndexFieldNames := sCampo;
  lsvRetorno.Invalidate;
end;
[/color:eb6073e625]


Li no help do Delphi:

Note: FindIndexForFields can only locate ascending indexes. To include descending indexes in the search, use GetIndexForFields.

mas não consegui usar

se alguem tiver uma dica.


Macario

Macario

Curtidas 0

Respostas

Alex Maia

Alex Maia

13/09/2004

Como os dados estão vindo de uma tabela, acho que vc poderia realizar esta ordenação nela, pois qualquer alteração na tabela se reflete no listview.
Falow!


GOSTEI 0
Macario

Macario

13/09/2004

Olá Alex.

Entao com a [b:09e8926e85]procedure[/b:09e8926e85] , ja faz isso, ordena a tabela

o que não estou conseguindo e a ordenação descendete.


GOSTEI 0
Macario

Macario

13/09/2004

ola colegas fazendo uma pesquisa mais refinada achei isso, é pra dbgrid
mas usa clientdataset entao ela serve, mas não ta correta

se algume puder me ajudar eu agradeço.

procedure TfmMasterGrid.grCadastroTitleClick(Column: TbsColumn);
var index: integer;
xCampoPesq: string;
begin
  if Column.FieldName = ´´ then
    Exit;
  try
    if not (dsCadastro.DataSet = nil) then
      begin
        xCampoPesq := lowercase(Column.FieldName);
        if (TClientDataSet(dsCadastro.DataSet).IndexName <> ´ix´+xCampoPesq) then
          TClientDataSet(dsCadastro.DataSet).IndexName := ´ix´+xCampoPesq
        else
          begin
            index := TClientDataSet(dsCadastro.DataSet).IndexDefs.IndexOf(´ix´+xCampoPesq);
            if xTitle then
              begin
                if (ixDescending in TClientDataSet(dsCadastro.DataSet).IndexDefs.Items[index].Options)
                then
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items[index].Options :=
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items[index].Options - [ixDescending]
                else
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items[index].Options :=
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items[index].Options + [ixDescending];
                dsCadastro.DataSet.Close;
                dsCadastro.DataSet.Open;
              end;
          end;
        dsCadastro.DataSet.First;
      end;

    except
    //
    end;
end;



GOSTEI 0
Macario

Macario

13/09/2004

UP :arrow: 8) 8) 8)


GOSTEI 0
Macario

Macario

13/09/2004

Aproveitando, outra pergunta.

Quem tem material ou exemplos de uso do ListView.

Segunda a edição 30 da Clube Delphi, ele é um componente nativo do windows, e que ele assume as caracteristicas de cada, versão.


Por que comigo não acontece isso? Estou usando, mas quando rodo a aplicação no Windows XP, ele nao assume as caracteristicas visuais do XP (isso vale pro TButton tambem). Quem me esclarece isso?


[b:90e09e23b2][color=red:90e09e23b2]ListView um excelente componente[/color:90e09e23b2][/b:90e09e23b2]


GOSTEI 0
Macario

Macario

13/09/2004

Olá programadoers, bom dia.


Pelo Visto como foi citado na edição 30 da revista clube delphi, esse componente não é muito utilizado.

Acho que vou mandar minha duvida pra revista.

Já que as duvidas acima se quer são olhadas.

Imagina se eu perguntar como fazer pra agrupar, como disponivel no XP.


GOSTEI 0
Ipc$

Ipc$

13/09/2004

No evento OnColumnClick execute Listview1.AlphaSort.
Com isto ele gera o evento onCompare.
No evento onCompare coloque:
procedure TForm1.Listview1Compare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
begin
Compare := CompareText(Item1.SubItems[indicedacoluna], Item2.SubItems[indicedacoluna]); // ascendente
Compare := -Compare // descendente
end;


GOSTEI 0
Macario

Macario

13/09/2004

Não funcionou....colega, to perdendo a referencia com a tabela


GOSTEI 0
Ipc$

Ipc$

13/09/2004

Funciona sim; vc colocou o índice correto da coluna?
Coloque:
ListView1.Items.BeginUpdate;
ListView1.AlphaSort;
ListView1.Items.EndUpdate;
Não funcionou....colega, to perdendo a referencia com a tabela

Como assim?


GOSTEI 0
Macario

Macario

13/09/2004

up :arrow: :arrow: :arrow: :idea: :idea: :?: :?: :?:

Caso alguem tenha uma dica. Fico grato.


GOSTEI 0
Macario

Macario

13/09/2004

Olá Programadores....


Continuo a duvida quanto a ordenação.

Nao consegui contato com a revista :?




Algum tem algum exemplo?


GOSTEI 0
Massuda

Massuda

13/09/2004

Sei que não resolve seu problema sobre ordenação mas...

[quote:a22d16c3a3=´Macario o Aspone´]... Segunda a edição 30 da Clube Delphi, ele é um componente nativo do windows, e que ele assume as caracteristicas de cada, versão. Por que comigo não acontece isso? Estou usando, mas quando rodo a aplicação no Windows XP, ele nao assume as caracteristicas visuais do XP (isso vale pro TButton tambem). Quem me esclarece isso?[/quote:a22d16c3a3]
Para que seu programa assuma a aparência do Windows XP, seu programa deve incluir um componente XPManifest (da aba Win32 se você estiver usando D7 ou melhor) ou ThemeManager (use se você estiver usando D6 ou anterior - baixe do [url=http://www.delphi-gems.com/ThemeManager.php]site do autor[/url]); ambos os componentes são do mesmo autor.

Mesmo que você esteja usando D7 ou melhor, vale a pena dar uma olhada no [url=http://www.delphi-gems.com/ThemeManager.php]site do autor[/url] para ter uma idéia das limitações e problemas existentes.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2004

tente assim (não testei):

procedure TFrmBoletoLaser.lsvRetornoColumnClick(Sender: TObject; Column: TListColumn);
const
  aCampo : array [0..13] of string = (´TIPO´,´TITULO´,´DESCRICAO´,
           ´DATVEN´,´VLRTITULO´,´VLRPGTO´,´DATENT´,´DATLIQ´,´VLRJUROS´,´VLRABAT´,
           ´VLRIOF´,´VLRDESC´,´VLRMORA´,´NBANCO´);
var
  sCampo,sIndice : string;
  lDecrescente: boolean;
  Indice: TIndexDef;
begin
  sCampo := aCampo[Column.index];
  lDecrescente := cdsRetorno.IndexName=(´Index´+sCampo);
  try
    if lDecrescente
    then Indice := cdsRetorno.IndexDefs.GetIndexForFields(sCampo,True)
    else Indice := cdsRetorno.IndexDefs.FindIndexForFields(sCampo);
    sIndice := Indice.Name;
  except
    on EDatabaseError do
    begin
      sIndice := ´Index´+sCampo;
      if lDecrescente then
      begin
        sIndice := sIndice+´_D´;
        cdsRetorno.AddIndex(sIndice,sCampo,[ixDescending]);
      end
      else
        cdsRetorno.AddIndex(sIndice,sCampo,[]);
    end;
  end;
  cdsRetorno.IndexName := sIndice;
  lsvRetorno.Invalidate;
end;



GOSTEI 0
Raserafim

Raserafim

13/09/2004

Macario, nesta imagem que você colocou, na primeira coluna onde tem a figura de um V (verde) ou X (vermelho) está funcionando como checkbox? ou seja, quando clico ela muda o status?
Se estiver, por favor, me diz como que você fez isso.
valeu.


GOSTEI 0
Macario

Macario

13/09/2004

Ola raserafim,

eu simulo, um check.

Seria mais especificamente uma ´[b:91ba74c5c6]Flag[/b:91ba74c5c6]´...

Tenho um campo no CDS em mudo para [b:91ba74c5c6]S[/b:91ba74c5c6] ou [b:91ba74c5c6]N[/b:91ba74c5c6].

E ai conforme o status eu mudo o imagem index do ListView.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2004

tente assim (não testei):
procedure TFrmBoletoLaser.lsvRetornoColumnClick(Sender: TObject; Column: TListColumn);
const
  aCampo : array [0..13] of string = (´TIPO´,´TITULO´,´DESCRICAO´,
           ´DATVEN´,´VLRTITULO´,´VLRPGTO´,´DATENT´,´DATLIQ´,´VLRJUROS´,´VLRABAT´,
           ´VLRIOF´,´VLRDESC´,´VLRMORA´,´NBANCO´);
var
  sCampo,sIndice : string;
  lDecrescente: boolean;
  Indice: TIndexDef;
begin
  sCampo := aCampo[Column.index];
  lDecrescente := cdsRetorno.IndexName=(´Index´+sCampo);
  try
    if lDecrescente
    then Indice := cdsRetorno.IndexDefs.GetIndexForFields(sCampo,True)
    else Indice := cdsRetorno.IndexDefs.FindIndexForFields(sCampo);
    sIndice := Indice.Name;
  except
    on EDatabaseError do
    begin
      sIndice := ´Index´+sCampo;
      if lDecrescente then
      begin
        sIndice := sIndice+´_D´;
        cdsRetorno.AddIndex(sIndice,sCampo,[ixDescending]);
      end
      else
        cdsRetorno.AddIndex(sIndice,sCampo,[]);
    end;
  end;
  cdsRetorno.IndexName := sIndice;
  lsvRetorno.Invalidate;
end;


isso funcionou?


GOSTEI 0
Macario

Macario

13/09/2004

Olá emerson.en

Fiz um teste e não funcionou, colega.

Se tiver algum comentário. :roll:


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2004

como você monta sua listview a partir do cds? seria necessário vc refazê-la depois de ordenar, não?


GOSTEI 0
Raserafim

Raserafim

13/09/2004

Macario, você pode detalhar melhor como fazer?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2004

Macario, eu fiz um teste e funcionou..


GOSTEI 0
Macario

Macario

13/09/2004

Ola colegas,

emerson.en, estarei testando novamente entao, blz. E obrigado por sua atenção.

raserafim apos testar(e testarei ate sexta) a dica do emerson, lhe digo os passos necessarios, pois ai esta completa.


Entao até...lá


GOSTEI 0
POSTAR