Ir al contenido


Foto

Cargando imágenes a un TListItemBox con Estilos


Mejor respuesta enecumene , 07 marzo 2017 - 02:05

Ah caray, pues me retracto :) , descubrí cómo es el asunto, y es una caballá, simplemente en el stylebook el TImage colocas en su propiedad StyleName con el nombre 'icon', y voilá, con item.itemdata.bitmap se carga sin problemas.

Ir al mensaje completo


  • Por favor identifícate para responder
8 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 07 marzo 2017 - 10:51

Acá ando probando y tratando de entender el enredo de Firemonkey, en este caso estoy trabajando con los items de un ListBox usando Estilos (StyleBook), en la hoja de estilo tengo dos TLayout, un TImage y un Text, hasta aquí todo bien, creo los items dinámicamente a través de un StringList, el texto me lo asume sin problemas, pero las imagenes en todos los items me carga con la última imagen, esto es lo que tengo:


delphi
  1. procedure LoadListMainMenu(AListBox: TListBox; AMenuList: TStringList);
  2. var i: Integer;
  3. Item: TListBoxItem;
  4. Menu: TStrings;
  5. begin
  6. AListBox.BeginUpdate;
  7.  
  8. for i := 0 to AMenuList.Count -1 do begin
  9. Menu := TStringList.Create;
  10. try
  11. ExtractStrings(['~'],[],PWideChar(AMenuList.Strings[i]),Menu);
  12.  
  13. Item := TListBoxItem.Create(nil);
  14. Item.Parent := AListBox;
  15. Item.StyleLookup := 'itemMenu';
  16. Item.Height := 30;
  17. Item.Text := Menu[0];
  18. Item.StylesData['textmenu'] := Menu[0];
  19. SetItemImages('iconMenuImg',Menu[1],Item);
  20. finally
  21. Menu.Free;
  22. end;
  23. end;
  24.  
  25. AListBox.EndUpdate;
  26. end;
  27.  
  28. procedure SetItemImages(const AImgObject: string; AIdentifier: String);
  29. var AFMXObject: TFMXObject;
  30. begin
  31. AFMXObject := FindStyleResource(AImgObject) as TImage;
  32. if Assigned(AFMXObject) then
  33. TImage(AFMXObject).Bitmap.LoadFromURL(BaseIMG + '/sistema/' + AIdentifier);
  34. end;

En el procedimiento SetItemImages intenté agregar un parámetro adicional apuntando al item y haciendo la llamada Item.FindStyleResource(), pero aquí no me carga ninguna imagen, ¿Cómo podría remediar ésto?, dejo imagen del resultado.

 

Saludos

Archivos adjuntos


  • 0

#2 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 07 marzo 2017 - 12:27

A simple vista, estas pasando siempre el mismo identificador a tu proceso que baja la imagen de la web

 

A mi me resulta extraño tu bucle for:


delphi
  1. for i := 0 to AMenuList.Count -1 do begin
  2. Menu := TStringList.Create;
  3. try
  4. ExtractStrings(['~'],[],PWideChar(AMenuList.Strings[i]),Menu);
  5.  
  6. Item := TListBoxItem.Create(nil);
  7. Item.Parent := AListBox;
  8. Item.StyleLookup := 'itemMenu';
  9. Item.Height := 30;
  10. Item.Text := Menu[0]; // no deberia ser Menu[I]?
  11. Item.StylesData['textmenu'] := Menu[0]; // no deberia ser Menu[I]?
  12. SetItemImages('iconMenuImg',Menu[1],Item); // no deberia ser Menu[I]?
  13. finally
  14. Menu.Free;
  15. end;
  16. end;

No se exactamente que guardas en el TStringList Menu, pero lo iteras y dejas varios indices "fijos"

 

Por otra parte, sin necesidad de liarse con estilos, TListBoxItem ya tiene soporte para imagenes usando TImageList + propiedad ImageIndex, o bien, TListBoxItem.ItemData.Bitmap

 

Ejempo pequeño:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. Item: TListBoxItem;
  4. begin
  5. Item := TListBoxItem.Create(ListBox1);
  6. Item.Parent := ListBox1;
  7. Item.ItemData.Bitmap.LoadFrom...
  8. end;

Otro dato no menor, estas creando los TListBoxItem sin Owner, esto te lleva a fugas de memoria si la aplicacion corre en Windows

 

PD: Por cierto, en Berlin no tengo el metodo LoadFromUrl  :(


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 07 marzo 2017 - 01:01

Menu guarda un string de éste estilo:
 

Jugadores~players.png
Menu[0] = Jugadores y Menu[1] = players.png

 
Fíjate, que he tratado de buscar TImageList, y al parecer Firemonkey no tiene esa clase ó componente por he recurrido al uso del estilo, en VCL sí, y sí, está Item.itemData.Bitmap, el problema es que los estilo predefinidos por delphi no son los adecuados para mis necesidades y además inmanejables.

 

Saludos.


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 07 marzo 2017 - 01:02

Ah y se me olvidó que LoadFromUrl es un Helper a la clase TBitmap.


  • 0

#5 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 07 marzo 2017 - 01:11

Creo que TImageList vino en XE7 u XE8 para Firemonkey. 

 

Sigo sin entender que es lo que esperas del codigo  :)

 

Osea, estas cargando siempre la misma imagen y eso es lo que dice tu codigo, estas cargando siempre la imagen "players.png"


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 07 marzo 2017 - 01:30

Bueno llegó en Delphi Seattle, porque no está en XE7 (que es la que uso) ni en XE8, dejame darle otra vuelta al asunto.

 

Saludos.


  • 0

#7 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 07 marzo 2017 - 01:35

En XE8 agregaron TImageList :)

 

http://docwiki.embar...tions_of_Images


  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 07 marzo 2017 - 02:05   Mejor respuesta

Ah caray, pues me retracto :) , descubrí cómo es el asunto, y es una caballá, simplemente en el stylebook el TImage colocas en su propiedad StyleName con el nombre 'icon', y voilá, con item.itemdata.bitmap se carga sin problemas.


  • 0

#9 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 07 marzo 2017 - 02:10

Pues la verdad este asunto de los estilos debería estar bien documentado, porque tiene "madera" o "mucha tela para cortar", pero hay que ir como ciego con bastón probando para ver cómo va la cosa

Puesto que el código no habla por sí solo, y que todo es hecho por fmx usando strings para "matchear"
  • 1