PDA

Ver la Versión Completa : Crear instancias de objetos creados con TPanel


Kandorf
26-02-2010, 12:13:38
Hola, no sé si me he explicado muy bien, no sabía hacerlo mejor.

Quiero mostrar información de una determinada forma: una imagen y un texto (una portada de una película y un título, respectivamente), para ello en un formulario (lo he llamado FrmObjetosCTP) he creado un panel que contiene un TPanel (llamado PnlPrevPelícula) y dentro de este hay un TImage y un TLabel.
Ahora lo que me gustaría es, desde otro formulario, crear múltiples instancias de este panel para poder mostrar este tipo de información todas las veces que sea necesario.

Quizá no sea la manera de hacerlo, nunca antes había intentado hacer algo así.

He intentado crearlo dentro de un TScrollBox (ScBPelículasAbiertas) mediante este código, pero no funciona:

FrmObjetosCTP.PnlPrevPelícula.Create(ScBPelículasAbiertas);
También lo he intentado creando una variable intermedia:
var
NuevaPev: TPanel;
begin
PnlPelículasAbiertas.Visible:=True;
NuevaPev:=PnlNuevaPelícula.Create(ScBPelículasAbiertas);
end;Me he dado cuenta de que PnlPrevPelícula es un objeto y no una clase, así que supongo que ese es el problema.

También quería hacer con estas una lista doblemente enlazada para poder hacer referencia entre ellas y poder eliminarlas cuando fuera necesario, pero no sé cómo crear variables ligadas a este objeto, ya que lo que he creado no es en realidad una clase, creo que me queda mucho que aprender en este tema.

Un saludo y gracias por vuestro tiempo.

Ñuño Martínez
26-02-2010, 12:23:14
Si te he entendido bien, deberías utilizar un "marco" (TFrame). Los TFrame son como los TForm, la diferencia está en que los marcos los puedes crear dentro de otro marco o de una ventana, o incluso dentro de un TScrollBox.

Kandorf
26-02-2010, 12:48:00
Creo que sí es eso lo que busco, lo estoy intentando, pero al crearlo no me aparece, he intentado también crearlo en un formulario nuevo, por si acaso era problema de crearlo dentro del ScrollBox, con este código;

var
NuevaPrev: TObjPrevPelicula;
begin
NuevaPrev:=TObjPrevPelicula.Create(Self);
end;

La primera vez lo crea (pero no se ve), la segunda vez que se llama a la función dice que ya existe un objeto con ese nombre.

Gracias por la respuesta tan rápida.

Ñuño Martínez
26-02-2010, 13:01:47
Quizá estás olvidandote de asignar el contenedor (Owner) del objeto. Prueba esto:
var
NuevaPrev: TObjPrevPelicula;
begin
NuevaPrev:=TObjPrevPelicula.Create(Self);
NuevaPrev.Owner := SELF;
end;

Estoy suponiendo que TObjPrevPelicula es un componente visual y que SELF es una ventana TForm. Si el contenedor no es la ventana, entonces debes asignar al Owner el objeto que sea (por ejemplo un panel, el ScrollBox, etc).

Kandorf
26-02-2010, 14:15:52
Puede ser que sea eso, pero me da error al compilar, dice que la propiedad Owner es de sólo lectura...

DarkMan
26-02-2010, 14:50:01
La propiedad owner la estas especificando en la creación del componente:
NuevaPrev:=TObjPrevPelicula.Create(Self);
El único parámetro de Create en los objetos visuales es owner.

Me he dado cuenta de que PnlPrevPelícula es un objeto y no una clase"
En delphi, los objetos son considerados la clase mínima, por lo que todas las clases son objetos o derivan de ellos.

Tal vez deberías jugar con el parámetro "Parent" que es en el que puedes especificar la ventana padre del componente. Esta propiedad no es de solo lectura, por lo que puedes cambiarla en el momento que tu quieras.

Para encapsular los tres componentes dentro de un TPanel, tal vez deberías crear una clase o componente secundario derivado de TPanel conteniendo dichos componentes dentro.
No puedes usar el TPanel creado en un TForm, ya que los objetos que hay dentro del TPanel están definidos dentro de la clase TForm y no de la clase TPanel.

Un saludo.

Caro
26-02-2010, 15:43:58
La primera vez lo crea (pero no se ve)

Hola Kandorf, es porque debes asignarle un Parent como te han indicado, en tu caso el Parent sería el ScrollBox.

la segunda vez que se llama a la función dice que ya existe un objeto con ese nombre.


Esto es porque tampoco le estas asignando un nombre unico a cada instancia, para dejar que delphi te ponga los nombres, en su propiedad name le asignas vacio (''), si quieres ponerle tu los nombres puedes utilizar un contador e ir concatenando cada ves que crees un nuevo Frame.


var
NuevaPrev: TObjPrevPelicula;
begin
NuevaPrev := TObjPrevPelicula.Create(Self);
NuevaPrev.Name := '';
NuevaPrev.Parent := ScrollBox1;
NuevaPrev.Top := aTop;
Inc(aTop, 100);
end;


aTop lo inicializas en 0.

Saluditos

Kandorf
27-02-2010, 02:41:19
Sois la leche! Funciona todo perfectamente, era cosa el Parent, gracias también por todos vuestros consejos, por vuestra rapidez y por entendernos aunque nos expresemos a nuestra manera ^^

Saludos.

Ñuño Martínez
02-03-2010, 08:43:56
Puede ser que sea eso, pero me da error al compilar, dice que la propiedad Owner es de sólo lectura...

¡Ooops! Vaya despiste.:o Quise decir "Parent". Eso. Bueno, ya te lo han explicado y lo has solucionado, así que ya lo sabes.:D