Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Componente En Tiempo De Ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=54707)

grandmasterdari 27-03-2008 23:54:24

Componente En Tiempo De Ejecucion
 
crear un boton en tiempo de ejecucion es facil, pero, ahora si queremos hacer 121 botones en tiempo de ejecucion, y que estos tenga un comportamiento identico al hacerle click no es tan facil
Este es el problema, necesito crear 121 botones que respondan al evento "onmouseclick", "onmouseenter", por lo tanto voy a tener que crear una nueva clase donde esten definido dichos eventos, mi nueva clase se va a llamar TButton1 que hereda de TButton asi ahorrandome definir los 242 eventos, el problema es que, formulario no me envia los eventos a mis objetos. Busque codigo de ejemplo por todos lados, pero no encontre, me gustaria saber si alguien conoce algun link donde tenga el codigo de ejemplo

eduarcol 28-03-2008 00:56:16

pero sabes de eso de definir clases? o simplemente lo estas aprendiendo, lo digo porq si declaras mal los eventos que quieres modificar no vas a poder, si muestras la forma como la haces seguro alguien encuentra el fallo

keyboy 28-03-2008 00:59:26

No necesitas definir 121 eventos, basta asignar el mismo a los 121 botones:

Código Delphi [-]
for I := 0 to 120
  Botones[i].OnClick := BotonClick;

donde Botones puede ser un arreglo dinámico de TButton. Lo de la clase está bien, pero te comento lo anterior en caso de que quieras reconsiderarlo.

Bye

grandmasterdari 28-03-2008 01:03:19

Aclaracion 01
 
tienes razon, no queria meter el codigo porque es c++ y no quiero asustar pero un ejemplo en delphi me viene bien

este es el archivo de cabecera (.h)
Código:

//---------------------------------------------------------------------------

#ifndef Image1H
#define Image1H
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TImage1 : public TImage
{
private:
protected:
public:
    __fastcall TImage1(TComponent* Owner);
__published:
//aqui van mis supuestos eventos personalizado (definicion)
    void __fastcall Image1MouseEnter(TObject *Sender);
    void __fastcall Image1Click(TObject *Sender);
};
//---------------------------------------------------------------------------
#endif

este es el codigo (.cpp)
Código:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Image1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TImage1 *)
{
    new TImage1(NULL);
}
//---------------------------------------------------------------------------
__fastcall TImage1::TImage1(TComponent* Owner)
    : TImage(Owner)
{
}
//---------------------------------------------------------------------------
namespace Image1
{
    void __fastcall PACKAGE Register()
    {
        TComponentClass classes[1] = {__classid(TImage1)};
        RegisterComponents("Standard", classes, 0);
    }
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//aquie van la implementacion de mis eventos (no creo que sea asi)

void __fastcall TImage1::Image1MouseEnter(TObject *Sender)
{
    this->Visible=false;
}
void __fastcall TImage1::Image1Click(TObject *Sender)
{
    this->Visible=false;
}

este codigo aparece por defecto, excepto los metodos "image1mouseenter e image1click" que fueron creados por mi como un intento de implementacion de eventos personalizados

despues de crear mi nueva clase, debo llamarla desde otro lado, la instancio de esta forma

Código:

    TImage1 *temp= new TImage1(Owner);//tambien coloque como parametro Form1, Application y no vi cambios
// ahora modifico los atritutos para acomodar
    temp->Left=2;
    temp->Top=2;
    temp->Picture->LoadFromFile("00060001.BMP");
    temp->Width=200;
    temp->Height=200;
    temp->Parent=Form1; // indica que form1 es el padre, y hace que temp se vuelva visible

espero que sirva

grandmasterdari 28-03-2008 01:21:26

Aclaracion 02
 
KeyBoy tiene razon, le asigno un property donde escribo lo que quiero que haga, pero el problema esta en que el formulario no me pasa el evento porque en el momento de compilacion no estan los objetos implementados ni definidos, por lo tanto, si hago click en el objeto 98 este se tiene que hacer invisible, pero para eso form me debe pasar el evento a ese objeto, el cual este reaccionara con el property definido por mi, dentro del property va un
this->visible=false;
o
this.visible:=false;

keyboy 28-03-2008 01:35:18

No entiendo. Disculpa que escriba en delphi pero me marea C :)

