Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Fragmentar/Paginar Resultado (https://www.clubdelphi.com/foros/showthread.php?t=46577)

MaMu 03-08-2007 20:07:59

Fragmentar/Paginar Resultado
 
Resulta que yo tengo un List con X cantidad de items. Estos, pueden oscilar desde 1 a 1000. Lo que yo quiciera hacer, es fragmentar o paginar estos items, por ejemplo, agruparlo cada 10 o 20 items.
Por ejempo, si el List.Count=100, entonces, quiciera agruparlo en 5 grupos de 20. Y asi, con cualquier valor de List.Count, una suerte de funcion, asi:

Código:

function Paginar(ListCount:integer;Pagina:Integer):integer;
 
//donde
 
//ListCount:=List.Count;
//Pagina:=Cantidad de Items por Pagina

Si por ejemplo tengo un List.Count=65, tendria que devolverme:
-20
-20
-20
-5

No se si se entiende lo que quiero hacer, pero no se me ocurre como.
Alguna sugerencia o idea???

Saludos

jhonny 03-08-2007 20:17:22

Entiendo muy bien lo que quieres, pero no me queda clara una cosa ¿A donde quieres enviar cada grupito?

MaMu 03-08-2007 20:28:07

Cita:

Empezado por jhonny (Mensaje 220110)
Entiendo muy bien lo que quieres, pero no me queda clara una cosa ¿A donde quieres enviar cada grupito?

En el List (StringList) tengo almacenado el Path de imagenes, las cuales quiero mostrar como Thumbs, pero quiciera mostrarlos cada 20 por ejemplo, para no tener que cargar ni crear todos los Thumbs y consumir exagerada memoria. No es lo mismo crear 100 Thumbs, que ir creando de a 20 en 5 pasos. Si yo hago un recuento mayor al numero que quiero paginar, voy activando botones, para ir avanzando o retrocediendo en el List, cosa de mostrar de 1 a 20, de 21 a 41, de 41 a 61, etc, asi hasta el ultimo.

Saludos

Delphius 03-08-2007 20:31:25

Al igual que jhonny... me estaba preguntando... ¿cual es el objetivo de agrupar los elementos?

Yo estaba pensando en mantener el grupo en el mismo List. El truco consistiría en ordenarlos por grupo:

elem1g1
elem2g1
...
elemNg1 - fin grupo 1
elem1g2
elem2g2
...
elemNg2 - fin grupo 2

De modo que lo que hay que recordar es la cantidad de grupos. Y no estar almacenando cada grupo por separado. La idea es para recorrer cada grupo se haga algo como (si quisieramos buscar los elementos del primer grupo. Siendo K la cantidad de grupos):

Código:

for i := 1 to ((List.Count -1) div K) do
  begin
    ... lo que haya que hacer...
  end;

Ahora, si necesariamente debes mantener a cada grupo separado. Creo que la solución puede pasar por hacer cosas como esta:

Código:

....
TGroup = class(TList);
...

TListGroup = class
  private
    FGroups: TList;
    FGroupsCount: integer;
  ... 
  public
    AddToGroup(Group: integer; Elemento: string);
  ...
end;


MaMu 03-08-2007 20:41:36

Lo que se me ocurrio es hacer lo siguiente:

Código Delphi [-]
 Pagina:=20;
  for i:=1 to List.Count do
    begin
      w:=w+1;  //acumulador
      if w=Pagina     //Conto 20?
        then begin
          w:=0;
          ListBox1.Items.Add('Pagina de '+IntToStr(i-Pagina)+' a '+IntToStr(i));
        end;
    end;

Y si por ejemplo el List.Count=100 me funciona, pero no se me ocurre, como hacer cuando List.Count=105, tengo que resolver eso.

Lo de los grupos lo habia pensado, pero tengo tan ordenado el tema de la lista que me da miedo cambiar el codigo.

Saludos

Delphius 03-08-2007 20:51:29

Mamu, hace tiempo tuve que manejar algo parecido a lo que tu buscas. Tenía que implementar el test Chi-Cuadrado que lo que hace es armar grupos (series) de elementos de una lista de números y con ellos calcula unos estadísticos.

Al algoritmo lo implementé con arrays dinámicos. Y me olvidaba de la creación de TList. Si estas interesado, te lo puedo enviar para que lo estudies. Yo lo que hice fue aplicar el artilugio que te comentaba anteriormente.

Saludos,

eduarcol 03-08-2007 20:52:21

Cita:

Empezado por mamu (Mensaje 220121)
Y si por ejemplo el List.Count=100 me funciona, pero no se me ocurre, como hacer cuando List.Count=105, tengo que resolver eso.

Prueba esta modificacion a ver si va, pero la verdad no entiendo exactamente cual es el problemas, si entiendo lo que quieres hacer mas no el problema que describes al comienzo

Código Delphi [-]
 Pagina:=20;
  for i:=1 to List.Count do
    begin
      w:=w+1;  //acumulador
      if w=Pagina     //Conto 20?
        then begin
          w:=0;
          ListBox1.Items.Add('Pagina de '+IntToStr(i-Pagina)+' a '+IntToStr(i));
        end;
    end;
   //Si sale valida que no tenga nada w, es decir imprimio todos los valores
   if w<>0 then
      ListBox1.Items.Add('Pagina de '+IntToStr(i-w)+' a '+IntToStr(i));    //Muestra los que falta

MaMu 03-08-2007 21:10:37

SOLUCIONADO

Implemente esto como prueba y funciona perfecto, tal cual lo necesitaba.
Luego lo voy a adaptar a una funcion.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var i,w,z,cant,porcion:integer;
begin
  w:=0;
  z:=20;
  porcion:=0;
  cant:=StrToInt(Edit1.Text);
  for i:=1 to cant  do
    begin
      w:=w+1;
      if w=z  //Conto 20?
        then begin
            w:=0;
            ListBox1.Items.Add('Pagina de '+IntToStr(i-z+1)+' a '+IntToStr(i));
            porcion:=porcion+1;
          end;
    end;
  //Faltan??? menores a Z=20
  if w<>0
  then ListBox1.Items.Add('Pagina de '+IntToStr(i-w)+' a '+IntToStr(cant));
end;

Delphius es interesante el dato, y desde ya cuando quieras compartirlo, bienvenido sea.

Saludos y Gracias a todos.


La franja horaria es GMT +2. Ahora son las 08:37:23.

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