Autor Tema: Las Columnas de Hércules.  (Leído 662 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TiammatMX

  • Miembro Platino
  • *****
  • Gracias
  • -Dados: 222
  • -Recibidos: 84
  • Mensajes: 1,221
  • Calificaciones: +91/-1
  • Sexo: Masculino
  • Delphi Programmers do it recursively...
    • Las Andanzas de un Dragón de Madera.
Las Columnas de Hércules.
« en: 18 de Enero de 2010, 14:26:35 »
¿Cuántas veces hemos tenido un TDbGrid que el cliente o el diseñador quiere que ocupe la pantalla y no presente huecos en la rejilla?

Pues entonces, aquí está la solución:

En la creación de nuestra forma, tendremos algo así.
Código DELPHI
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3. //Asignamos a la propiedad TAG del DBGrid el ancho
  4. //mínimo que deseamos utilizar. 40 pixeles.
  5.    Table1.FieldByName('FirstName').Tag := 40;
  6.  
  7. //Ahora, el valor de cada título: Ancho de la
  8. // columna de título.
  9.    Table1.FieldByName('LastName').Tag := 4 + Canvas.TextWidth(Table1.FieldByName('LastName').DisplayName);
  10. end;
  11.  

En el código anterior, obtendremos de una tabla de una base de datos el ancho de cada columna de nuestro TDbGrid, lo que nos permitirá hacer el cálculo y mostrar una rejila limpia y pareja.

Ahora, llamaremos a nuestra función que nos permitirá visualizar correctamente nuestra rejilla.
Código DELPHI
  1. procedure TForm1.FormResize(Sender: TObject);
  2. begin
  3.    FixDBGridColumnsWidth(DBGrid1);
  4. end;

Y ahora, la función que nos permitirá hacer todo el trabajo. Y poner a nuestro cliente como un defensor más de Delphi.

Código DELPHI
  1. procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
  2. var
  3.    i : integer;
  4.    TotWidth : integer;
  5.    VarWidth : integer;
  6.    ResizableColumnCount : integer;
  7.    AColumn : TColumn;
  8. begin
  9. //Ancho total de todas las columnas antes de procesar
  10.    TotWidth := 0;
  11. //Cómo dividir el espacio sobrante de nuestras columnas
  12.    VarWidth := 0;
  13. //Cuantas columnas se procesarán
  14.    ResizableColumnCount := 0;
  15.    for i := 0 to -1 + DBGrid.Columns.Count do
  16.    begin
  17.       TotWidth := TotWidth + DBGrid.Columns[i].Width;
  18.       if DBGrid.Columns[i].Field.Tag <> 0 then
  19.          Inc(ResizableColumnCount);
  20.    end;
  21.  
  22. //Sumar un pixel para la línea de separación
  23.    if dgColLines in DBGrid.Options then
  24.       TotWidth := TotWidth + DBGrid.Columns.Count;
  25.  
  26. //Agregar el ancho del indicador de columna
  27.    if dgIndicator in DBGrid.Options then
  28.       TotWidth := TotWidth + IndicatorWidth;
  29.  
  30. //width vale "left"
  31.    VarWidth := DBGrid.ClientWidth - TotWidth;
  32.  
  33. //Distribuir equitativamente VarWidth
  34. //a todas las columnas que se procesarán
  35.    if ResizableColumnCount > 0 then
  36.       VarWidth := varWidth div ResizableColumnCount;
  37.  
  38.    for i := 0 to -1 + DBGrid.Columns.Count do
  39.    begin
  40.       AColumn := DBGrid.Columns[i];
  41.       if AColumn.Field.Tag <> 0 then
  42.          begin
  43.             AColumn.Width := AColumn.Width + VarWidth;
  44.             if AColumn.Width < AColumn.Field.Tag then
  45.                AColumn.Width := AColumn.Field.Tag;
  46.          end;
  47.    end;
  48.  
  49. end; (*FixDBGridColumnsWidth*)

Y listo...

Se aceptan comentarios y modificaciones para mejorar éste pequeño código.


____________________________________
Felipe Eduardo Ortiz López.
"Un programador es una máquina biológica que transforma café en líneas de programación".
"¿Qué se sentirá tenerme y después perderme?" Mauricio Feréz Yázbek (AKA Mauricio Garcés)

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Las Columnas de Hércules.
« Respuesta #1 en: 18 de Enero de 2010, 14:31:42 »
Muchas gracias amigo, muy buen aporte :D (y)

Desconectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,120
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Las Columnas de Hércules.
« Respuesta #2 en: 18 de Enero de 2010, 14:43:41 »
Muy buen truco, gracias amigo Felipe (y)

Salud OS

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado TiammatMX

  • Miembro Platino
  • *****
  • Gracias
  • -Dados: 222
  • -Recibidos: 84
  • Mensajes: 1,221
  • Calificaciones: +91/-1
  • Sexo: Masculino
  • Delphi Programmers do it recursively...
    • Las Andanzas de un Dragón de Madera.
Re: Las Columnas de Hércules.
« Respuesta #3 en: 03 de Febrero de 2012, 16:55:01 »
Y como una solución alterna (en el inicio de éste hilo, consigno el uso de TADOTable) en el caso de usar TADOQuery, programé éste pequeño procedimiento que me ha servido a las mil maravillas...


Código DELPHI
  1. procedure TfrmPrincipal.AjustaRejilla(dbgRejilla: TDBGrid;aqQuery: TADOQuery);
  2. var
  3.   iIndc, iIndcdr, iTmn1, iTmn2, iSmaAnch, iCmplmnt : integer;
  4.   sNmbrCmp : string;
  5. begin
  6.   with aqQuery do
  7.   begin
  8.     iSmaAnch := 0;
  9.     for iIndc := 0 to FieldCount -1 do
  10.     begin
  11.       sNmbrCmp := Fields.Fields[iIndc].FieldName;
  12.       for iIndcdr := 0 to dbgRejilla.Columns.Count -1 do
  13.       begin
  14.         if dbgRejilla.Columns.Items[iIndcdr].FieldName = sNmbrCmp then
  15.         begin
  16.           iTmn1 := Trunc(Length(dbgRejilla.Columns.Items[iIndcdr].Title.Caption)*5);
  17.           iTmn2 := Fields.Fields[iIndc].Size;
  18.  
  19.           dbgRejilla.Columns.Items[iIndcdr].Width := Trunc(Iif(iTmn1 > iTmn2, iTmn1, iTmn2));
  20.           iSmaAnch := iSmaAnch + dbgRejilla.Columns.Items[iIndcdr].Width;
  21.         end;
  22.       end;
  23.     end;
  24.  
  25. // Aquí se calcula el complemento de tamaño en caso que los datos no llenen completamente el ancho de la pantalla.
  26.     if dbgRejilla.Width > iSmaAnch then
  27.     begin
  28.       iCmplmnt := Round(((dbgRejilla.Width-(dbgRejilla.Columns.Count*2))-iSmaAnch)/(dbgRejilla.Columns.Count+0.15));
  29.       for iIndcdr := 0 to dbgRejilla.Columns.Count -1 do
  30.         dbgRejilla.Columns.Items[iIndcdr].Width := dbgRejilla.Columns.Items[iIndcdr].Width+iCmplmnt;
  31.     end;
  32.   end;
  33. end;
____________________________________
Felipe Eduardo Ortiz López.
"Un programador es una máquina biológica que transforma café en líneas de programación".
"¿Qué se sentirá tenerme y después perderme?" Mauricio Feréz Yázbek (AKA Mauricio Garcés)

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Desconectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,120
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Las Columnas de Hércules.
« Respuesta #4 en: 03 de Febrero de 2012, 17:08:21 »
Ah vaya, un año después, otra alternativa (y)

Saludos

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado Caral

  • Administrador
  • ******
  • Gracias
  • -Dados: 195
  • -Recibidos: 258
  • Mensajes: 3,232
  • Calificaciones: +300/-4
  • Sexo: Masculino
  • Siempre Novato
Re: Las Columnas de Hércules.
« Respuesta #5 en: 03 de Febrero de 2012, 18:42:59 »
Hola
Ah vaya, un año después, otra alternativa (y)

Saludos
Eso demuestra que nunca es tarde para aprender una forma nueva. (y)
Saludos

Desconectado TiammatMX

  • Miembro Platino
  • *****
  • Gracias
  • -Dados: 222
  • -Recibidos: 84
  • Mensajes: 1,221
  • Calificaciones: +91/-1
  • Sexo: Masculino
  • Delphi Programmers do it recursively...
    • Las Andanzas de un Dragón de Madera.
Re: Re: Las Columnas de Hércules.
« Respuesta #6 en: 03 de Febrero de 2012, 20:19:49 »
...Ah vaya, un año después, otra alternativa (y)...

Perro nuevo SÍ aprende nuevos trucos... :p Y en éste caso, fue por necesidad que tuve que programar otra alternativa, sobre todo más eficaz y veloz. Espero haberlo logrado.
____________________________________
Felipe Eduardo Ortiz López.
"Un programador es una máquina biológica que transforma café en líneas de programación".
"¿Qué se sentirá tenerme y después perderme?" Mauricio Feréz Yázbek (AKA Mauricio Garcés)

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Desconectado Rolphy Reyes

  • Moderadores
  • ******
  • Gracias
  • -Dados: 177
  • -Recibidos: 234
  • Mensajes: 1,496
  • Calificaciones: +248/-0
  • Sexo: Masculino
  • TRolphyReyes = Class(TBaseModerador)
Re: Las Columnas de Hércules.
« Respuesta #7 en: 03 de Febrero de 2012, 21:08:02 »
Saludos.

Vengo como nata en el pastel, los JEDI tienen en su GRID tienen la propiedad AutoWidthColumn y son Open Source.

Sorry!
Lo único predecible en la vida es lo impredecible!

Si encontró útil este Mensaje utilice el Botón de Gracias.

¿Cómo postear correctamente?

Desconectado TiammatMX

  • Miembro Platino
  • *****
  • Gracias
  • -Dados: 222
  • -Recibidos: 84
  • Mensajes: 1,221
  • Calificaciones: +91/-1
  • Sexo: Masculino
  • Delphi Programmers do it recursively...
    • Las Andanzas de un Dragón de Madera.
Re: Las Columnas de Hércules.
« Respuesta #8 en: 03 de Febrero de 2012, 22:08:03 »
... JEDI tienen en su GRID tienen la propiedad AutoWidthColumn y son Open Source...

Pero acuérdate que yo tengo PROHIBIDÍSIMO en el trabajo usar componentes de terceros..., tengo que ingeniármelas para cumplir los requerimientos y ésa regla absurda...  :'( :'( 8o| 8o| :'( 8o| 8o| :'( (li) (li)
____________________________________
Felipe Eduardo Ortiz López.
"Un programador es una máquina biológica que transforma café en líneas de programación".
"¿Qué se sentirá tenerme y después perderme?" Mauricio Feréz Yázbek (AKA Mauricio Garcés)

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Las Columnas de Hércules.
« Respuesta #9 en: 08 de Febrero de 2012, 07:33:43 »
Amigo Felipe.MX tuve problemas al implementar tu alternativa, en la linea 19 tienes esto:

Código DELPHI
  1. dbgRejilla.Columns.Items[iIndcdr].Width := Trunc(Iif(iTmn1 > iTmn2, iTmn1, iTmn2));

Es eso correcto? que version utilizas? yo utilizo la version 2007.

Saludos.

Desconectado Rolphy Reyes

  • Moderadores
  • ******
  • Gracias
  • -Dados: 177
  • -Recibidos: 234
  • Mensajes: 1,496
  • Calificaciones: +248/-0
  • Sexo: Masculino
  • TRolphyReyes = Class(TBaseModerador)
Re: Las Columnas de Hércules.
« Respuesta #10 en: 08 de Febrero de 2012, 08:10:58 »
... JEDI tienen en su GRID tienen la propiedad AutoWidthColumn y son Open Source...

Pero acuérdate que yo tengo PROHIBIDÍSIMO en el trabajo usar componentes de terceros..., tengo que ingeniármelas para cumplir los requerimientos y ésa regla absurda...  :'( :'( 8o| 8o| :'( 8o| 8o| :'( (li) (li)

Saludos.

Sí que es una regla absurda, creo mas bien en controlar los componentes a utilizar.

En el trabajo tenemos una cantidad limitada de los componentes de terceros y si se necesitara alguno nuevo se hace un consenso y demás cosas en cuestión.
Lo único predecible en la vida es lo impredecible!

Si encontró útil este Mensaje utilice el Botón de Gracias.

¿Cómo postear correctamente?

Desconectado TiammatMX

  • Miembro Platino
  • *****
  • Gracias
  • -Dados: 222
  • -Recibidos: 84
  • Mensajes: 1,221
  • Calificaciones: +91/-1
  • Sexo: Masculino
  • Delphi Programmers do it recursively...
    • Las Andanzas de un Dragón de Madera.
Re: Re: Las Columnas de Hércules.
« Respuesta #11 en: 08 de Febrero de 2012, 09:23:13 »
Amigo Felipe.MX tuve problemas al implementar tu alternativa, en la linea 19 tienes esto:

Código DELPHI
  1. dbgRejilla.Columns.Items[iIndcdr].Width := Trunc(Iif(iTmn1 > iTmn2, iTmn1, iTmn2));

Es eso correcto? que version utilizas? yo utilizo la version 2007.

Saludos.
Delphi 6 y vagos recuerdos de Clipper..., ésa función Iif la hice yo para un propósito específico, y la pongo aquí. Perdón por la confusión, enecumene...  :embarrassed: :embarrassed: :embarrassed:

Código DELPHI
  1. function Iif(bCondicion: Boolean; vValor1, vValor2: variant): variant;
  2. begin
  3.   if bCondicion then
  4.     Result := vValor1
  5.   else
  6.     Result := vValor2;
  7. end;
____________________________________
Felipe Eduardo Ortiz López.
"Un programador es una máquina biológica que transforma café en líneas de programación".
"¿Qué se sentirá tenerme y después perderme?" Mauricio Feréz Yázbek (AKA Mauricio Garcés)

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Desconectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,120
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Las Columnas de Hércules.
« Respuesta #12 en: 08 de Febrero de 2012, 09:40:36 »
... JEDI tienen en su GRID tienen la propiedad AutoWidthColumn y son Open Source...

Pero acuérdate que yo tengo PROHIBIDÍSIMO en el trabajo usar componentes de terceros..., tengo que ingeniármelas para cumplir los requerimientos y ésa regla absurda...  :'( :'( 8o| 8o| :'( 8o| 8o| :'( (li) (li)

Saludos.

Sí que es una regla absurda, creo mas bien en controlar los componentes a utilizar.

En el trabajo tenemos una cantidad limitada de los componentes de terceros y si se necesitara alguno nuevo se hace un consenso y demás cosas en cuestión.

Caramba!!!!, cuando tenga mi empresa voy a tener ¡¡¡¡ REGLAS ABSURDAS  !!!! :'( :'( :'( :'(

Salud OS :)

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Las Columnas de Hércules.
« Respuesta #13 en: 08 de Febrero de 2012, 10:18:17 »
Usted tranquilo amigo Felipe.mx de vez en cuando nos pasa, gracias por pasarme la funcion, mañana te comento mis resultados.

Saludos.

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Las Columnas de Hércules.
« Respuesta #14 en: 09 de Febrero de 2012, 07:28:37 »
Bueno, ayer probé tu código y no me funcionó, al final tengo un tremendo hueco, o es que debo asignar el tamaño de cada columna en el Size del campo persistente del DataSet?.

Saludos.

Desconectado TiammatMX

  • Miembro Platino
  • *****
  • Gracias
  • -Dados: 222
  • -Recibidos: 84
  • Mensajes: 1,221
  • Calificaciones: +91/-1
  • Sexo: Masculino
  • Delphi Programmers do it recursively...
    • Las Andanzas de un Dragón de Madera.
Re: Re: Las Columnas de Hércules.
« Respuesta #15 en: 09 de Febrero de 2012, 09:58:49 »
Bueno, ayer probé tu código y no me funcionó, al final tengo un tremendo hueco, o es que debo asignar el tamaño de cada columna en el Size del campo persistente del DataSet?.

Saludos.
Dos preguntas, ¿lo utilizas como una función? Me refiero a que cada vez que es llamada, toma el ancho visual de la rejilla y la calcula en referencia a la sumatoria del tamaño de cada columna para añadir un complemento (segunda parte de la función). Creo que ésta parte es la que te está faltando.

Referente a lo de los tamaños, como interroga directamente a cada columna por su tamaño en la tabla, no es necesario ponerle el tamaño (Size) al DataSet...
____________________________________
Felipe Eduardo Ortiz López.
"Un programador es una máquina biológica que transforma café en líneas de programación".
"¿Qué se sentirá tenerme y después perderme?" Mauricio Feréz Yázbek (AKA Mauricio Garcés)

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco

Desconectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Las Columnas de Hércules.
« Respuesta #16 en: 09 de Febrero de 2012, 10:02:34 »
Pues la tengo tal cual como lo colocaste incluyendo la funcion Iif, y nada pues, algo mal estare haciendo.

Saludos.