![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
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. |
|
#2
|
||||
|
||||
|
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 |
|
#3
|
||||
|
||||
|
Cita:
// Saludos |
|
#4
|
||||
|
||||
|
Cita:
Hasta luego. ![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
#5
|
||||
|
||||
|
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 |
|
#6
|
||||
|
||||
|
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. |
|
#7
|
||||
|
||||
|
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 |
|
#8
|
||||
|
||||
|
¿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 |
![]() |
|
|
|