Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Dbgrid ajustar tamaño de Columna (https://www.clubdelphi.com/foros/showthread.php?t=89697)

shoulder 19-01-2016 18:40:40

Dbgrid ajustar tamaño de Columna
 
Hola no se si pido algo ilogico, se puede ajustar el tamaño de la columna en un dbgrid como la opcion del Excel de ajuste de texto Wrap (o sea ver la oracion completa no importando el tamaño de la columna?) que si le doy a la columna un Width de 200 en ese espacio complete la frase como si tuviera margenes .

Ejemplo: "Este formulario
contiene 200
caracteres"

Gracias.

aposi 19-01-2016 19:20:47

mira esto a ver si te sirve:

http://www.clubdelphi.com/foros/show...justar+columna

shoulder 19-01-2016 20:40:54

dbgrid Tamaño Columna
 
Hola primero gracias por la respuesta. Pero en realidad no quiero que el ancho de la columna lo determine el tamaño del campo, sino que funcione come el wrap del excel. es decir si yo le doy un ancho de 200 y tengo 10 palabras que se ajusta la oracion en tantos renglones entren en ese ancho fijo.
Gracias.

Casimiro Notevi 19-01-2016 23:21:15

No se entiende, ¿lo que quieres es cambiar el tamaño del texto?

shoulder 20-01-2016 00:53:08

dbgrid
 
Hola, lo que quiero hacer es como el wrap del excel, en una columna por ejemplo de 100 caracteres introducir 500 caracteres entonces se modifica el alto de la celda pero siempre respetando el tamaño de la columna y siempre se ve el total del campo a mostrar.
Gracias.

Casimiro Notevi 20-01-2016 00:57:21

No sé cómo es el "wrap del excel", pero creo entender que quieres ajustar el alto de la fila.

shoulder 20-01-2016 01:17:47

dbgrid
 
Si es asi, tengo varias columnar a mostras en un dbgrid en un form, entonces me vendria bien usar el wrap, quiere decir que segun la cantidad de caracteres del campo a mostrar se modifica el el alto de la celda y en sintesis en toda la fila.

estoy investigando este link pero no me sale todavia.

http://forum.lazarus.freepascal.org/...?topic=21305.0

Neftali [Germán.Estévez] 20-01-2016 14:24:53

Se puede hacer, pero tiene un inconveniente.
La única forma de ajustar el tamaño de la columna al texto que se contiene es recorrer todos los registros para obtener el texto más largo.
A partir del texto y utilizando la fuente del grid, en la clase TCanvas hay un método que te da el ancho.

Ese es el ancho que deberías dar a la columna, para que todos los textos se mostraran completos (siendo el mínimo).

El problema es la parte subrayada. Estás haciendo un trabajo innecesario por el volumen de datos y que el algunos casos puede ser muy costoso. y "gastando" también tiempo en el recorrido.

En algún caso particular en que tuvieras muy pocos registros, se podría justificar, pero creo que no es una buena práctica.

Creo que esto es lo que pides, pero fíjate que tal y como te he comentado, en el interior del procedimiento realiza un recorrido del TODO el dataset asociado.

AgustinOrtu 20-01-2016 14:58:17

Otra forma podría ser retornar en la misma consulta el valor de cadena más largo

Es mucho más rápido que recorrer el dataset, incluso si tiene disable controls

Neftali [Germán.Estévez] 20-01-2016 15:13:45

Cita:

Empezado por AgustinOrtu (Mensaje 501375)
Es mucho más rápido que recorrer el dataset, incluso si tiene disable controls

Correcto.

Cita:

Empezado por AgustinOrtu (Mensaje 501375)
Otra forma podría ser retornar en la misma consulta el valor de cadena más largo

La pregunta es, si podrás hacer eso en todas las Bases de datos.
Por ejemplo, yo trabajo con IB habitualmente y no se me ocurre forma...

AgustinOrtu 20-01-2016 15:43:17

Hola German,

Hasta donde se, la funcion Len es parte del estandar SQL

Me llamaria la atencion que algun proveedor no la soporte. En Firebird 2 tiene soporte

Y en el peor de los casos se puede buscar (o implementar :)) una funcion UDF como este enlace

Neftali [Germán.Estévez] 20-01-2016 15:55:18



