ListView: Ordenação Descendente no OnTitleClick

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&93; of string = (´TIPO´,´TITULO´,´DESCRICAO´,
           ´DATVEN´,´VLRTITULO´,´VLRPGTO´,´DATENT´,´DATLIQ´,´VLRJUROS´,´VLRABAT´,
           ´VLRIOF´,´VLRDESC´,´VLRMORA´,´NBANCO´);
var
  sCampo : string;
begin
  sCampo := aCampo&91;Column.index&93;;
  try
    cdsRetorno.IndexDefs.FindIndexForFields(sCampo);
  except
    on EDatabaseError do
    cdsRetorno.AddIndex(´Index´+sCampo,sCampo,&91;&93;);
  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

Respostas

13/09/2004

Alex Maia

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!


Responder Citar

13/09/2004

Macario

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.


Responder Citar

13/09/2004

Macario

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&93;.Options)
                then
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items[index&93;.Options :=
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items&91;index&93;.Options - &91;ixDescending&93;
                else
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items&91;index&93;.Options :=
                  TClientDataSet(dsCadastro.DataSet).IndexDefs.Items&91;index&93;.Options + &91;ixDescending&93;;
                dsCadastro.DataSet.Close;
                dsCadastro.DataSet.Open;
              end;
          end;
        dsCadastro.DataSet.First;
      end;

    except
    //
    end;
end;



Responder Citar

14/09/2004

Macario

UP :arrow: 8) 8) 8)


Responder Citar

15/09/2004

Macario

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]


Responder Citar

16/09/2004

Macario

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.


Responder Citar

16/09/2004

Ipc$

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;


Responder Citar

16/09/2004

Macario

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


Responder Citar

16/09/2004

Ipc$

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?


Responder Citar

28/09/2004

Macario

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

Caso alguem tenha uma dica. Fico grato.


Responder Citar

01/02/2005

Macario

Olá Programadores....


Continuo a duvida quanto a ordenação.

Nao consegui contato com a revista :?


[img:46eb2f533a]http://www.compilacom.com/images/OrdenarListview.jpg[/img:46eb2f533a]


Algum tem algum exemplo?


Responder Citar

01/02/2005

Massuda

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.


Responder Citar

01/02/2005

Emerson

tente assim (não testei):

procedure TFrmBoletoLaser.lsvRetornoColumnClick(Sender: TObject; Column: TListColumn);
const
  aCampo : array [0..13&93; 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&91;Column.index&93;;
  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&93;);
      end
      else
        cdsRetorno.AddIndex(sIndice,sCampo,&91;&93;);
    end;
  end;
  cdsRetorno.IndexName := sIndice;
  lsvRetorno.Invalidate;
end;



Responder Citar

02/02/2005

Raserafim

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.


Responder Citar

02/02/2005

Macario

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.


Responder Citar