Ir al contenido



Foto

Las Columnas de Hércules.


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

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 18 enero 2010 - 02:26

¿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í.


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;



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.


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.



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.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.404 mensajes
  • LocationRepública Dominicana

Escrito 18 enero 2010 - 02:31

Muchas gracias amigo, muy buen aporte :D (y)
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.936 mensajes
  • LocationMéxico

Escrito 18 enero 2010 - 02:43

Muy buen truco, gracias amigo Felipe (y)

Salud OS
  • 0

#4 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 03 febrero 2012 - 04:55

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...




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;


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.936 mensajes
  • LocationMéxico

Escrito 03 febrero 2012 - 05:08

Ah vaya, un año después, otra alternativa (y)

Saludos
  • 0

#6 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 03 febrero 2012 - 06:42

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
  • 0

#7 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 03 febrero 2012 - 08:19

...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.
  • 0

#8 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.091 mensajes
  • LocationRepública Dominicana

Escrito 03 febrero 2012 - 09:08

Saludos.

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

Sorry!
  • 0

#9 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 03 febrero 2012 - 10:08

... 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)
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.404 mensajes
  • LocationRepública Dominicana

Escrito 08 febrero 2012 - 07:33

Amigo Felipe.MX tuve problemas al implementar tu alternativa, en la linea 19 tienes esto:



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.
  • 0

#11 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.091 mensajes
  • LocationRepública Dominicana

Escrito 08 febrero 2012 - 08:10


... 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.
  • 0

#12 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 08 febrero 2012 - 09:23

Amigo Felipe.MX tuve problemas al implementar tu alternativa, en la linea 19 tienes esto:



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:



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;


  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.936 mensajes
  • LocationMéxico

Escrito 08 febrero 2012 - 09:40



... 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 :)
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.404 mensajes
  • LocationRepública Dominicana

Escrito 08 febrero 2012 - 10:18

Usted tranquilo amigo Felipe.mx de vez en cuando nos pasa, gracias por pasarme la funcion, mañana te comento mis resultados.

Saludos.
  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.404 mensajes
  • LocationRepública Dominicana

Escrito 09 febrero 2012 - 07:28

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.
  • 0

#16 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 febrero 2012 - 09:58

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...
  • 0

#17 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.404 mensajes
  • LocationRepública Dominicana

Escrito 09 febrero 2012 - 10:02

Pues la tengo tal cual como lo colocaste incluyendo la funcion Iif, y nada pues, algo mal estare haciendo.

Saludos.
  • 0