PDA

Ver la Versión Completa : Componente que conecta con una BD en tiempo de diseño


Mendizabal
23-01-2015, 09:47:03
Buenas a todos,
Antes que nada disculparme por el título. No he encontrado una forma mejor de expresarlo. Tampoco sé si en el foro existen otros temas que respondan a mi pregunta. Los he buscado, pero no he sabido encontrarlos.
En fin, al lío. Estoy programando un componente para delphi XE6 con una propiedad publicada que debería mostrar una lista de valores recuperados de una base de datos (SQL Server 2012, por más datos). El problema que me estoy encontrando es a la hora de conectarme a un base de datos en tiempo de diseño (para recuperar los valores con los que llenaré el combo box). Es decir, mi componente tiene una propiedad (idioma, en este caso. Pero es lo de menos), cuyos valores dependen de una tabla en mi DB.

La cadena de conexión la recuperará de un componente externo (mediante una propiedad). En mi caso la recuperará de un TADOConnection que escogerá el usuario. Hasta ahí la cosa es fácil. A partir de ahí, creo un objeto tipo TADOQuery dentro de mi componente, llamo a su constructor, le declaro sus propiedades (incluida la consulta SQL), y realizo la consulta. No funciona. De hecho me cuelga el IDE. Y lo peor es que no puedo / no sé debugar en tiempo de diseño.

Como veis soy muy novato con el tema de crear componentes. Así que cualquier pista será bienvenida.

Saludos.

Casimiro Notevi
23-01-2015, 10:29:10
En nuestro FTP (http://terawiki.clubdelphi.com/) encontrarás ejemplos, tutoriales, etc. para crear componentes, échale un vistazo.

Neftali [Germán.Estévez]
23-01-2015, 11:25:58
Estoy programando un componente para delphi XE6 con una propiedad publicada que debería mostrar una lista de valores recuperados de una base de datos (SQL Server 2012, por más datos). El problema que me estoy encontrando es a la hora de conectarme a un base de datos en tiempo de diseño (para recuperar los valores con los que llenaré el combo box).

La cadena de conexión la recuperará de un componente externo (mediante una propiedad).
En mi caso la recuperará de un TADOConnection que escogerá el usuario. Hasta ahí la cosa es fácil. A partir de ahí, creo un objeto tipo TADOQuery dentro de mi componente, llamo a su constructor, le declaro sus propiedades (incluida la consulta SQL), y realizo la consulta.

Antes de nada debes estar seguro de que las cosas se hacen en el orden correcto.
¿Donde lanzas esas consulta? ¿En el Active de tu componente, en el Create,...?
Debes tener claro que en el momento de hacer la consulta tienes disponible todo lo que te hace falta. si dependes de otro componente, debes asegurarte de que está creado y que tiene los valores correctos en las propiedades (ConnectionString).


De hecho me cuelga el IDE.

Es extraño, porque no debería pasar. depende de como lo estés haciendo te debería dar errores de memoria, o error al conectar, pero no que te deje "colgado" el IDE.

Y lo peor es que no puedo / no sé debugar en tiempo de diseño.

No se puede hacer Debug en tiempo de diseño. Aunque la ejecución debe funcionar igualmente si estás en diseño o en ejecución.
Un truco que puedes utilizar es pasar el código que ahora estás intentando probar en diseño a un lugar donde puedas probarlo en ejecución y ahí hacer el debug. Luego lo vuelves a pasar a la zona correcta.

Ejemplo:
Si tienes el código en el la propiedad Active (método SetActive), ejecuta ese método en ejecución y haz el Debug. Si funciona en ejecución debería funcionar en diseño. Esto respecto al código, otro tema es lo que te he comentado antes, que en el momento de ejecutarlo en diseño te falten cosaso existan componentes no creados o sin las propiedades correctas.

Una propuiedad que te puede ayudar en estos menesteres en el ComponentState. Tiene valores interesantes que en esto te pueden servir como, csLoading, csDestroying, csDesigning, csFreeNotification.

Tal vez (si puedes ponerlo) un esqueleto de tu componente pueda ayudar a probarlo.

Mendizabal
23-01-2015, 12:07:19
Muchas gracias a ambos.

Voy a repasarme los tutoriales. Tienen buena pinta.

En realidad lanzo la consulta cuando la propiedad en cuestión (Language) trata leer sus 'valores'. Es decir, siguiendo este trozo código:

published
property Language: TCustomTextList read GetLanguage write SetLanguage;

La consulta la lanzaría cuando llamo al procedure GetLanguage. También hay que decir que antes de asignarle la cadena de conexión al TADOQuery, compruebo que exista dicha cadena. Es decir, teniendo esta propiedad publicada:

published
property Connection: TADOConnection read FConnection write SetConnector;

Compruebo que la propiedad Connection no sea nula. De no serlo, se la asigno al TADOQuery.Connection (pondría el código real, pero está muy sucio ahora mismo).

Lo del IDE yo tampoco lo entiendo. Pero me sucede. Voy a probar a debuggar como ha sugerido Neftali. No se me había ocurrido, la verdad, pero es un método bastante evidente.

Investigaré sobre ComponentState. Tiene pinta de ser básica a la hora de programar componentes. Si es que las cosas no se pueden hacer con prisas, hay que estudiar el tema antes :o.

Gracias de nuevo a ambos ^\||/

Neftali [Germán.Estévez]
23-01-2015, 15:35:54
Lo del IDE yo tampoco lo entiendo.

Que no esté dentro de un bucle al calcular la propiedad...
Es lo único que se me ocurre para que el IDE se te quede "tieso".