:(:(:(

Seguramente se podrá implementar, no digo que no...
Por otro lado los UDF's en versiones antiguas de IB dan problemas de estabilidad.

AgustinOrtu 20-01-2016 16:01:14

La verdad nunca use Interbase, pero que "sorpresita", para mi es como decir que no este implementado el LIKE, no se :)

shoulder 20-01-2016 16:38:25

dbgrid wrap
 
Hola lo que busco es el wrap no el autosize, lo encontre pero a mi no me funciona, les paso el ejemplo y el link, pero me entra en un loop infinito, es decir al fijar el ancho de columna el campo agranda el alto de la fila para que entre todo ahi. Probe toda la mañana veo en el loop que me lo hace pero no corta. En sistensis seria el mutiline de una fila de dbgrid.






Código Delphi [-]
type
  THackDBGrid = class (TDBGrid)
  public
    property RowHeights;
  end;

procedure TFormx.DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);

var
  HackGrid: THackDBGrid;
  Ind: Integer;
  lRec: TRect;
  Str: AnsiString;
  DS: TDataSet;
  uForm, uCurr: Cardinal;
  NH, valor: Integer;
begin
    DS  := (Sender As TDBGrid).DataSource. DataSet;
    Ind := DS.RecNo;
    Str := DS.FieldByName (Column.FieldName).DisplayText;
    lRec := Rect;
    lRec.Left := lRec. Left + 1;
    lRec.Right:= lRec. Right - 1;
    (Sender As TDBGrid).Canvas. FillRect (lRec);
    NH := lRec. Bottom - lRec.Top;
    //Set an alignment to the text in the cell
    case Column. Alignment of
      taLeftJustify: uForm := DT_SINGLELINE or DT_LEFT;
      taRightJustify: uForm:= DT_SINGLELINE or DT_RIGHT;
      taCenter: uForm:= DT_SINGLELINE or DT_CENTER;
    end;
    //Set an advanced alignment to the text in the cell (Tag value of the field is used)
    valor := DS.FieldByName(Column.FieldName).DataSize;


    if valor > 50 then
     begin
       uForm := DT_WORDBREAK or DT_CALCRECT;
       NH := DrawText ((Sender As TDBGrid).Canvas. Handle, PAnsiChar (Str),-1, lRec,     uCurr)    + 2;
       uForm := DT_WORDBREAK;
       lRec.Bottom := lRec.Top + NH;
       HackGrid:= THackDBGrid (DBGrid3);
       HackGrid.RowHeights[Ind]:= NH;

      uCurr:= uForm;
      DrawText ((Sender As TDBGrid).Canvas. Handle, PAnsiChar (Str),-1, lRec, uCurr);

     end;

el link original esta aqui.

http://www.delphipages.com/forum/sho...d.php?t=216440

o

http://www.progtown.com/topic106385-...ne-dbgrid.html

ecfisa 20-01-2016 18:13:26

Hola.

A partir de la versión 2.0 de Firebrid, la función que devuelve el largo de una cadena es CHAR_LENGTH(), CHARACTER_LENGTH(); entiendo que en Interbase es la misma.

Saludos :)

Neftali [Germán.Estévez] 20-01-2016 19:01:43

No se cómo será en las versiones nuevas, en las antiguas no está disponible ninguna de las 2.

ecfisa 20-01-2016 19:11:45

Entonces seguramente sea propia de Firebird e Interbase no la haya implementado...

Pero podría hacerse un procedimiento almacenado para realizar esa tarea: Buscar valores con longitud 5 en una consulta

Saludos :)

shoulder 20-01-2016 19:35:06

dbgrid wrap
 
1 Archivos Adjunto(s)
Lo que tendria que lograr es como se muestra en la imagen del link (ultima imagen) donde dice
cell word wrap-

http://www.scalabium.com/smdbgrid.htmcceell word-wrap.
cell word-wrap

Casimiro Notevi 20-01-2016 19:45:19

Sí, ya lo habíamos entendido.

shoulder 21-01-2016 02:17:13

dbgrid
 
Hola ya lo solucione con este componente, funciona bien.

http://www.scalabium.com/


La franja horaria es GMT +2. Ahora son las 14:33:21.

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