Tú puedes definir el evento en tu formulario:

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

implementation

procedure TForm1.ImageClick(Sender: TObject);
begin
  (Sender as TImage).Visible := false;
end;

Y es éste el evento que asignas en la ejecución. Dado que Sender es el control que genera el evento, equivale al this (Self en delphi) de tu clase.

Bye

grandmasterdari 28-03-2008 01:55:10

cerca
 
keyboy estoy viendo el equivalente de
(Sender as TImage)

parece que estamos cerca, dentro de un rato doy la solucion (gracias a keyboy)
o sigo con las preguntas

keyboy 28-03-2008 02:00:45

Quizá me equivoco, pero creo que el equivalente al operador as en C++ Builder es algo que se llama dynamic typecasting.

Bye

keyboy 28-03-2008 02:04:59

Checa este artículo de Brian Long. Ahí explica la equivalencia del as de delphi en C++ Builder.

Bye

grandmasterdari 28-03-2008 02:33:18

Solucionado
 
Mi codigo de fuente primitivo (porque el programa final es el juego de encerrar al gato, proyecto de la materia gestion de datos -UTN)
juego

codigo de fuente:
http://rapidshare.com/files/102919304/enc_gato.rar.html

captura del programa (al hacer click sobre cualquier imagen esta se hace invisible)


el problema estaba en que yo definia los eventos en la nueva clase creada, cuando en realidad tenia ke definier el evento en el formulario (o en el objeto contenedor, esta vez era el formulario) y despues cuando lo creo en forma dinamica asignar al evento de mi objeto instanciado el evento que he creado en el formulario contenedor

cosas a tener en cuenta.

al crear dinamicamente debo hacer lo siguiente
(temp es mi ojeto creado)
temp->Parent=Form1; //asignar un objeto contenedor, es necesario para que temp pueda verse
temp->OnClick = ImagenClick;//asignacion del evento (gracias keyboy, tu ayuda no solo soluciona los problemas sino suben la moral en el momento de desarrollo, uno no se siente tan solo)

y definir en el formulario contenedor el efento ImagenClick (nombrado a discresion)
en el archivo cabecera de la forma:
Código:

        void __fastcall ImagenClick(TObject *Sender); (dentro de __published)
y en el archivo cpp la implementacion
Código:

void __fastcall TForm1::ImagenClick(TObject *Sender)
{
        TImage *Aux_Ima = (TImage *)(Sender);
        Aux_Ima->Visible=false;
}

donde necesitamos crear un objeto de la misma clase en forma temporal para poder hacer referencia
al que sender nos envia

la ayuda de keyboy me hizo caer en esta pagina que es la fuente y soluciono el problema porque la verdad que no tenia idea para que servia ese tal "sender"
FUENTE

waly2k1 30-04-2008 08:54:24

Otra duda similar
 
Tengo 65 Labels
y dos botones, uno seleccionar todos y el otro ninguno
como accedo en un for a cada label para cambiar el color?

lblBarcode01.Color := $00549CCD; // todos
lblBarcode01.Color := $00F4F4F4; // Ninguno

Vi otros hilos pero tratan con propiedades dinamicas o valores y no con objetos como en este caso. La solución por el momento fue 130 lineas demás hehe, pero bueh...

Saludos y gracias!

Lepe 30-04-2008 11:53:02

jop :eek:

Código Delphi [-]
for i:= 0 to Form1.ComponentCount-1 do
if Component[i] is TLabel then 
with TLabel(component[i]) do
 if todos then
    Color :=  $00549CCD // todos
  else
    Color := $00F4F4F4; // Ninguno

Saludos

Dedalo 30-04-2008 13:14:31

Yo me hice un componente TTeclado, que es un teclado completo para una aplicacion que hice hace ya varios años. Lo que hice fue crear un array de TButton y unas const que guardaban la posicion, el tamaño y la posicion de las teclas, en tiempo de ejecucion, en el evento OnCreate el propio teclado generaba los botones de las teclas, les asignaba los eventes OnPress, OnMouseenter, etc. Te puedo pasar el componente completo cuando lo encuentre...

