Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Crear evento a un componente creado en ejecución

Hola compañeros, vengo con esta pequeña duda, estoy creando componentes en tiempo de ejecución, ¿existe alguna forma de crearle un evento como OnClick y llamarlo?.

Saludos.

EDITO: se me olvidó el código:

Código Delphi [-]
constructor TPanel1.Create(aOwner: TComponent);
begin
   inherited;
   with TLabel.Create(aOwner) do
   begin
      Parent := Self;
      Caption := ID;
      Font.Name := 'Tahoma';
      Font.Size := 8;
      Font.Color := clBlack;
      Top := 0;
   end;
   with TLabel.Create(aOwner) do
   begin
      Parent := Self;
      Caption := AUTOR;
      Top := 30;
   end;
   with TImage.Create(aOwner) do
   begin
      Parent := Self;
      Align := alClient;
      Picture.LoadFromFile(FOTO);
      Stretch := True;
   end;
   Width := 200;
   Height := 200;
end;
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.

Última edición por enecumene fecha: 04-10-2008 a las 00:17:33.
Responder Con Cita
  #2  
Antiguo 04-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues sí claro,

Código Delphi [-]
TuComponente.OnClick := ComponenteClick;

donde ComponenteClick es un método que tú defines explícitamente:

Código Delphi [-]
TForm1 = class(TForm)
private
  procedure ComponentClick(Sender: TObject);
end;

// Saludos
Responder Con Cita
  #3  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Gracias Roman, justamente estaba probando este método que comentas, en unos minutos te comento como me va.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #4  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Bueno volví rápido, me entró una duda, por ejemplo, en este pedazo de código donde se crea el componente TImage bajo TPanel1:

Código Delphi [-]
constructor TPanel1.Create(aOwner: TComponent);
begin
   inherited;
   with TLabel.Create(aOwner) do
   begin
      Parent := Self;
      Caption := ID;
      Font.Name := 'Tahoma';
      Font.Size := 8;
      Font.Color := clBlack;
      Top := 0;
   end;
   with TLabel.Create(aOwner) do
   begin
      Parent := Self;
      Caption := AUTOR;
      Top := 30;
   end;
   with TImage.Create(aOwner) do
   begin
      Parent := Self;
      Align := alClient;
      Picture.LoadFromFile(FOTO);
      Stretch := True;
      Onclick := Click;
   end;
   Width := 200;
   Height := 200;
end;

¿El procedure lo creo fuera del constructor o dentro o entre begin...end del Timage?, disculpa mi ignorancia.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #5  
Antiguo 04-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Recuerda que Delphi no es un lenguaje de esos interpretados que hay por ahí No puedes crear funciones durante la ejecución. El evento debes declararlo como te comenté anteriormente, en la declaración del formulario, e implementarlo en la zona interface.

// Saludos
Responder Con Cita
  #6  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Gracias Roman, pero ahora tengo otro problema, dentro del panel se crean dos labels (TLabel), y ahora no logro llamar el caption de uno específico :

Código Delphi [-]
procedure TFMain.Click(Sender: TObject);
begin
  Panel2.Caption := ???;
end;

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #7  
Antiguo 04-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Oh! Disculpa. No había visto que está definiendo tu propio componente. El método debes definirlo en la declaración de TPanel1 e implementarlo en la zona implementation de ese mismo componente:

Código Delphi [-]
interface

type
  TPanel1 = class(TPanel)
  private
    procedure Click(Sender: TObject)
  end;

implementation

procedure TPanel1.Click(Sender: TObject)

end.

// Saludos
Responder Con Cita
  #8  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Disculpa roman, como estoy creando un Timage dentro del TPanel que lo cubre por completo, ¿al dar click funciona el procedimiento aunque la imagen esté encima? .

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #9  
Antiguo 04-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Como que ya no esstoy entendiendo. ¿De qué va el componente? Si es un panel y dentro hay un Image que abarca todo entonces estamos hablando del click de la imágen y ésa es la que va a responder.

// Saludos
Responder Con Cita
  #10  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Como que ya no esstoy entendiendo. ¿De qué va el componente? Si es un panel y dentro hay un Image que abarca todo entonces estamos hablando del click de la imágen y ésa es la que va a responder.

