Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   DBGrid que adapte sus columnas en función del ancho del contenedor (https://www.clubdelphi.com/foros/showthread.php?t=88098)

Kenobi 12-04-2015 15:16:50

DBGrid que adapte sus columnas en función del ancho del contenedor
 
Hola, en lazarus configuro el dbgrid para se adapte a su contenedor, luego configuro las columnas(las cuales por su naturaleza no deben ser del mismo ancho), el problema ocurre cuando maximizo el form, el dbgrid se adapta pero las columnas no, si existiese la forma de configurar el height de las columnas mas que por un valor fijo, con una relación porcentual con el ancho de su contenedor ....
por supuesto estoy buscando preferiblemente propiedades cosa de evitar llenar de codigo de presentación a mi aplicación

espero se entienda mi problema ....gracias por su atención estoy seguro que esta justo alli en mis narices pero la verdad no lo veo ...
Saludos

pacopenin 13-04-2015 10:09:46

Puedes utilizar un RxDBGrid. Tiene la propiedad AutoSizeColumns.
Yo particularmente utilizo el evento onResize. Doy a cada columna un porcentaje de ancho en la propiedad Tag y calculo el ancho correspondiente cuando se redimensiona.

Kenobi 14-04-2015 23:20:15

Podrias explicarte un poco mejor
 
Hola, la verdad no entiendo mucho tu respuesta, (ojo ignorancia mia) al evento onrisize que te refieres es el del form, y como utilizar la propiedad tag, esa nunca la he utilizado de hecho me entero de su existencia( la ignorancia no tiene limite) podrias darme algo de codigo a modo de ejemplo ...

Gracias ....

AgustinOrtu 15-04-2015 00:57:37

La propiedad Tag almacena un entero, y esta para meter "lo que nos de la gana", no afecta en absolutamente nada al comportamiento del componente

Como dice pacopenin, a cada columna le asignas un porcentaje y despues en base a eso calculas el ancho (cómo, no se :D)

pacopenin 15-04-2015 10:03:50

Efectivamente. La propiedad Tag es tal cual la explica AgustinOrtu.

Te pongo un ejemplo de como lo hago.

Código Delphi [-]
procedure TFBscInventario.JvPanel1Resize(Sender: TObject);
var
 l : Integer;
begin
  inherited;
  l := smDBGridLin.Width - 175;
  smDBGridLin.Columns[0].Width := (l * smDBGridLin.Columns[0].Tag) div 100;
  smDBGridLin.Columns[1].Width := (l * smDBGridLin.Columns[1].Tag) div 100;
end;

o así.

Código Delphi [-]
procedure TFFacturaVenta.FormResize(Sender: TObject);
var
 i, l, tot : Integer;
begin
  inherited;
  l := smDBGridUI.Width - 27;
  tot := 0;
  for i := 0 to smDBGridUI.Columns.Count - 2 do
   begin
    smDBGridUI.Columns[i].Width := (l * smDBGridUI.Columns[i].Tag) div 100;
    Tot := Tot + smDBGridUI.Columns[i].Width;
   end;
  smDBGridUI.Columns[(smDBGridUI.Columns.Count - 1)].Width := l - Tot;
end;

Ésta última lo que hace es que ajusta la última columna al ancho restante.

Kenobi 15-04-2015 16:43:29

Nuevo detalle molesto
 
Hola gracias a sus respuestas logre hacer el siguiente procedimiento valido para los tipos dbgrid

Código Delphi [-]
Procedure adaptar_Grid(Grid:TDbGrid);
var
  ancho,i : integer;
begin
  ancho := Grid.Width;
  for i := 0 to Grid.Columns.Count -1 do
  begin
  Grid.Columns[i].Width := (ancho * Grid.Columns[i].tag) div 100 ;
  end;
end;

Sin embargo y dada la naturaleza de mis forms esta ocurriendo algo no muy deseable:
algunos de mis forms tienen dentro de si control pageControl dentro de los cuales en distintos tabs hay dbgrids, con el uso del procedure anterior en el evento onrezise del form los configuro a todos:

Código Delphi [-]
adaptar_grid(dbgrid1);
adaptar_grid(dbgrid2);
.
.
.
adaptar_grid(dbgrid..N);
Mas sin embargo el unico que realmente se adapta es aquel que se encuentre visible al momento de re dimensionar el form

esa es mi nueva duda
Gracias por todo

AgustinOrtu 15-04-2015 17:33:02

Y cual es el problema si los que no se redimensionan no se ven??

Kenobi 15-04-2015 18:03:05

Se veran al momento de hacer clic en el tab correspondiente
 
Hola, gracias por tu respuesta, el problema es que la navegación entre los tabs del form es cosa frecuente de forma que si solo se redimenciona uno se ven muy mal el resto ...
No se si me explico, vuelvo a describir mi form

un form muestra la información de una entidad en particular, esta información esta distribuida en componentes db en un panel con alineación top, el resto del form esta ocupado por un control pageControl dentro del cual hay varios tabs(uno por cada tabla relacionada) donde muestro la información pertinente de cada tabla relacionada(relaciones uno a muchos) pues claro la idea es que los grids de estos tabs mantengan cierta coherencia entre si en cuanto al diseño y como luego de consultar un registro todas la entidades se actualizan, el usuario revisara(o no ) cada una de esas pestañas en busca de la información que para el momento considere pertinente, por tal razon si que es un problema,
gracias una vez mas por tu comentario ....

pacopenin 15-04-2015 18:08:17

Supongo que será porque no usas columnas persistentes en el grid. Probablemente tenga que llamar a adaptar_grid después de abrir las tablas/qwerys correspondientes....o al cambiar de tab.

AgustinOrtu 15-04-2015 18:22:09

En donde llamas al proceso que adapta los grid? Proba hacerlo en algun evento del PageControl, por ejemplo en el OnPaint

Kenobi 15-04-2015 21:09:19

si uso columnas persistentes
 
si que uso columnas persistentes en mis grids de hecho el grid tiene una propiedad autofill que adapta perfectamente las columnas, solo que las distribuye uniformemente lo cual no es deseable porque el ancho de los contenidos es variable ....

Kenobi 15-04-2015 21:19:30

por cierto donde consigo los Rx
 
busco y busco y no encuentro un repositorio de los rx confiable, algunos que descargo no instalar por errores (no de dependencias) que otros componentes grid me sugieren, por alli encontre unos llamados virtualtree que según se puede lograr algo mas no tienen componentes db....
Gracias

Kenobi 15-04-2015 21:34:28

Solucionado
 
solo era cuestion de colocar el adaptar_grid en cada onresize correspondiente a cada tab, antes lo hacia todos los adaptar grid en el rezise del pageControl(lo hacia así por aquello de centralizar el código) muchas gracias por lo pronto estoy conforme mas sin embargo tengo otras dudas sobre lazarus que posteare en la brevedad ...
Gracias mil


La franja horaria es GMT +2. Ahora son las 14:54:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi