PDA

Ver la Versión Completa : Dbgrid ajustar tamaño de Columna


shoulder
19-01-2016, 18:40:40
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/showthread.php?t=2565&highlight=ajustar+columna

shoulder
19-01-2016, 20:40:54
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
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
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/index.php?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 (http://www.swissdelphicenter.ch/en/showcode.php?id=2041), 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
Es mucho más rápido que recorrer el dataset, incluso si tiene disable controls
Correcto.

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 (http://www.w3schools.com/sql/sql_func_len.asp) es parte del estandar SQL (http://users.atw.hu/sqlnut/sqlnut2-chp-4-sect-4.html)

Me llamaria la atencion que algun proveedor no la soporte. En Firebird 2 tiene soporte (http://www.janus-software.com/fbmanual/manual.php?book=psql&topic=51)

Y en el peor de los casos se puede buscar (o implementar :)) una funcion UDF como este enlace (http://mujweb.cz/iprenosil/interbase/ip_ib_code_string.htm#_code_strlen)

Neftali [Germán.Estévez]
20-01-2016, 15:55:18
http://s26.postimg.org/5lle2grk9/error.png

:(:(:(

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







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/showthread.php?t=216440

o

http://www.progtown.com/topic106385-multiline-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() (http://www.firebirdsql.org/refdocs/langrefupd20-char-length.html); 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 (http://www.clubdelphi.com/foros/showthread.php?p=477251#post4772511)

Saludos :)

shoulder
20-01-2016, 19:35:06
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
Hola ya lo solucione con este componente, funciona bien.

http://www.scalabium.com/

Casimiro Notevi
21-01-2016, 09:58:20
Pues si solamente te interesa esa característica, puedes ver el código fuente del mismo y adaptarlo a un dbgrid estandar.
Ese componente está basado en el dbgrid de las RX lib.