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 25-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
InsertComponent

Hola foro... mi problema es q estoy insertando desde un componente hecho por mi otros componentes de tipo TIBDataSet y TDataSource; utilizo InsertComponent para la insercion de estos en el form, pero al ejecutar la aplicacion me tira un error q dice q ya existe un componente con el nombre puesto por mi a los componentes a traves de codigo... intente con poner como parent de los componentes el form, pero me un error q dice no se encuentran las clases de los componentes insertados... q hacer???

Desde ya gracias por las sugerencias.

Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #2  
Antiguo 25-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola.

Al final quedé algo confundido... si no se encuentran las clases de los componentes insertados es que no has incluido la unidad donde están declarados en la clausula uses.

Con respecto a InsertComponent, los componentes podrán ir sin nombre, o bien has de encargarte de verificar que ningún otro componente comparta el nombre que le has asignado.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 25-06-2004
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
¿Estás seguro de estar asignando nombres distintos a las componentes?

Podría ser que tu componente asigne nombres como 'IBDataSet' y 'DataSource' de manera que al insertar una segunda componente se repiten los nombres de las componentes creadas. Recuerda que los nombres deben ser únicos independientemente de si el Parent es el formulario o no.

Aunque no sé si el problema va por ahí te comento que para manejar nombres únicos puedes hacer uso de la propiedad Designer (o DesignerHook) del formulario donde se insertan tus componentes. Designer sólo tiene sentido en tiempo de diseño y tiene el método UniqueName al que le pasas un identificador base y te regresa el mismo identificador pero con un número secuencial agregado para asegurar que se obtiene un identificador único. Por ejemplo si usas Designer.UniqueName('IBDataSet'), el valor de regreso será 'IBDataSet1', 'IBDataSet2', etc. dependiendo de si ya hay otras componentes con el nombre base 'IBDataSet'.

// Saludos
Responder Con Cita
  #4  
Antiguo 25-06-2004
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
Cita:
Empezado por jachguate
Con respecto a InsertComponent, los componentes podrán ir sin nombre
Creo que no. Es decir, si se crean componentes durante la ejecución entonces ciertamente pueden ir sin nombre; pero en este caso entiendo que las componentes se crean cuando se inserta la componente de diegofhernando, esto es, en tiempo de diseño.

// Saludos
Responder Con Cita
  #5  
Antiguo 25-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por roman
pero en este caso entiendo que las componentes se crean cuando se inserta la componente de diegofhernando, esto es, en tiempo de diseño.
Pues en realidad no está claro el asunto... asi que mejor esperemos que sea el propio diego quien lo diga.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 25-06-2004
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
Por otro lado, suponiendo que las componentes se insertan durante el diseño, pienso que el error de clase no registrada puede deberse a que al no estar siendo insertadas mediante el mecanismo normal del IDE, es decir, desde la paleta, el entorno no tiene ocasión de registrar las clases. Quizá pueda entonces solucionarlo mediante RegisterClass. De cualquier forma, cuando uno inserta una componente desde una paleta, el IDE, además de registrar la clase de la componente, añade la o las unidades pertinentes a la cláusula uses. Al no recurrise al método normal, imagino que ésto no se hará, de manera que tendrá que agregarlas a mano él mismo para que el programa pueda compilar. Creo que hay manera de que este agregado se haga en automático pero requiere más trabajo y conocimiento de la interacción de componentes con el IDE.

// Saludos
Responder Con Cita
  #7  
Antiguo 25-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
Bien... ante todo gracias por sus respuestas. La verdad es q puse dos problemas en lugar de uno; lo q sucede es q en tiempo de diseño deseo q al insertar mi componente en el form, este inserte 2 componentes; TIBDataSet y TDataSource, el primer metodo q intenté fue con el constructor de cada objeto asi:

FDataSet:= TIBDataSet.Create(FMainParent);
FDataSet.Name:= 'TPDataSet1';
FDataSource:= TDataSource.Create(FMainParent);
FDataSource.Name:= 'TPDataSource1';
FDataSource.DataSet:= FDataSet;

FMainParent, es el parent de mi componente y lo utilizo como referencia para los demas componentes.

esto funcionaba bien 'En Diseño' pero al ejecutar me daba el error q me decia q ya existia un componente con el nombre puesto 'TPDataSet1' y 'TPDataSource1'.

Decidi entonces probar con InsertComponent de la siguiente forma:

FDataSet:= TIBDataSet.Create(nil);
FDataSet.Name:= 'TPDataSet1';
FDataSource:= TDataSource.Create(nil);
FDataSource.Name:= 'TPDataSource1';
FDataSource.DataSet:= FDataSet;
with FMainParent as TForm do
begin
InsertComponent(FDataSet);
InsertComponent(FDataSource);
end;

puse nulo en los constructores por q me daba el error q ya existian los componentes al insertar en el form... pero al ejecutar da el error q no encuentra la clase TIBCustomDataSet, pero en el uses del form cuando inserto mi componente si aparace la unit... entonces no se q pueda ser...

Agradezco de nuevo su colaboracion.

Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #8  
Antiguo 26-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
No se que pretendas... pero no veo muy normal eso de insertar componentes en el parent.

Podes crear los componentes, e incluso publicarlos como propiedades de tu propio componente.

O bien, dejar que sea el programador quien los cree y vos solamente almacenar apuntadores a estos, también medinte propiedades.

Si queres mantener tu comportamiento actual, el caso de los nombres, ya te lo ha resuelto magistralmente Román, y según parece con el primer método lo único que te fallaba era eso, no?

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 26-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
OK, la verdad es q en esto de la programacion como en el amor una cosa lleva a otra y estoy lleno de codigo... me inclino por poner estos componentes como propiedades de mi componente, pero como hacerlo, es decir haciendolo, por ejemplo un TDBEdit podria usarlos en diseño... agradeceria un poco de orientacion al respecto.

Gracias.
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #10  
Antiguo 26-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Pues no lo he intentado.. pero suponiendo que publicas el DataSource en la propiedad del mismo nombre, seria tan fácil como intentar usarlo, y si algo falla, pues suponer que no se puede.

Digamos, en tiempo de diseño, asignar a edit1.datasource el valor componentediego1.datasource.

en tiempo de ejecución es seguro que no tendrias ningún problema.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 26-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
bien, muchas gracias a todos por la colaboracion, intentare y de fallar creo q voy a optar por q el programador inserte los componentes y recibirlos como propiedades dentro del mio...

Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #12  
Antiguo 26-06-2004
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
¿Por qué no nos describes un poco lo que quieres lograr?

El objetivo podría no ser tan descabellado. Por ejemplo, a mi se me ocurriría una componente TBdePack que al insertarla me inserte un DBGrid, un TTable y un TDataSource ya todos enlazados. Similarmente podría tener compontes TIbPack, TZeosPack, TAdoPack, etc. de manera que la creación de un formulario ABM sea cosa de dos click (o un doble click que no es lo mismo) y uno sólo escoge la componente adecuada según el tipo de controles BD que se requieran.

Pero creo que el mismo objetivo, suponiendo que sea similar al tuyo, puede obtenerse mejor creando expertos (wizards) que se encarguen de todos los detalles del registro de clases, uso de las unidades necesarias, etc.

Si es un tema que te interesa mucho pienso que te convendría tomarte un tiempo para comenzar a estudiar las ToolsApi y la creación de Wizards.

// Saludos
Responder Con Cita
  #13  
Antiguo 26-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
Muy bien... lo q kiero es hacer un componente estilo DBNavigator, lo cierto es q no me gusta el q trae Delphi (q raro...), ademas de q puedo personalizar un poco mas el código si lo hago yo mismo, el componente parte de un TPanel con Botones insertados cuando se crea el comp; hasta ahi todo va bien, pero se complica cuando llegue al tema de este hilo... y por ahi voy, la verdad es q kisiera q con solo insertar el componente todo estuviese listo para insertar los demas componentes... claro esta resta la insercion de los SQL's en el IBDataSet pero no todo es tan sencillo... bueno eso es lo q llevo y a donde kiero llegar, si tienen sugerencias como siempre son bienvenidas.

Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #14  
Antiguo 26-06-2004
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
El tema es complicado. Como te mencioné antes, hacer este tipo de cosas requiere de cuidar muchos detalles y entender con cierta profundidad el mecanismo del IDE.

Por ejemplo, mencionaste antes que el intento de crear el IbDataSet y el DataSource en el constructor de la componente, funcionaba bien en diseño pero te marcaba el error del nombre repetido al ejecutar. Eesto sucede por que realmente se está ejecutando el constructor de tu componente dos veces. La primera durante el diseño al insertarla en el formulario. Ahí se crean las primeras y a partir de entonces son parte del formulario y ya nada tienen que ver con tu componente. Entonces, al momento de ejecutar la aplicación se crean las copias que ya se crearon durante el diseño más las nuevas copias que se crean por el constructor que se ejecuta de tu componente al correr el programa. De alguna manera tu componente tiene que saber que ya se crearon durante el diseño y que por tanto no hay que volverlas a crear. Esto quizá puedas resloverlo con algún condicional del tipo:

Código Delphi [-]
// Si estamos en tiempo de diseño
if csDesigning in componenState then
begin
  { crear las componentes }
end;

Pero aún así no estoy seguro que funcione. Quizá la primera vez sí pero ¿qué pasa cuando cargas el proyecto en el IDE nuevamente. El IDE lee el archivo .dfm del formulario y ve que hay una de tus componentes más el IBDataSet y el DataSource que ya se crearon la primera vez. Para reconstruir el formulario debe crear nuevamente las componentes, entre ellas la tuya, que volverá a ejecutar el constructor y seguimos en diseño, así que intentará crear una vez más las otras componentes.

Ahora bien, suponte que el programador inicia un nuevo proyecto pero aún no añade los paquetes que contienen a los IBDataSets. Al insertar tu componente, ésta creará al IbDataSet pero resulta que habrá un objeto en el formulario que en realidad no "tiene derecho" a estar ahí ya que el paquete que sabe cómo lidiar con él aún no se incluye.

Quizá tu mejor apuesta por el momento sea intentar algo como lo que te comenta jachguate; crear al IbDataSet y al DataSource como subcomponetes de tu componente, es decir componentes que pertenecen no al formulario sino a tu componente. Serían componentes que no se ven en el formulario pero que puedes acceder como propiedades de tu componente.

Otra opción podría ser usar frames que puedes pensarlos como un grupo de componentes que creas de forma visual. Ahí colocarías todas las componentes que desees, lo añades al repositorio y sólo tienes que aclararle al programador que antes de utilizar el frame debe incluir los paquetes correspondientes.

Aunque no estoy seguro de que sea necesario tanto, pienso, como te dije antes, que el mejor camino- aunque quizá el más complejo - sea el de usar los Open Tools Api para crear Expertos o Wizards que se encarguen de todos. Un Expert puede interactuar con el propio IDE de Delphi añadiendo, por ejemplo, las unidades necesarias en la cláusula uses de la unidad del formulario sobre el que se esté trabajando.

// Saludos
Responder Con Cita
  #15  
Antiguo 28-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
Bien Roman ante todo muchas gracias por el interes q haz prestado a mi problema, la verdad me interesa mucho aprender ha crear los expertos, ya q creo q no va a ser la unica oportunidad q tendre este inconveniente... desafortunadamente no tengo mucha idea de como se usan y se no es problema te agradeceria q me indicaras algun sitio donde poder encontrar informacion acerca del tema... como siempre gracias.

Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #16  
Antiguo 28-06-2004
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
Desafortunadamente hay muy poca referencia a las ToolsApi y aunque la ayuda de Delphi 7 ya incluye el rubro la verdad es un poco difícil entenderle sin tener una idea previa de lo que pasa.

De las pocas referencias que he visto están

http://www.gexperts.org/opentools/
http://www.tempest-sw.com/opentools/

La segunda tiene la desventaja de estar escrita para versiones anteriores pero aún así es muy buena para darse una idea de cómo funciona el asunto.

En estos momentos es casi imposible que me dedique a esto pero en unas dos semanas espero tener un poco de tiempo para ver si preparo algún ejemplo.

// Saludos
Responder Con Cita
  #17  
Antiguo 28-06-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
ok, voy a mirar los links q me muestras... Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #18  
Antiguo 13-06-2006
chalitox chalitox is offline
Registrado
 
Registrado: jun 2006
Posts: 7
Poder: 0
chalitox Va por buen camino
Unhappy

Que tal, mi intervencion no es para aclarar, sino para oscurecer

Yo necesito agregar a un contenedor (TForm, TPanel, etc) otros componentes instanciados por mi en tiempo de ejecución. Intente con InsertComponent() pero no aparece el componente.
Este es el codigo que estoy usando:
Código Delphi [-]
procedure TForm1.JvXPButton1Click(Sender: TObject);
var
     unShape: TJvShape;
begin
   unShape := TJvShape.Create(Form1);
   unShape.Shape := stCircle;
   unShape.SetBounds(20,30,100,100);
   unShape.Visible := True;

    // una lista (TList) para retener las referencias
   shapeList.Add(unShape);

   Form1.InsertComponent(unShape);
   Form1.Refresh;
end;

Epero haber sido claro
muchas gracias
Ramiro

Última edición por chalitox fecha: 13-06-2006 a las 18:58:12.
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


La franja horaria es GMT +2. Ahora son las 00:05:15.


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