Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ComboBoxEx y ImageList (https://www.clubdelphi.com/foros/showthread.php?t=71407)

emme_juegos 17-12-2010 06:34:05

ComboBoxEx y ImageList
 
hola de nuevo!

necesito, si es que hay, un codigo para que cada item del comboboxex obtenga una imagen de un imagelist

yo he intentado con esto:

Código Delphi [-]
ComboBoxEx1.ItemsEx.ComboItems.ImageIndex:=FormBaseDeDatos.ImageList1. (y ahora no se como seguir)



quiero saber si se puede asi es mas facil y te ahorras mucho trabajo... necesito 193 items!!

chau y gracias!!

ecfisa 17-12-2010 08:46:30

Hola.

Te pongo un ejemplo para cargar un TComboBoxEx desde un TImageList, y también un TComboBox como alternativa:
Código Delphi [-]
...
{ Cargar ComboBoxEx y ComboBox }
procedure TForm1.FormShow(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to ImageList1.Count -1 do
  begin
    // Cargar TComboBoxEx 
    ComboBoxEx1.ItemsEx.AddItem('Item '+IntToStr(i), i, i, 0, 0, nil)
   // Cargar TComboBox 
    ComboBox1.Items.Add('Item '+IntToStr(i));
  end;
end;

{ Mostrar imágen + Item en el TComboBox }
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; 
                                   Rect: TRect; State: TOwnerDrawState);
begin
  // Rellenar el area
  ComboBox1.Canvas.FillRect(Rect);
  // Dibujar la imágen actual
  ImageList1.Draw(ComboBox1.Canvas, Rect.Left, Rect.top,Index);
  // Dibujar imágen y texto
  ComboBox1.Canvas.TextOut(Rect.left + ImageList1.Width+2, Rect.top, ComboBox1.Items[Index]);
end;
...

Saludos.

rgstuamigo 17-12-2010 20:44:23

Cita:

Empezado por emme_juegos (Mensaje 385230)
necesito, si es que hay, un codigo para que cada item del comboboxex obtenga una imagen de un imagelist
...

Si te estoy entendiendo bien lo que pretendes hacer, pues para tener los item del ComboBoxEx con las imagenes de un ImageList, no necesitas codificar nada, simplemente debes enganchar la propiedad Images del ComboBoxEx con tu componente ImageList y posteriormente ir a la propiedad ItemEx del ComboBoxEx y crear todos los item (TComboExItems) que veas necesario mostrar, por supuesto cada Item (TComboExItems) que crees debes engancharle su respectiva imagen atravez de su propiedad ImageIndex;)
Saludos...:)

FENIXadr 08-05-2011 21:21:17

Hola ecfisa...
Probé el código que publicaste pero he tenido algunos prblemas...

en primer lugar quiero comentarte que estoy haciendo una lista desplegable con los drives de la PC y quiería colocarle el dibujito del drive para que estéticamente quedara mejor, opté por un ComboBoxEx, pero la función AddItem me agrega un renglón en balnco, o sea que se despliega una lista con la cantidad de renglones acorde a la cantidad de drives, pero sin mostrar ningun nombre ni imagen, lo mismo sucede si quiero agregar un nombre sin imagen con la funcion Add.
Éstas funciones son muy transparentes y se supone que deberían funcionar sin tener que activar ninguna bandera o algo asi antes de usarlas.. no se.. no le encuentro lógica a este problema.

Después de renegar un rato me decidí por el ComboBox común y he aquí que surge otro problema... NUNCA y no se porque pero NUNCA entra al evento OnDrawItem, por lo tanto me muestra los drives, pero no las imagenes, acá la funcion Add (que la uso igual que en el ComboBoxEx) si funciona correctamente..


Que es lo que puede estar pasndo???

desde ya muchas gracias...

ecfisa 08-05-2011 23:44:08

Cita:

NUNCA y no se porque pero NUNCA entra al evento OnDrawItem, por lo tanto me muestra los drives, pero no las imagenes

Que es lo que puede estar pasndo???
Hola FENIXadr.

El evento OnDrawItem sólo funciona si el ComboBox tiene la propiedad Style en csOwnerDrawFixed o en csOwnerDrawVariable.

.csOwnerDrawFixed: Cada item tendrá la altura especificada en la propiedad ItemHeight.
.csOwnerDrawVariable: Cada item puede tener alturas diferentes.


Un saludo.

FENIXadr 09-05-2011 12:37:03

ok.. gracias...

pregunto... si yo tengo asignado en el evento OnClick de un TTreeView un procedimiento del Form1 (definido por el usuario) y en tiempo de ejecucion cambio este procedimiento (en el constructor del componente), como hago para no perder el anterior?? o sea yo quiero recalcular las carpetas al presionar el boton sobre el TTreeView pero quiero que el usuario no pierda el procedimiento que definió en el IDE.. me explico??...

