Ir al contenido


Foto

DbGrid y TColumns con defauldrawing a true...


  • Por favor identifícate para responder
5 respuestas en este tema

#1 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 28 abril 2016 - 01:23

Quería dejar por zanjado este problema, pero quiero saber porque me pasa esto. Hilos atrás conseguí averiguar

el caso gracias a los sabios consejos de maestros en particular a Agustin, que me indicó que la razón era porque 

no le indicaba al DBGrid en la propiedad DefaultDrawing a TRUE.

 

Los titulos de las columnas del DBGrid me aparecen correctamente y lo mismo con el contenido de ellas

Pero estos títutos de columnas ni las mismas las creo por el inspector de objetos, sino con CREATE TABLE IF NOT EXIST personas "nombre" VARCHAR(20), "edad" Integer,.....)'; y así me aparecen correctamente, ya que si cambio el "nombre" VARCHAR(20) por "NOMBRE" el título de esa columna se crea con NOMBRE y su columna.

 

Ahora bien, el problema me vuelve loco, cuando quiero crear las columnas por el inspector de objetos, ahí al ejecutar el

contenido de las columnas se queda en blanco y hay registros que mostrar.

 

La demo de "enecumene" la he seguido paso a paso, pero no soy capaz, porque hay codigo y sentencias que el las ejecuta por las propiedades y en mi caso no es así.

 

Indico unas imagenes para que veais...

 

Creando columnas por inspector de objetos:

 

http://www.mediafire...robahr13p6g.jpg

 

No creando columnas.

 

http://www.mediafire...ovdmf3tt5zg.jpg


  • 0

#2 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 29 abril 2016 - 09:45

Nada, sigo sin comprender un caso y el otro y harto de sobra!


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 30 abril 2016 - 10:10

Hola dooper, sucede lo siguiente, cuando creas la tabla en tiempo de ejecución, los campos no son persistentes sino al "vuelo", cuando creas las columnas desde el DBGrid verás que cuando seleccionas el campo que se mostrará en esa columna no aparecerá, por lo tanto no se mostrará cuando abres la consulta, como tú estás haciendo todo al vuelo debes también crear las columnas y la asignación del campo del DBGrid al "vuelo", me explico:


delphi
  1. //Creamos la columna nombre
  2. DBGrid1.Columns.Add;
  3. DBGrid1.Columns[0].FieldName := 'nombre'; //<-- el nombre de la tabla no del título
  4. DBGrid1.Columns[0].Title.Caption := 'Nombre'; //<-- el Titulo
  5. DBGrid1.Columns[0].Title.Alignment := taCenter; //<--Centralizamos el titulo
  6. DBGrid1.Columns[0].Width := 150; //<-- El ancho de la columna
  7. //...Mas opciones
  8.  
  9. //Creamos la columna edad
  10. DBGrid1.Columns.Add;
  11. DBGrid1.Columns[1].FieldName := 'edad'; //<-- el nombre de la tabla no del título
  12. DBGrid1.Columns[1].Title.Caption := 'Edad'; //<-- el Titulo
  13. DBGrid1.Columns[1].Title.Alignment := taCenter; //<--Centralizamos el titulo
  14. DBGrid1.Columns[1].Width := 60; //<-- El ancho de la columna
  15.  
  16. //... y Así sucesivamente

¿Donde puedes colocar ese código?, en mi opinión lo colocaría en el evento OnAfterOpen del DataSet(Query, Table, etc..) que se utiliza para mostrar los datos, ese es un ejemplo muy básico, sólo aplica si son sólo dos campos o tres, ¿y si son muchos?, lo puedes hacer de esta manera:


delphi
  1. procedure TForm1.ZQuery1AfterOpen(DataSet: TDataSet);
  2. var i: integer;
  3. begin
  4. for i := 0 to ZQuery1.FieldCount -1 do
  5. begin
  6. DBGrid1.Columns.Add;
  7. DBGrid1.Columns[i].FieldName := ZQuery1.Fields.Fields[i].FieldName; //<-- el nombre de la tabla no del título
  8. DBGrid1.Columns[i].Title.Caption := AnsiProperCase(ZQuery1.Fields.Fields[i].FieldName); //<-- el Titulo
  9. DBGrid1.Columns[i].Title.Alignment := taCenter; //<--Centralizamos el titulo
  10. end;
  11. end;

En este caso el ancho de la columna se determina de acuerdo a la logintud asignada en la base de datos.

Pero te reitero, es mejor hacerlo todo en tiempo de diseño y dejar la creación de tabla sólo si no está creada, "un por si acaso", llevate de mi tutorial y te evitarás mucho quebradero de cabezas.

Saludos.


  • 0

#4 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 30 abril 2016 - 01:38

Por fin dí con el "kit" de la cuestión. Acabo de leer tu mensaje enecumene y efectivamente era eso.

Al crear las columnas en el DBGrid en diseño, solamente le daba un "title" a las mismas, pero yo insistía en seguir el tutorial que buen aporte me ha dado, y en ese tutorial, en la propiedad "fieldname" salían los campos automaticamente, pero en mi caso al ir uno por uno en este campo me indicaba y de hecho sigue haciéndolo 'Unable to retrieve fields definition from dataset' pero sí me deja poner el nombre del campo que tiene la base de datos, (nombre, edad y sexo) respectivamente. Una vez así, funcionó!

 

Tomo nota de todo el contenido de código que adjuntas, me vale para mucho, por si acaso, debo usarlo en vez de por diseño.

 

En cuanto a la tabla, la creo siempre en tiempo de diseño, CREATE TABLE IF NOT EXIST ......

 

Sabes lo que ocurre, sigo sin entender porque sin crear la columnas en tiempo de diseño, y tampoco en código como indicas arriba, era posible que al ejecutar el codigo, sí aparezcan las columnas, sus títulos y el contenido. He pensado que era por la instrucción CREATE TABLE IF NOT EXIST ("Nombre" VARCHAR(20), "Edad" .....) y que esa instrucción creaba el titulo y columnas en el propio dbgrid. No se si será así, pero a mí me funcionaba sin crear columnas (TColumns) en el dbgrid.

 

Gracias y mil gracias amigo! 

 

Un paso más aprendido, mil pasos más por aprender...

 

Un saludo


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 30 abril 2016 - 02:12

Pues no, no te creaba el título, sino que a falta de título el DBGrid automáticamente te pone el nombre de la tabla, como te había comentado en otro hilo, que si creabas la tabla con nombres como persona_id, persona_nombre y persona_edad y al no crear las columnas los título serán así mismo, persona_id, etc..

 

Te reitero, siempre es mejor tener la tabla creada de antemano, por regla general es lo primero que se hace, como en mi tutorial, y no crearla en tiempo de ejecución porque estarás forzado a trabajar "al vuelo", como eres novato en esto, aún no tienes dominio, por eso te recomiendo trabajar en tiempo de diseño y con una tabla ya creada.

 

Saludos.


  • 0

#6 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 30 abril 2016 - 02:41

Pues no, no te creaba el título, sino que a falta de título el DBGrid automáticamente te pone el nombre de la tabla, como te había comentado en otro hilo, que si creabas la tabla con nombres como persona_id, persona_nombre y persona_edad y al no crear las columnas los título serán así mismo, persona_id, etc..

 

Te reitero, siempre es mejor tener la tabla creada de antemano, por regla general es lo primero que se hace, como en mi tutorial, y no crearla en tiempo de ejecución porque estarás forzado a trabajar "al vuelo", como eres novato en esto, aún no tienes dominio, por eso te recomiendo trabajar en tiempo de diseño y con una tabla ya creada.

 

Saludos.

Ok, vendrán más tropiezos! pero lo importante será levantarse...

 

saludos.


  • 0




IP.Board spam blocked by CleanTalk.