Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Llamar a la funcion que ordena al pulsar un titulo de columna (https://www.clubdelphi.com/foros/showthread.php?t=86974)

aguml 30-10-2014 17:21:30

Llamar a la funcion que ordena al pulsar un titulo de columna
 
Hola amigos, tengo esto:
Código PHP:

void __fastcall TForm1::ButRefrescarProcClick(TObject *Sender)
{
    
ListItemsProcesos->Clear();
    
llenarLista();
   if(
LastShortedColumn != -1)
      
//Aqui la funcion que ordene todo por la columna deseada
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListViewProcesosColumnClick(TObject *Sender,
      
TListColumn *Column)
{
   
LastShortedColumn Column->Index;
    
ColumnToSort Column->Index;
    ((
TCustomListView *)Sender)->AlphaSort();
}
//--------------------------------------------------------------------------- 

Y lo que quiero es que al pulsar el boton de refrescar se ordene el listview por la columna que indique LastShortedColumn pero no se como hacer para llamar a ese evento del ListView. ¿alguien puede ayudarme?

escafandra 30-10-2014 17:40:18

Mira esto.


Saludos.

ecfisa 30-10-2014 18:46:54

Hola aguml.

También tenes un ejemplo en la propia ayuda de C++ Builder (TCustomListView => AlphaSort => Example)

Saludos :)

aguml 30-10-2014 20:34:50

No me entendisteis, yo tengo esto:
Código PHP:

void __fastcall TForm1::ButRefrescarProcClick(TObject *Sender)
{
    
ListItemsProcesos->Clear();
    
llenarLista();
   if(
LastShortedColumn != -1)
   { 
//Aqui la funcion que ordene todo por la columna deseada
      
   
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListViewProcesosColumnClick(TObject *Sender,
      
TListColumn *Column)
{
   
LastShortedColumn Column->Index;
    
ColumnToSort Column->Index;
    ((
TCustomListView *)Sender)->AlphaSort();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListViewProcesosCompare(TObject *Sender,
      
TListItem *Item1TListItem *Item2int Dataint &Compare)
{
    if (
ColumnToSort == 0)
        
Compare CompareText(Item1->Caption,Item2->Caption);
    else if(
ColumnToSort == 1)
    {
        
Compare Item1->SubItems->Strings[0].ToInt() - Item2->SubItems->Strings[0].ToInt();
    }
    else if(
ColumnToSort == 2)
    {
        
Compare CompareText(Item1->SubItems->Strings[1], Item2->SubItems->Strings[1]);
    }
    else if(
ColumnToSort == || ColumnToSort == 4)
    {
        
Compare Item1->SubItems->Strings[2].ToInt() - Item2->SubItems->Strings[2].ToInt();
    }
}
//--------------------------------------------------------------------------- 

Lo que quiero es que cuando haga clic en el boton ButRefrescarProc me limpie la lista, la rellene, y la ordene, sin tener que hacer clic en ninguna columna.

escafandra 30-10-2014 20:47:58

Revisa la propiedad TListView::SortType

Saludos.

aguml 30-10-2014 22:39:19

no entiendo. Lo que he puesto funciona perfecto si hago clic en un titulo de columna pero tambien quiero que ordene al dar en el boton que indico y que lo haga justo con la misma columna de la ultima vez que se ordenó. ¿Poniendo esa propiedad en alguno de esus valores hace eso? Creo que uno era shorttext o algo asi aunque yo lo tengo a none.

escafandra 31-10-2014 00:08:09

Revisa la propiedad y asignalá en el evento OnCick del botón.


Saludos.

aguml 31-10-2014 00:18:42

Al final lo hice así:
Código PHP:

void __fastcall TForm1::ButRefrescarProcClick(TObject *Sender)
{
    
ListItemsProcesos->Clear();
    
llenarLista();
   if(
LastShortedColumn != -1)
   { 
//Aqui la funcion que ordene todo por la columna deseada
      
ListViewProcesos->AlphaSort();
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListViewProcesosColumnClick(TObject *Sender,
      
TListColumn *Column)
{
   
LastShortedColumn Column->Index;
    
ColumnToSort Column->Index;
    ((
TCustomListView *)Sender)->AlphaSort();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ListViewProcesosCompare(TObject *Sender,
      
TListItem *Item1TListItem *Item2int Dataint &Compare)
{
    if (
ColumnToSort == 0)
        
Compare CompareText(Item1->Caption,Item2->Caption);
    else if(
ColumnToSort == 1)
    {
        
Compare Item1->SubItems->Strings[0].ToInt() - Item2->SubItems->Strings[0].ToInt();
    }
    else if(
ColumnToSort == 2)
    {
        
Compare CompareText(Item1->SubItems->Strings[1], Item2->SubItems->Strings[1]);
    }
    else if(
ColumnToSort == 3)
    {
        
Compare Item1->SubItems->Strings[2].ToInt() - Item2->SubItems->Strings[2].ToInt();
    }
   else if(
ColumnToSort == 4)
   {
      
Compare CompareText(Item1->SubItems->Strings[3], Item2->SubItems->Strings[3]);
   }
   else if(
ColumnToSort == 5)
   {
      
Compare CompareText(Item1->SubItems->Strings[4], Item2->SubItems->Strings[4]);
   }
}
//--------------------------------------------------------------------------- 

No pude hacerlo como dices asignando la propiedad ya que me decia algo de que era ambiguo y no me dejaba ni con = ni con << pero si vi que existian tanto AlphaSort como CustomSort y la primera hace lo que quería pero intenté como dices o usando CustomSort que supongo que tendrá la ventaja de hacer un ordenamiento mas personalizado pero no fui capaz de usar ninguno de los dos.

aguml 31-10-2014 17:47:54

una pregunta, cuando limpio y relleno el tlistview se ve como se vacia y se rellena. En delphi creo que se evita eso usando ante una funcion updatebegin o algo asi ¿Como puedo hacerlo para que no se vea el parpadeo ese y simplemente aparezca actualizada sin mas?

escafandra 31-10-2014 23:07:15

Revisa esto: Trucos para TListView con la API de Windows.


Saludos

escafandra 01-11-2014 01:27:45

Otro detalle, para usar SortType desde código, hazlo así:
Código PHP:

 ListView1->SortType Comctrls::stText


Saludos.

aguml 01-11-2014 10:46:03

¿En que se diferencia hacer lo que haces en tus trucos que muestras a usar ListView1->Items->BeginUpdate() para impedir que se actualice y luego usar ListView1->Items->EndUpdate() para mostrarlo ya actualizado?

escafandra 01-11-2014 12:58:21

Mi truco evita la actualización de la ventana ListView a bajo nivel. Esa actualización es lenta pues se realiza a través de mensajes windows uno a uno. Mi truco evita procesar los mensajes ganando rapidez con efecto visual de instanteneidad.

Saludos.

escafandra 01-11-2014 13:43:49

En realidad ambas cosas son lo mismo, trabajan a nivel del mensaje WM_SETREDRAW para evitar la actualización visual. Conocerlo a bajo nivel es útil para usarlo con cualquier ventana en builder o cuando trabajamos sólo con la API a bajo nivel Windows.

Saludos.

aguml 01-11-2014 15:50:45

ok, mil gracias.


La franja horaria es GMT +2. Ahora son las 13:09:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi