Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cargar TImage (https://www.clubdelphi.com/foros/showthread.php?t=64549)

Isuri 07-04-2009 11:10:18

Cargar TImage
 
Hola,

quiero cargar una imagen dinamicamente desde el form, ya que destruyo y vuelvo a crear la imagen varias veces.

Image1 := TJPEGImage.Create;
Image1.LoadFromFile('corazon.jpg');

no se si con esto es suficiente. tambien me gustaria posicionar la imagen donde yo quiera y darle dimensiones

gracias

dec 07-04-2009 11:25:24

Hola,

A ver si lo he entendido bien. Si lo que necesitas es mostrar una imagen en un formulario, la clase "TJPEGImage" (hasta donde yo llego) no es la adecuada, porque, no se trata de un componente, menos un componente "visual", como pueda serlo el componente "TImage". Así pues, creo que habría que usar el componente "TImage" o alguno similar.

No sé si el siguiente código hace exactamente lo que quieres: crea en tiempo de ejecución un componente "TImage", carga una imagen JPG en el mismo y luego muestra esta imagen en un formulario. Hay varias cosas a tener en cuenta en el siguiente código:

Código Delphi [-]
uses
  SysUtils, ExtCtrls, Jpeg;

procedure TForm1.Button1Click(Sender: TObject);
var
  imgPath: string;
  imgComp: TImage;
begin
  imgPath := ExtractFilePath(ParamStr(0)) + 'pompas.jpg';
  imgComp := TImage.Create(Self);
  with imgComp do begin
    Parent := Self;
    SetBounds(10, 10, 200, 200);
    Picture.LoadFromFile(imgPath);
  end;
end;

En primer lugar, las unidades a utilizar. En "ExtCtrls" encontramos la clase del componente "TImage". En "Jpeg" lo necesario para que, a la hora de cargar la imagen JPG, no nos encontremos con la excepción "EInvalidGraphic", puesto que el componente "TImage" no soporta este tipo de imágenes por sí solo. La unidad "SysUtils" nos proporciona, entre otras cosas, la función "ExtractFilePath".

Yo diría que ya está dicho todo. Tal vez pueda decirse algo sobre la instrucción "Parent := Self;". Sin esta crearíamos el componente, pero, no mostraríamos la imagen en el formulario. En efecto, es menester un "Parent" para el componente "TImage", y nosotros le damos uno con "Self" (el propio formulario "Form1"). Si acaso, para terminar, añadir que usamos el mismo formulario como "Owner" (dueño, encargado) del componente "TImage".

De este modo, cuando se destruya el formulario, automáticamente, se destruirá también el componente "TImage", es decir, que delegamos esta tarea (destruir el objeto que hemos creado) al formulario donde mostramos la imagen. Y ya está. Creo que me he enrrollado mucho, sobre todo teniendo en cuenta que he empezado con un "A ver si lo he entendido bien."... ;)

Isuri 07-04-2009 11:36:19

Mi codigo antes era:


Image1 := TImage.Create(self);
Image1.Picture.LoadFromFile('corazon.jpg');
Image1.Height := 17;
Image1.Width := 17;
Image1.Top := 32;
Image1.Left := 152;


es parecido al tuyo pero no me va, he probado con tu codigo, dec, pero sigp sin ver la imagen al ejecutar...

dec 07-04-2009 11:49:24

Hola,

El código que he puesto debería irte bien, puesto que lo he probado antes de enviarlo. ¿Qué podría "fallar"? Tal vez la versión de Delphi. Sé que la unidad "Jpeg" ya existía en Delphi 7, y, en lo demás no veo posibles problemas en este sentido. A tu código le falta al menos el "Parent". Debes darle un "Parent" al componente "TImage", tal como digo en mi anterior mensaje.

Isuri 07-04-2009 11:52:27

la version que uso es delphi 7, en la unidad jpeg va bien en esta version, ya que la he usado en otras ocasiones. no se que es lo que puede fallar pero gracias.

dec 07-04-2009 11:58:33

Hola,

Pues... del código que has mostrado últimamente, ya digo, lo único que hecho en falta es la asignación de la propiedad "Parent" del "TImage":

Código Delphi [-]
  Image1 := TImage.Create(self);
  Image1.Picture.LoadFromFile('corazon.jpg');
  Image1.Height := 17;
  Image1.Width := 17;
  Image1.Top := 32;
  Image1.Left := 152;

  // Añadir esto
  Parent := Self;

Sin embargo... veo algo extraño en el código, y es el identificador "Image1". Normalmente, estos identificadores corresponden a componentes creados en tiempo de diseño, por el propio Delphi, mediante la técnica de arrastrar un componente desde el Inspector de Objetos a un determinado formulario.

Si lo que haces es esto último, entonces no es que falte algo en tu código, sino que tal vez sobre. En efecto, no necesitas crear un componente que ha sido añadido en tiempo de diseño, porque el propio entorno se encargará de crearlo. Es decir, entonces en tu código sobraría esta instrucción:

Código Delphi [-]
Image1 := TImage.Create(self);

Ya tienes el componente en el formulario, luego, no necesitas crearlo. Dándole vueltas, creo que he pasado por alto esto de tu primer mensaje: "ya que destruyo y vuelvo a crear la imagen varias veces." Si lo que necesitas es cargar distintas imágenes en un mismo "TImage", simplemente, cárgalas, usa el "Picture.LoadFromFile()", sucesivamente, puesto que las imágenes, si no me equivoco, no se solapan, sino que la última sustituirá a la que hubiera antes.

PD. Tal vez podría añadirse algo que no parece muy evidente. Para "quitar" una imagen de un componente "Timage", no hay ningún método preparado, pero, en su lugar puede usarse algo así:

Código Delphi [-]
Image1.Picture := nil;

Esa instrucción no destruirá el objeto "TImage", de modo que podrá cargarse en el mismo una nueva imagen (o no).

Isuri 07-04-2009 12:04:40

Muchas gracias dec, no he hecho exactamente lo que tu me has dicho pero me has dado otra idea, y ya lo he arreglado.

Gracias!!

dec 07-04-2009 12:17:03

Hola,

Hombre, ¡pero dí que has hecho! Igual resulta interesante. ;)

Isuri 07-04-2009 12:56:06

Es que no se como no se me ha ocurrido antes, sin mas, en un momento dado queria que no se viera esa imagen, y mas tarde que se volviera a ver. al principio he optado x la idea de destruir y volver a crear la imagen, en eso tenia el problema, en crearla en tiempo de ejecucion. pero es tonteria hacer esto, teniendo la propiedad 'visible'; por lo que lo unico que he hecho ha sido poner visible a false o true, y la imagen la he creado en tiempo de diseño.

gracias x todo dec!!

dec 07-04-2009 13:08:06

Hola,

Pues sí, ahí estaba otra solución. ;)


La franja horaria es GMT +2. Ahora son las 03:31:38.

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