grandmasterdari 30-04-2008 14:36:05

Aclaracion 0 :S me perdi
 
me equivoque de hilo, sory..

Raiza 30-04-2008 18:11:46

Cita:

Empezado por grandmasterdari (Mensaje 275841)
crear un boton en tiempo de ejecucion es facil, pero, ahora si queremos hacer 121 botones en tiempo de ejecucion, y que estos tenga un comportamiento identico al hacerle click no es tan facil
Este es el problema, necesito crear 121 botones que respondan al evento "onmouseclick", "onmouseenter", por lo tanto voy a tener que crear una nueva clase donde esten definido dichos eventos, mi nueva clase se va a llamar TButton1 que hereda de TButton asi ahorrandome definir los 242 eventos, el problema es que, formulario no me envia los eventos a mis objetos. Busque codigo de ejemplo por todos lados, pero no encontre, me gustaria saber si alguien conoce algun link donde tenga el codigo de ejemplo

Hola amigo necesito informacion sobre componente

Lepe 30-04-2008 20:02:43

uff, que lío. Entre que uno edita y borra el contenido, gente nueva preguntando... ya no sé ni lo que se pregunta.

waly2k1 espero que ese código te sirva de algo, si no, pregunta de nuevo.

Raiza ¿puedes explicar más detalladamente lo que necesitas?
Porque crear 100 o 300 botones y que hagan exactamente lo mismo no es tan complejo (aunque puede llegar a serlo ;)).

Un ejemplo:
Código Delphi [-]
procedure TForm1.HaciendoClick(Sender:TObject);
begin 
  Showmessage('hecho clic en un botón');
end;

procedure TForm1.Button1Click(Sender:TObject);
var i:integer;
begin 
  for i:= 0 to 5 do
  With Tbutton.Create(Self) do
  begin 
      SetBound(0, i*10, 50,50);
     Parent := self;
     OnClick := HaciendoClick; // asignar el evento.
  end;
end;
Bastaría definirse varios eventos de tipo onmouseDown, onEnter, etc y después asignarlo por código.


Saludos

Raiza 30-04-2008 20:18:17

componente
 
Lo que necesito es que signica cada componente, cual es su empleo en el formulario y para que se utiliza en la programacion a dime si ay una opcion de como darle color al boton

waly2k1 30-04-2008 22:04:09

Agradecido...
 
Lepe a mi me vino perfecto el código posteado y la sencillez del mismo,
funciona todo a la perfección.

Muchas gracias como siempre.

Delphius 01-05-2008 03:17:02

Cita:

Empezado por Raiza (Mensaje 283545)
Lo que necesito es que signica cada componente, cual es su empleo en el formulario y para que se utiliza en la programacion a dime si ay una opcion de como darle color al boton

Hola Raiza,
Por favor respeta el tema del hilo lo que tu estás buscando no viene con la temática tratada en este hilo, veo que eres nuevo/a en clubdelphi. Aprovecho este post para hacerte conocer que existe una guia de estilo (normas). Por favor tomate unos minutos para leerla.

Con respecto a tu problema, se resuelve de una manera muy simple: dandole F1 (ayuda) a cada componente.
Selecciona el componente que deseas estudiar y presiona F1. La ayuda describe cada propiedad y evento que posee.

Por lo que preguntas puedo deducir que eres iniciado en Delphi y/o programación. Para ello sugiero que visites la sección FTP y Wiki, allí encontrarás material de ejemplo y de estudio (manuales, tutoriales, etc).

No se puede cambiar el color a un TButton. Para ello hay dos alternativas básicas:
1. Simular un TButton mediante un TPanel.
2. Usar un componente de terceros.

Saludos,

Raiza 02-05-2008 18:58:33

amigo
 
solo necesitaba informacion para inpartir un contenido que tengo que dar de programacion visual pese que tu podia ayudarme gracias chao


La franja horaria es GMT +2. Ahora son las 23:16: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