Para Ignacio Ortiz (Y todo el que quiera leerlo)
Publicado: Lun Jul 23, 2007 10:44 am
Estimado Ignacio. Nos conocimos en la reunión de Madrid del pasado mes de
Octubre y nos volvimos a ver en la última de Murcia. Soy José, compañero de
trabajo de J. Alfonso Suarez en Sevilla. Espero me recuerdes.
Por fin he encontrado tiempo y he comenzado a probar vuestro producto, y
debo reconocer que me está dejando impresionado. Os felicito y os doy la
enhorabuena para que sigáis poniéndole las ganas que hasta ahora. Pero como
entiendo que vosotros solos no podeis hacerle frente a todo, a continuación
os detallo una serie de puntos que creo que os pueden ser de utilidad y que
a mi me tienen un poco desesperado:
1.- Los atributos de una clase declarados como DATA no se visualizan en el
arbol del debugger. En mi caso me ocurre con una clase "Formulario" que
hereda de TForm. No creo que eso influya pero por si acaso lo comento. No lo
he probado con otra clase. En definitiva. He creado unas DATA a mano en
dicha clase, y para poder visualizarlas en el debugger, las tengo que poner
como COMPONENT, si no, no aparecen en el arbol. Entiendo que,
independientemente de lo que sean, si en definitiva, son atributos de la
clase, debo poder verlos en el debugger.
2.- El atributo nMaxLength de un oDBEdit o de un oDBMaskEdit con valor a 0
no se comporta como se especifica en las ayudas. Según estas, si lo dejo a
0, dicha propiedad adquiere la longitud del primer valor con que se rellene
el objeto. Al parecer con DBF va bien (yo no le he probado), pero con
TADODataSource y TSQLQuery sobre una tabla MySQL, no hace caso, y se queda a
ilimitado, pudiendo por tanto escribir todos los caracteres que el usuario
desee y no ajustandose a lo establecido en el diseño de la tabla MySQL.
3.- Como intento de solución al punto anterior y teniendo en cuenta que lo
que estoy programando está basado ("copiado") en el sample de Xailer del
ExplorerBar, he probado a hacer lo siguiente:
METHOD FirstCreate( oSender ) CLASS TFormClinica
oSender:nMaxLength := oSender:oDataField:nLen
oSender:oDataSet := ::oParent:oSQLQueryFullCurrent
RETURN Nil
Pero mi sorpresa, al meter el debugger es que oSender:oDataField NO ES UN
Objeto, sino un CARACTER. Entiendo lo de que pongamos un caracter como
"acceso rápido", pero cuando pregunto por oDataField en el código, a mi
entender debería ser un objeto como indican las ayudas e incluso su propia
preposición "o", ¿no?
4.- Mi mayor problema y en el que de verdad no entiendo qué me está pasando.
Te pongo en situación. El ejemplo del ExplorerBar de los samples de Xailer
construye un TDBBrowse a partir de un TDbfDataSet y lo muestra, permitiendo
mediante opciones en la ExplorerBar insertar, elimiar y editar registros de
él en una segunda ventana. Bien. Yo he "ampliado" ese ejemplo poniendo al
comienzo de la explorerBar un Combobox referente a sobre qué fichero quiero
mantener en la ventana, de forma que su TDBBrowse correspondiente se oculta
o muestra cuando el combobox lo indique. Para ello, he declarado unas DATAS
(las del punto 1) en dicha clase que hacen referencia en todo momento a:
DATA oSQLQueryRelationCurrent (TSQLQuery actual utilizada para mostrar el
browser (Solo tiene los datos a mostrar en el browser))
DATA oSQLQueryFullCurrent (TSQLQuery actual cuyo Select obtiene todos
los campos de la misma tabla que oSQLQueryRelationCurrent del registro en el
que esta última esté posicionado. Inicialmente el lOpen está a falso y antes
de ponerlo por código a True, construyo la Select poniendole un WHERE ID=ID
actual de oSQLQueryRelationCurrent. Cuando finalizo, vuelvo a poner su lOpen
a falso.).
DATA oDBBrowseCurrent (TDBBrowse actual que se está mostrando y que está
creado sobre oSQLQueryRelationCurrent)
Así, cuando pulso las opciones en la ExplorerBar de Añadir, Editar o
Eliminar un registro, siempre lo haré sobre oSQLQueryFullCurrent. Pues el
problema es que: Cuando añado o edito por primera vez, todo va genial
(Realmente la eliminación aún no la he implementado). Pero cuando lo intento
hacer por segunda y posteriores veces, la aplicación no hace nada y la
ventana del debugger me da los siguientes mensajes:
#6: XAILER Warning: Incorrect type on field Codigo
#7: XAILER Warning: Incorrect type on field RazonSocial
#8: XAILER Warning: Incorrect type on field Domicilio
#9: XAILER Warning: Incorrect type on field Poblacion
#10: XAILER Warning: Incorrect type on field Provincia
#11: XAILER Warning: Incorrect type on field DP
#12: XAILER Warning: Incorrect type on field NIF
#13: XAILER Warning: Incorrect type on field Mail
#14: XAILER Warning: Incorrect type on field Web
#15: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#16: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#17: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#18: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#19: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#20: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#21: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#22: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#23: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#24: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#25: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#26: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#27: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#28: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#29: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#30: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#31: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#32: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#33: HEAP[lpd.exe]:
#34: Heap block at 00233268 modified at 0023327A past requested size of a
#35: HEAP[lpd.exe]:
#36: Invalid Address specified to RtlFreeHeap( 00150000, 00233270 )
Te detallo algunas cosas a destacar de este cuarto punto. Estoy trabajando
con ADO (ya lo has visto) y MySQL. He notado que, a pesar de cambiar la
Select tal y como te he comentado en cada adición/edición de registro para
poner el WHERE, su propiedad aFields (Que para la primera vez es un array
vacio y por lo tanto se rellena automáticamente) no varia ya, por mucho que
cambie la Select. No creo que este sea el problema ya que he probado a
vaciar dicho array al salir, a sacar una copia antes y restaurarla, etc.. y
nada, pero.. ¿eso debe ser así? ¿Qué pasa si establezco, tras un lOpen:=.F.
una Select que se traiga unos campos distintos a los de la primera select
indicada? ¿No sería lógico que si cambio la propiedad SELECT de un SQLQuery,
su propiedad aFields (inclusive otras) se "resetearan"? No sé si quizás
estoy divagando demasiado. Pero en principio me parecería lo razonable,
¿no?.
Siento si esto es un poco engorroso porque sé que estás bastante liado, pero
te invito a que reproduzcas estos puntos (es muy facil de hacer modificando
el sample que te comento) ya que creo que te pueden resultar interesantes.
La intención con la que escribo el mensaje es de ayuda mutua. Espero que al
final no sea que estoy haciendo algo mal y no me he dado cuenta porque
sentiría haberte molestado por algo así. Pero créeme. Lo he intentado todo,
llevo varios días. He mirado las ayudas, las noticias y los blogs y nada.
Vaya. Que antes de recurrir a tí, me lo he currado. Pero no he sido capaz de
dar con la solución a ninguna de estas cosas.
Espero que podamos ayudarnos mutuamente.
Quedo a la espera de algún comentario.
Un saludo.
José Francisco Rangel Serrano.
Octubre y nos volvimos a ver en la última de Murcia. Soy José, compañero de
trabajo de J. Alfonso Suarez en Sevilla. Espero me recuerdes.
Por fin he encontrado tiempo y he comenzado a probar vuestro producto, y
debo reconocer que me está dejando impresionado. Os felicito y os doy la
enhorabuena para que sigáis poniéndole las ganas que hasta ahora. Pero como
entiendo que vosotros solos no podeis hacerle frente a todo, a continuación
os detallo una serie de puntos que creo que os pueden ser de utilidad y que
a mi me tienen un poco desesperado:
1.- Los atributos de una clase declarados como DATA no se visualizan en el
arbol del debugger. En mi caso me ocurre con una clase "Formulario" que
hereda de TForm. No creo que eso influya pero por si acaso lo comento. No lo
he probado con otra clase. En definitiva. He creado unas DATA a mano en
dicha clase, y para poder visualizarlas en el debugger, las tengo que poner
como COMPONENT, si no, no aparecen en el arbol. Entiendo que,
independientemente de lo que sean, si en definitiva, son atributos de la
clase, debo poder verlos en el debugger.
2.- El atributo nMaxLength de un oDBEdit o de un oDBMaskEdit con valor a 0
no se comporta como se especifica en las ayudas. Según estas, si lo dejo a
0, dicha propiedad adquiere la longitud del primer valor con que se rellene
el objeto. Al parecer con DBF va bien (yo no le he probado), pero con
TADODataSource y TSQLQuery sobre una tabla MySQL, no hace caso, y se queda a
ilimitado, pudiendo por tanto escribir todos los caracteres que el usuario
desee y no ajustandose a lo establecido en el diseño de la tabla MySQL.
3.- Como intento de solución al punto anterior y teniendo en cuenta que lo
que estoy programando está basado ("copiado") en el sample de Xailer del
ExplorerBar, he probado a hacer lo siguiente:
METHOD FirstCreate( oSender ) CLASS TFormClinica
oSender:nMaxLength := oSender:oDataField:nLen
oSender:oDataSet := ::oParent:oSQLQueryFullCurrent
RETURN Nil
Pero mi sorpresa, al meter el debugger es que oSender:oDataField NO ES UN
Objeto, sino un CARACTER. Entiendo lo de que pongamos un caracter como
"acceso rápido", pero cuando pregunto por oDataField en el código, a mi
entender debería ser un objeto como indican las ayudas e incluso su propia
preposición "o", ¿no?
4.- Mi mayor problema y en el que de verdad no entiendo qué me está pasando.
Te pongo en situación. El ejemplo del ExplorerBar de los samples de Xailer
construye un TDBBrowse a partir de un TDbfDataSet y lo muestra, permitiendo
mediante opciones en la ExplorerBar insertar, elimiar y editar registros de
él en una segunda ventana. Bien. Yo he "ampliado" ese ejemplo poniendo al
comienzo de la explorerBar un Combobox referente a sobre qué fichero quiero
mantener en la ventana, de forma que su TDBBrowse correspondiente se oculta
o muestra cuando el combobox lo indique. Para ello, he declarado unas DATAS
(las del punto 1) en dicha clase que hacen referencia en todo momento a:
DATA oSQLQueryRelationCurrent (TSQLQuery actual utilizada para mostrar el
browser (Solo tiene los datos a mostrar en el browser))
DATA oSQLQueryFullCurrent (TSQLQuery actual cuyo Select obtiene todos
los campos de la misma tabla que oSQLQueryRelationCurrent del registro en el
que esta última esté posicionado. Inicialmente el lOpen está a falso y antes
de ponerlo por código a True, construyo la Select poniendole un WHERE ID=ID
actual de oSQLQueryRelationCurrent. Cuando finalizo, vuelvo a poner su lOpen
a falso.).
DATA oDBBrowseCurrent (TDBBrowse actual que se está mostrando y que está
creado sobre oSQLQueryRelationCurrent)
Así, cuando pulso las opciones en la ExplorerBar de Añadir, Editar o
Eliminar un registro, siempre lo haré sobre oSQLQueryFullCurrent. Pues el
problema es que: Cuando añado o edito por primera vez, todo va genial
(Realmente la eliminación aún no la he implementado). Pero cuando lo intento
hacer por segunda y posteriores veces, la aplicación no hace nada y la
ventana del debugger me da los siguientes mensajes:
#6: XAILER Warning: Incorrect type on field Codigo
#7: XAILER Warning: Incorrect type on field RazonSocial
#8: XAILER Warning: Incorrect type on field Domicilio
#9: XAILER Warning: Incorrect type on field Poblacion
#10: XAILER Warning: Incorrect type on field Provincia
#11: XAILER Warning: Incorrect type on field DP
#12: XAILER Warning: Incorrect type on field NIF
#13: XAILER Warning: Incorrect type on field Mail
#14: XAILER Warning: Incorrect type on field Web
#15: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#16: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#17: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#18: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#19: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#20: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#21: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#22: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#23: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#24: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#25: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#26: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#27: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#28: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#29: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#30: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#31: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#32: XAILER: TDBEdit:oDataField is not a valid TDataField Object (NIL)
#33: HEAP[lpd.exe]:
#34: Heap block at 00233268 modified at 0023327A past requested size of a
#35: HEAP[lpd.exe]:
#36: Invalid Address specified to RtlFreeHeap( 00150000, 00233270 )
Te detallo algunas cosas a destacar de este cuarto punto. Estoy trabajando
con ADO (ya lo has visto) y MySQL. He notado que, a pesar de cambiar la
Select tal y como te he comentado en cada adición/edición de registro para
poner el WHERE, su propiedad aFields (Que para la primera vez es un array
vacio y por lo tanto se rellena automáticamente) no varia ya, por mucho que
cambie la Select. No creo que este sea el problema ya que he probado a
vaciar dicho array al salir, a sacar una copia antes y restaurarla, etc.. y
nada, pero.. ¿eso debe ser así? ¿Qué pasa si establezco, tras un lOpen:=.F.
una Select que se traiga unos campos distintos a los de la primera select
indicada? ¿No sería lógico que si cambio la propiedad SELECT de un SQLQuery,
su propiedad aFields (inclusive otras) se "resetearan"? No sé si quizás
estoy divagando demasiado. Pero en principio me parecería lo razonable,
¿no?.
Siento si esto es un poco engorroso porque sé que estás bastante liado, pero
te invito a que reproduzcas estos puntos (es muy facil de hacer modificando
el sample que te comento) ya que creo que te pueden resultar interesantes.
La intención con la que escribo el mensaje es de ayuda mutua. Espero que al
final no sea que estoy haciendo algo mal y no me he dado cuenta porque
sentiría haberte molestado por algo así. Pero créeme. Lo he intentado todo,
llevo varios días. He mirado las ayudas, las noticias y los blogs y nada.
Vaya. Que antes de recurrir a tí, me lo he currado. Pero no he sido capaz de
dar con la solución a ninguna de estas cosas.
Espero que podamos ayudarnos mutuamente.
Quedo a la espera de algún comentario.
Un saludo.
José Francisco Rangel Serrano.