he probado definiendo una variable del tipo procedure pero cuando la llamo me da una excepción.. seguramente le asigno mal la direccion de memoria..

desde ya muchas gracias

(perdón si no está totalmente dentro del hilo la pregunta...):o

ecfisa 09-05-2011 13:53:50

Hola.
Cita:

(perdón si no está totalmente dentro del hilo la pregunta...)
En realidad lo que corresponde es que habras un nuevo hilo para una nueva pregunta, está claramente expuesto en el punto 8 de la guía de estilo .



No entiendo muy bién la situación, pero una posible solución es crear una variable privada al form de tipo TNotifyEvent, a la que asígnes el evento que querés recuperar luego, asignes el nuevo envento y luego al salir del form lo restaures:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormShow(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
  private
    FNotifyEvent: TNotifyEvent;
  public
  end;
...
implementation
...
procedure TForm1.FormShow(Sender: TObject);
begin
  FNotifyEvent:= TreeView1Click;  // guarda el evento
end;

procedure TForm1.TreeView1Click(Sender: TObject);
begin
   // Evento definido en el form
end;

...
// Creación del objeto que cambia el evento
...

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TreeView1.OnClick:= FNotifyEvent; // restaura el evento
end;

Saludos.

FENIXadr 09-05-2011 17:22:15

sisisisi.. mil disculps por lo del nuevo hilo... supuse que la respuesta era rapida y por eso lo pregunté... se que no es lo debido.. mil disculpas...

Con respecto a la respuesta.. está clarísimo.. yo definía una variable como procedure por eso me daba error .. tenía que definirla comoTNotifyEvent.. ahora si funciona...:D
Cuando se hace click en el TreeView para cambiar de carpeta, primero se actualiza y después llama al evento OnClick que definió el usuario... (en este caso es para mostrar la ruta completa en un TLabel.)

Muchísimas gracias...

PD: se que existe el componente ShellTreeView que hace todo esto y mejor que yo.. pero necesito hacerlo de esata manera en este caso...

saludos..

Chichero 28-06-2011 00:55:50

CASE de "tal" strings en combobox da ciertas varibles reales
 
Mi problema es que no he visto soluciones para casos de strings en combobox...Tengo varias ciudades las cuales tienen valores diferentes para unas variables, ejemplo:

Caracas A=20, B=25, C=38

Valencia A=39, B=50, C=60

Maracaibo A=42, B= 28, C=55

que con esas variables luego hare ciertas operaciones y presentare resultados, se que debo trabajar con la selectiva multiple CASE y bueno creo que debo definir una variable string que proceda de la opcion seleccionada en el combobox...quisiera que me ayudaran con la codificacion; más o menos esquematizando lo que quiero y la codificación que hize (pero el programa no corre, no sé cuál es el error:
Código Delphi [-]
procedure

TForm1.BitBtn1Click(Sender:TObject);

Var A,B,C:real;
City:String

begin
City:=String(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
CASE City OF
'Caracas': A:=20;
B:=25;
C:=38;
'Valencia': A:=39;
B:=50;
C:=60;
'Maracaibo': A:=42;
B:=28;
C:=55;
ELSE
Showmessage('No Seleccionó Ciudad');
end;
.
.Hago las lineas de operaciones
.

end;

ecfisa 28-06-2011 15:42:25

Hola Chichero.

Por favor abrí un nuevo tema para esta pregunta y cuando lo hagas utiliza las etiquetas [delphi] [/delphi] para encerrar el código Delphi que incluyas.
Te aconsejo también leer la guía de estilo .

Saludos y gracias por tu colaboración. :)

cl2raul 06-02-2014 21:51:55

hola este componente lo estoy usando para cargar las nacionalidades en mi programa, pero antes lo hacia manual...
les explico utilizaba un TImageList donde se alojaba todas las banderas del mundo desde una carpeta y al itemsEx agregaba cada país según su bandera y todo ok...
pero migre muchas cosas a SQLite, para que sea menos pesado y me sirva para futuros proyectos...

mi pregunta es como asigno el nombre del pais y la bandera al TComboBoxEx.

ecfisa 07-02-2014 02:22:57

Hola cl2raul.

Si las imágenes guardadas en tu base de datos son de tipo Windows bitmap podes hacer:
Código Delphi [-]
...

procedure ResizeBitmap(Bitmap: TBitmap; Width, Height: Integer; Background: TColor);
var
  R: TRect;
  B: TBitmap;
  X, Y: Integer;
begin
  if assigned(Bitmap) then
  begin
    B:= TBitmap.Create;
    try
      if Bitmap.Width > Bitmap.Height then
      begin
        R.Right:= Width;
        R.Bottom:= ((Width * Bitmap.Height) div Bitmap.Width);
        X:= 0;
        Y:= (Height div 2) - (R.Bottom div 2);
      end
      else
      begin
        R.Right:= ((Height * Bitmap.Width) div Bitmap.Height);
        R.Bottom:= Height;
        X:= (Width div 2) - (R.Right div 2);
        Y:= 0;
      end;
      R.Left:= 0;
      R.Top:= 0;
      B.PixelFormat:= Bitmap.PixelFormat;
      B.Width:= Width;
      B.Height:= Height;
      B.Canvas.Brush.Color:= Background;
      B.Canvas.FillRect(B.Canvas.ClipRect);
      B.Canvas.StretchDraw(R, Bitmap);
      Bitmap.Width:= Width;
      Bitmap.Height:= Height;
      Bitmap.Canvas.Brush.Color:= Background;
      Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
      Bitmap.Canvas.Draw(X, Y, B);
    finally
      B.Free;
    end;
  end;
end;

// Agregar imágenes a ImageList e incorporarlas al ComboBoxEx
procedure TForm1.FormCreate(Sender: TObject);
const
   IMG_X = 64;
   IMG_Y = 32;
var
  BM: TBitmap;
  cc: Integer;
begin
  ImageList1.Width := IMG_X;
  ImageList1.Height:= IMG_Y;
  cc:= 0;
  while not DataSet.Eof do
  begin
    BM:= TBitmap.Create;
    try
      BM.Assign(DataSet.FieldByName('CAMPO_IMAGEN')); 
      ResizeBitmap(BM, IMG_X, IMG_Y, clBtnFace);
      ImageList1.Add(BM, nil);
    finally
      BM.Free;
    end;
    ComboBoxEx1.ItemsEx.AddItem(DataSet.FieldByName('CAMPO_STRING').AsString,cc,0,0,0,nil);
    DataSet.Next;
    Inc(cc);
  end;
  ComboBoxEx1.Images:= ImageList1;
  ComboBoxEx1.ItemIndex := 0;
end;
Si guardaste las imágenes en un tamaño adecuado para ser mostradas en el combo, podes prescindir de la función ResizeBitmap.

Saludos :)

cl2raul 07-02-2014 18:17:59

1 Archivos Adjunto(s)
cuando te refieres a Windows bitmap es *.bmp, yo las que tengo son *.ico y *.png de 16x10 pixeles, me pueden servir estas?

quiero q quede mas menos como estas
http://clubdelphi.com/foros/attachme...1&d=1391794262

ecfisa 07-02-2014 22:32:16

Cita:

Empezado por cl2raul (Mensaje 472440)
cuando te refieres a Windows bitmap es *.bmp, yo las que tengo son *.ico y *.png de 16x10 pixeles, me pueden servir estas?

quiero q quede mas menos como estas
http://clubdelphi.com/foros/attachme...1&d=1391794262

Hola cl2raul.

Entonces interpreté mal tu consulta, había entendido que ya estaban incorporadas en campos de una tabla de una bd SQLite...

Entonces, en este momento ¿ Donde residen esas imágenes *.ico y *.png ? ¿ Como archivos independientes ? De ser así, vas a encontrar la respuesta leyendo este hilo desde el principio.

Saludos :)

