Array
(
)

ListView: Ordenação Descendente no OnTitleClick

Macario
   - 13 set 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:


Citação:
#Código



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;


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.


Alex Maia
   - 13 set 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!


Macario
   - 13 set 2004

Olá Alex.

Entao com a procedure , ja faz isso, ordena a tabela

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


Macario
   - 13 set 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.


Citação:
#Código

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;



Macario
   - 14 set 2004

UP :arrow: 8) 8) 8)


Macario
   - 15 set 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?


ListView um excelente componente


Macario
   - 16 set 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.


Ipc$
   - 16 set 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;


Macario
   - 16 set 2004

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


Ipc$
   - 16 set 2004

Funciona sim; vc colocou o índice correto da coluna?
Coloque:
ListView1.Items.BeginUpdate;
ListView1.AlphaSort;
ListView1.Items.EndUpdate;

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

Como assim?


Macario
   - 28 set 2004

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

Caso alguem tenha uma dica. Fico grato.


Macario
   - 01 fev 2005

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?


Massuda
   - 01 fev 2005

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


Citação:
... 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?

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.


Emerson
   - 01 fev 2005

tente assim (não testei):

#Código


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;



Raserafim
   - 02 fev 2005

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.


Macario
   - 02 fev 2005

Ola raserafim,

eu simulo, um check.

Seria mais especificamente uma ´Flag´...

Tenho um campo no CDS em mudo para S ou N.

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


Emerson
   - 02 fev 2005


Citação:
tente assim (não testei):

#Código


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?


Macario
   - 02 fev 2005

Olá emerson.en

Fiz um teste e não funcionou, colega.

Se tiver algum comentário. :roll:


Emerson
   - 02 fev 2005

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


Raserafim
   - 02 fev 2005

Macario, você pode detalhar melhor como fazer?


Emerson
   - 03 fev 2005

Macario, eu fiz um teste e funcionou..