Ver Mensaje Individual
  #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
Reputación: 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