cl2raul 12-02-2014 16:44:29

(Entonces interpreté mal tu consulta, había entendido que ya estaban incorporadas en campos de una tabla de una bd SQLite...)
-si ya estan esos campos uno con los nombres de los países y otro con las imagenes en png

(Entonces, en este momento ¿ Donde residen esas imágenes *.ico y *.png ?)
-como yo lo tenia era, una carpeta con las imagenes donde la almacenaba con el componente TImageList y con el componente TComboBoxEX almacenaba los países y les asignaba su bandera... a esto me referia como (¿ Como archivos independientes ?)

ya entiendes "ecfisa" a que me referia cuando preguntaba si era imprescindible que las imagenes fueran *.bmp

ecfisa 12-02-2014 19:56:40

Hola cl2raul.

No, no es imprescindible que el formato sea bmp; eso sí, te ahorra conversiones y además componentes como el TDBImage sólo pueden visualizar ese formato.
De todos modos te convendría unificar el formato de las imágenes, es decir, todas .bmp, .jpg, .png, ... o el que decidas. Lo podes realizar con cualquier conversor de imágenes (busca por "image converter free").

Mis preguntas iban orientadas a conocer de que forma tenías las imágenes y como deseabas que quedaran finalmente. Por que se puede cargar el TImageList desde diferentes orígenes de datos como por ejemplo: Archivos de imágenes, archivos de recurso o desde una tabla y cada para cada caso se requiere código diferente.

Y esto último es lo que todavía no me ha quedado muy claro como deseas realizarlo.

Saludos :)


La franja horaria es GMT +2. Ahora son las 00:38:17.

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