Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Colocar Ancho De columna de un DBGrid dependiendo del ancho del maximo campo guardado (https://www.clubdelphi.com/foros/showthread.php?t=61446)

gulder 07-11-2008 21:01:36

Colocar Ancho De columna de un DBGrid dependiendo del ancho del maximo campo guardado
 
hola foro como andan espero que bien bueno para los que no me entendieron lo del lo que trado de decir en el titulo es lo siguiente:

tengo una base de datos donde tengo los siguentes campos Id, NombreApellido, Correo yo cargo los datos de esta tabla en un DBGrid hasta hay todo bien lo que yo quiero es que cada columna coja el tamaño del maximo registro guardado les explico tengo los siguientes registros

Código:

id            NombreApellido                            Correo

01          Jaime valenzuela                          Jaimevalenzuela@hotmail.com
02          polo gil                                      pologil@hotmail.com
03          lili gil                                          liligil@hotmail.com

entonces yo quiero que el ancho de la columna NombreApellido sea el ancho del nombre y apellido mas largo encontrado en esta columna para este caso seria Jaime valenzuela, esto para que se logre leer completamente el nombre mas largo todo esta aplicado para las otras columnas en general espero que me entendan que es lo que quiero salaudos de antemano gulder-gan

coso 07-11-2008 23:40:12

Hola, seria algo asi:

Código Delphi [-]
var
     q : TADOQuery;
     w : integer;
     i : integer;
     k : integer;
begin
     q := TADOQUery.Create(self);
     q.Connection := ADOConnection1;
     q.Active := false;
     q.SQL.Text := 'select * from tabla';
     q.Active := true;
     q.First;
     w := 0;
     while not q.Eof do
     begin
          k := length(q.FieldByName('CAMPO').Asstring);
          if k > w then w := k;
          q.Next;
     end;
     DBGrid1.Columns[1].Width := DBGrid1.Canvas.TextWidth('X')*w;
end;

Aunque en teoria, esto tendria que funcionar (a mi no me lo ha hecho pues no me reconoce la funcion length, aunque existe en sql en general)

Código Delphi [-]
q.Active := false;
q.SQL.Text := 'select max(length(CAMPO)) as max_len from tabla';
q.Active := true;
 
DBGrid1.Columns[1].Width := DBGrid1.Canvas.TextWidth('X')*q.FieldByName('MAX_LEN').Asinteger;

gulder 08-11-2008 01:08:52

hola coso interesante tus respuesta estoy probando algo con la misma funcion LENGTH y tampoco me la reconoce no se por que sera habra que agregar algo o que, gracias esta muy buena en teoria sirve espero lograr hallar lo del LENGTH saludes gilder-gan

Nota: para que funcione deben utilizar es LEN saludos

Lepe 08-11-2008 12:27:34

Supongo que el problema viene por el tipo de letra no proporcionial del dbgrid. Como todos los carácteres no tienen el mismo ancho, no podemos hacer una aproximación, (usa la fuente courier).

Aquí tienes una rutina que funciona muy bien
Código Delphi [-]
{-----------------------------------------------------------------------------
  Procedure: AjustaDisplayWidth
  Author:    Lepe
  Date:      03-may-2005
  Arguments: D: TDataSet;
            const MaxAncho: Integer = 150; Maximo ancho para cada campo
            const ExtraChars:Integer = 0; para ver en un grid mejor.
  Result:    None
  Purpose:  Ajustar el tamaño de cada columna según el dato más largo.
-----------------------------------------------------------------------------}
procedure AjustaDisplayWidth(D: TDataSet;
                             const MaxAncho: Integer = 150;
                             const ExtraChars:Integer = 0);
var
  i, nIdx: Integer;
begin
  if D.Active then
    try
      D.DisableControls;
      D.First;
      nIdx := 0;
      while not D.Eof do
      begin
        for i := 0 to pred(D.FieldCount) do
        begin
          // en la 1ª vuelta reseteo el displayWidth existente
          if (nIdx = 0) then
            D.Fields[i].DisplayWidth := 1;
          D.Fields[i].DisplayWidth := EnsureRange(
            Max(D.Fields[i].DisplayWidth,
            Length(D.Fields[i].AsString) +
            IfThen(D.Fields[i].DataType = ftFloat, 3,
            ExtraChars) // añadimos espacios para ,00
            ),
            0, MaxAncho);
        end;
        D.Next;
        if nIdx = 0 then
          Inc(nIdx);
      end;
    finally
      D.First;
      D.EnableControls;
    end; // D.active
end;
No puedo decirte los "uses" porque está en una unidad grande, pero con F1 los averiguarás.

Para llamarlo:
Código Delphi [-]
ajustaDisplaywidth(query1);
Si lo ejecutas, el ancho se ajustará al último carácter, así queda la información muy "apretada", de ahí el parámetro "extrachars" que permite agregar 1 o dos espacios al final de cada columna para que el grid quede más limpio.

La rutina ifthen es la que viene en la unidad Maths.

Edito: Desde luego no es nada eficiente, pero cumple su cometido.

Saludos


La franja horaria es GMT +2. Ahora son las 00:32:20.

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