// Saludos
Es lo que estoy tratando de explicar, ¿cómo le creo el procedure para ese Timage que se crea dentro Tpanel?, ya el evento sé como llamarlo, ahora, dentro del procedure quiero llamar el caption de uno de los labels que se crea que es otra duda que tengo.

Saludos.

PD. Post #6
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #11  
Antiguo 04-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
enecumene eso ¿no debería ser un Frame en lugar de un panel?

Según veo tienes un ID, un autor y la foto, pues eso es un frame, con dos labels y un Image colocados en tiempo de diseño, asignas sus eventos y listo.

Cuando quieras crear varios:
Código Delphi [-]
uses MiFrame;

procedure TForm1.CreaFrame;
var
    uno, dos : TMiFrame;
begin 
  uno := TMiFrame.Create(self);
  uno.labelID.Caption := ' 0001';
  uno.labelAutor.Caption := 'autor 1';
  uno.image1.loadFromFile('c:\mifoto.jpg');
  uno.top := 0;

  dos := TMiFrame.Create(self);
  dos.labelID.Caption := ' 0002';
  dos.labelAutor.Caption := 'autor 2';
  dos.image1.loadFromFile('c:\mifoto.jpg');
  dos.top := uno.top + uno.height+5;

Lo he puesto así por claridad, se puede mejorar aun más. Si quieres más info, avisa. En el FTP tienes el ejemplo "crear calendario dinamico con frames", quizás te sirva.

Que conste que lo que estás haciendo se puede hacer, pero el Frame creo que puede facilitarte las cosas.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 04-10-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Para poder usar las etiquetas y la imagen, necesitas crear las variables que van a servir de referencia:

Código Delphi [-]
type
  TPanel1 = class(TPanel)
  private
    FLabe1: TLabel;
    FLabe2: TLabel;
    FImage: TImage;

    procedure Click(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

constructor TPanel1.Create(aOwner: TComponent);
begin
  inherited;
  FLabel1 := TLabel.Create(nil);
  with FLabel1 do
  begin
     Parent := Self;
     Caption := ID;
     Font.Name := 'Tahoma';
     Font.Size := 8;
     Font.Color := clBlack;
     Top := 0;
  end;
  FLabel2 := TLabel.Create(nil);
  with FLabel2 do
  begin
     Parent := Self;
     Caption := AUTOR;
     Top := 30;
  end;
  FImage := TImage.Create(nil);
  with FImage do
  begin
     Parent := Self;
     Align := alClient;
     Picture.LoadFromFile(FOTO);
     Stretch := True;
     Onclick := Click;
  end;
  Width := 200;
  Height := 200;
end;

destructor TPanel1.Destroy;
begin
  FLabel1.Free;
  FLabel2.Free;
  FImage.Free;
  inherited
end;

De esta forma ya podrás hacer referencia a la etiqueta que quieras y a la imagen...


Saludos...
Responder Con Cita
  #13  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Vale gracias Lepe, trataré de aplicar eso que comentas con los frames, miren un ejemplo de lo que estoy haciendo (estoy haciendo una vellonera para fines personales y de aprendizaje):

http://img118.imageshack.us/my.php?i...lloneraio1.jpg

Eso lo hice con un scrollbox y los panels creado en tiempo de ejecución sacando las imagenes y la información desde la BD con un while. Si con los frames es más fácil pues ahí voy.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #14  
Antiguo 04-10-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Veo que quieres hacer referencia a las propiedades desde fuera del componente, o sea, cuando este se encuentra en una forma.

Para esto puedes crear propiedades en tu TPanel1 que hagan referencia a las propiedades de los componentes internos:

Código Delphi [-]
type
  TPanel1 = class(TPanel)
  private
    function GetCaption: string;
    procedure SetCaption(const Value: string);
  published
    property CaptionLabel1: string read GetCaption write SetCaption;
  end;

implementation

function TPanel1.GetCaption: string;
begin
  Result := FLabel1.Caption
end;

procedure TPanel1.SetCaption(const Value: string);
begin
  FLabel1.Caption := Value
end;

De esta forma ya puedes hacer algo como:

Código Delphi [-]
procedure TMainForm.Create(Sender: TObject);
begin
  APanel.CaptionLabel1 := 'Hola mundo';
end;

Saludos...

Última edición por maeyanes fecha: 04-10-2008 a las 02:15:46.
Responder Con Cita
  #15  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Aplicando la opción de Lepe, hice lo siguiente:

Código Delphi [-]
procedure TFMain.FormCreate(Sender: TObject);
begin
ZCanciones.Open;
ZCanciones.First;
   While Not ZCanciones.Eof do
   begin
      with TFrame1.Create(Application) do
       begin
        MuID.Caption := ZCancionesMA_ID.AsString;
        MuArtista.Caption := ZCancionesARTISTA.AsString+' - '+ZCancionesALBUM.AsString;
        Image1.Picture.LoadFromFile(ZCancionesIMAGEN.AsString);
        Parent := SCrollBox1;
        Left := 2 + (Width * (ScrollBox1.ControlCount - 1));
        Top  := 0;
       end;
       ZCanciones.Next;
  end;
end;

Problema:

Cita:
---------------------------
Debugger Exception Notification
---------------------------
Project Vellonera.exe raised exception class EComponentError with message 'A component named Frame1 already exists'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
¿Cómo resuelvo esto ?

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #16  
Antiguo 04-10-2008
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
bueno amigo enecumene, independintemente de si lo haces con Frames o Paneles, creo que debes aclarar un poco mas el tema de donde y por que se crea este evento y como funciona...

Si buscas en la ayuda, verás que el evento OnClick está definido como una propiedad (Property) dentro de la mayoria de objetos visuales (¿o todos?)

Código Delphi [-]
  Property OnClick:TNotifyEvent;

entonces Onclick es una variable (puntero) que referencia a un procedimiento... Pero atención no es cualquier procedimiento..!!! es uno especial definido como un tipo asi:

Código Delphi [-]
type TNotifyEvent = procedure (Sender: TObject) of object;

Esto quiere decir que el tipo TNotifyevent es un tipo de procedimiento que debe estar definido dentro de una clase (De ahi el of Object)


Entonces... tu puedes definir tu procedimiento dentro de cualquier clase que tengas en esta u otra unidad... lo mas comun es hacerlo dentro del Tform

Código Delphi [-]
TForm1 =class(Tform)
public
  procedure MyOnClick (Sender: TObject);
end; //de la clase formulario

//Pero tambien puedes hacerlo en cualquier otro objeto, asi

TMyPanelPersonalizado = class(Tpanel)
Public
  procedure MyOnClick (Sender: TObject);
end; //de la clase panel

TunaOtraClaseDePanel=class(TPanel)
public
  //un panel normalito...
end; //

La implementación, la debes hacer (Obviamente en la seccion implementation)

De la siguiente Manera:

Código Delphi [-]
Procedure TForm1.MyOnClick(Sender:TObject);
Begin
  //
end;

Procedure TMyPanelPersonalizado.MyOnClick(Sender:TObject);
Begin
  //
end;


ahora, puedes comenzar a asignarle tus eventos Onclick al objeto que quiereas..!!!

Aunque aqui tengo una duda y por favor me corrigen....creo que no puedes asignarselo a la misma clase donde fue definida... es decir, en el caso de

Código Delphi [-]
TMyPanelPersonalizado = class(Tpanel)
Public
  procedure MyOnClick (Sender: TObject);
end; //de la clase panel

No podrias hacer esto

Código Delphi [-]
Constructor TMyPanelPersonalizado.Create;
Begin
   ...
  {Self.}OnClick:={Self.}MyOnClick;
end;


Pero si puedes hacer esto:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
Begin
   //Objetos creados en tiempo de diseño:
   Label1.OnClick:=MyOnclick; //Asigan el onclik definido en TForm1
   Panel1.OnClick:=MyOnClick; //Asigan el onclik definido en TForm1

//Objeto Creado dinamicamente:

  with TMiPanelpersonalizado.Create(...) do
  begin
     Parent := Self; //Self aqui es el TForm
     Align := alClient;
     Onclick := MyClick; //¿Cual Onclick ?... pues el de Tform... 
                               //por que estamos dentro del procedimiento
                              //OnCreate del tForm
  end;//
end;


En tu caso definiste el evento en el Tpanel1 y se lo asignaste a tu imagen en el evento OnCreate del Panel....

como todos los objetos referncian al mismo evento onclick, entonces los puedes diferenciar mmediante el sender...

El sender, en este y todos los objetos es la instancia que dispara el evento... y puedes difernciar tus objetos asi:

Código Delphi [-]
Procedure TForm1.MyOnClick(Sender:TObject);
Begin
   if Sender is tLabel then
      (Sender as Tlabel).Captio:='Hola';

   if Sender is TMyPanelPersonalizado then
     (sender as TPanelPersonalizado).Caption:='Otra cosa....'

// o si implementaste una diferenciación por tags, u otra propiedad puedes manejarla tambien...

 if Sender.Name='TLabel1' then
   showMessage('Pinchaste el Label1');

end;


Saludos....
Responder Con Cita
  #17  
Antiguo 04-10-2008
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
El problema está en que cuando creas tus frames en forma dinámica, por defecto siempre seestá creando con el mismo nombre de componente.... FRAME1...

Debes asiganarle un nombre específico..

Código Delphi [-]
procedure TFMain.FormCreate(Sender: TObject);
begin
ZCanciones.Open;
ZCanciones.First;
   While Not ZCanciones.Eof do
   begin
      with TFrame1.Create(Application) do
       begin
        //Por ejemplo
        Name:='FRAME_'+ZCancionesMA_ID.AsString;
        MuID.Caption := ZCancionesMA_ID.AsString;
        MuArtista.Caption := ZCancionesARTISTA.AsString+' - '+ZCancionesALBUM.AsString;
        Image1.Picture.LoadFromFile(ZCancionesIMAGEN.AsString);
        Parent := SCrollBox1;
        Left := 2 + (Width * (ScrollBox1.ControlCount - 1));
        Top  := 0;
       end;
       ZCanciones.Next;
  end;
end;
Responder Con Cita
  #18  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
¡Muchas gracias Gatosoft!, era lo que me faltaba, me funcionó de pelos, opté por la opción de Lepe, no se me hubiese ocurrido pues nunca he trabajado con frames, ahora lo usaré con más frecuencia.

Saludos y gracias a todos .
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #19  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Saludos compañeros, aprovechando el hilo se me presentado un problemilla y es como eliminar los frames creados en tiempo de ejecución que están dentro de un scrollbox, hice lo siguiente:
Código Delphi [-]
procedure TFShowgen.Button3Click(Sender: TObject);
var I: Integer;
begin
for I := 0 to FMain.ScrollBox1.ComponentCount - 1 do begin
//destruye los componentes creados
FMain.ScrollBox1.Components[i].Destroy;
//
end;
FMain.ZCanciones.Close;
FMain.ZCanciones.ParamByName('ID').Value := 2;
FMain.ZCanciones.Open;
FMain.ZCanciones.First;
   While Not FMain.ZCanciones.Eof do
   begin
      with TFrame1.Create(Application) do
       begin
        Name := 'F_'+FMain.ZCancionesMA_ID.AsString;
        MuID.Caption := FMain.ZCancionesMA_ID.AsString;
        MuArtista.Caption := FMain.ZCancionesARTISTA.AsString+' - '+FMain.ZCancionesALBUM.AsString;
        Image1.Picture.LoadFromFile(FMain.ZCancionesIMAGEN.AsString);
        Parent := FMain.SCrollBox1;
        Left := 2 + (Width * (FMain.ScrollBox1.ControlCount - 1));
        Top  := 0;
       end;
       FMain.ZCanciones.Next;
  end;
end;

Pero no me funcionó, ¿alguien me da una mano?.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #20  
Antiguo 04-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Intenté este otro código aún no me funciona:
Código Delphi [-]
for I := 0 to FMain.ComponentCount - 1 do begin
//destruye los componentes creados
if FMain.Components[i] is TFrame1 then
    TFrame1(FMain.Components[i]).Destroy;
//

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como crear un boton en ejecucion y ponerle un evento jeremiselxi Varios 6 24-09-2008 20:34:40
Como saber si me frame esta creado en cierto evento? Albano OOP 2 15-03-2007 23:13:44
ayuda con boton creado dinamicamente y sus evento cureham OOP 1 13-09-2006 09:39:14
Crear componente Image en tiempo d Ejecucion Jessica666 Gráficos 6 30-05-2004 01:58:22
asignar evento a control creado dinamicamente jorgeganc Varios 4 17-12-2003 02:47:51


La franja horaria es GMT +2. Ahora son las 05:43:33.


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
Copyright 1996-2007 Club Delphi