PDA

Ver la Versión Completa : Insertar linebreak en tiempo de ejecución


carlos estrada
03-04-2009, 05:10:36
Tengo un problema al querer insertar un salto de linea en el caption de un header de la columna de un TNextGrid; la colección no tiene una propiedad WordWrap pero aún así en tiempo de diseño con un simple Ctrl+Enter se consigue el objetivo de separar las lineas donde uno desee:

http://i41.tinypic.com/iondlj.jpg

Pero en tiempo de ejecución al crear las columnas dinamicamente no hay forma de insertar ese linebreak; concatenar #13#10 solo inserta un par de cuadritos en el encabezado

¿alguien se ha topado con algo similar?,

PD. pensé copiar el salto de linea y colocarlo directamente en la variable (como lo he hecho por ejemplo en T-SQL para ubicar los saltos de linea) pero Delphi marca un error.

MaMu
03-04-2009, 06:36:56
Si, pero la solucion es muy facil, mira:


procedure SetNombreMultiLinea(Grilla: TNextGrid; Linea1,Linea2: String; Alto, IndexColumna: Integer);
begin
Grilla.HeaderSize := Alto;
Grilla.Columns[IndexColumna].Header.Caption := Linea1 + chr(13)+chr(10) + Linea2;
end;


Nota: recorda que el Alto debe ser suficiente para visualizar ambas lineas, sino solo seguiras viendo una linea.

Ejemplo de uso:


procedure TForm1.Button1Click(Sender: TObject);
begin
SetNombreMultiLinea(NextGrid1,'HOLA','CHANGOS',50,0);
end;


Saludos

paladincubano
03-04-2009, 11:55:33
Si quieres escribir menos, no uses el chr, y ponlo durectamente.

Eje:

Label1.Caption := 'Hola'+#13#10+'2da linea';


#10 salta de linea y #13 retorna el carro al principio de linea (normalmente lo hace sin el #13

Osea, solo bastaria poner un #10, poniendo #10#10#10 te salta 3 lineas.

saludos.

PD: ignora esto, no habia visto el final de tu post, sorry.

carlos estrada
03-04-2009, 16:09:56
PD: ignora esto, no habia visto el final de tu post, sorry.

Exactamente, ese es el problema, que el obvio #13#10 ( o chr(13)+chr(10)) no funciona ....

Eso es lo que me extraña, que en tiempo de diseño si lo hace y en ejecución no

:(

paladincubano
03-04-2009, 16:34:21
Probastes la solucion que te daban mas arriba?

carlos estrada
03-04-2009, 16:37:44
La de poner la concatenación en una función? mmmm, no, ya que debe dar el mismo resultado ...

pero nomás por no dejar dejo lo hago ..... :D


EDITO:

Lo dicho, hace exactamente lo mismo. ¿Qué diferencia habrá? mmmmmm ¿por qué esos cuadros si lo hago durante la ejecución del programa ....?

EDITO2:

Pues he estado jugando con esa función un rato .... ¡y ya funcionó! .... aún no entiendo la lógica del asunto ... si el contenido de la función lo coloco dentro de la rutina no lo hace pero fuera si ...., igual si le mando de parámetros el resultado de otra rutina no lo hace pero si le mando variables estring si ... en fin, lo bueno es que finalmente funcionó .... ¡gracias a ambos!

Al González
03-04-2009, 20:20:48
EDITO2:

Pues he estado jugando con esa función un rato .... ¡y ya funcionó! .... aún no entiendo la lógica del asunto ... si el contenido de la función lo coloco dentro de la rutina no lo hace pero fuera si ...., igual si le mando de parámetros el resultado de otra rutina no lo hace pero si le mando variables estring si ... en fin, lo bueno es que finalmente funcionó .... ¡gracias a ambos!
Que bueno que encontraste una solución, pero ¿podrías mostrarnos el código que no funcionó?

Gracias.

Al González. :)

carlos estrada
03-04-2009, 23:43:12
Pues mira .... como mencioné estuve "trasteando" un poco diferentes formas para encontrar algo que funcionará, la función a primera instancia no funcionó de esta forma:

GridActivo.ClearRows;
For i:=GridActivo.Columns.Count-1 downto 9 do
GridActivo.Columns.Delete(i);

For i:=3 To DM.spTransitos.FieldCount-1 do Begin
Linea1 := Copy(DM.spTransitos.Fields[i].DisplayName,1,Pos(' {',DM.spTransitos.Fields[i].DisplayName));
linea2 := Copy(DM.spTransitos.Fields[i].DisplayName,Pos('{',DM.spTransitos.Fields[i].DisplayName),50);

GridActivo.Columns.Add(TNxNumberColumn, IntToStr(GridActivo.Columns.Last.Index));

SetNombreMultiLinea(GridActivo,Linea1,Linea2,50,GridActivo.Columns.Last.Index);
End;


Donde dejé el código que elimina las columnas para volverlas a crear, cuando dije que ya funcionaba fue por que entre prueba y prueba comenté ese FOR. Luego cai en cuenta que si funcionaba al actualizar columnas ya creadas y no cuando eran columnas generadas al vuelo, pero ya no postie eso por que definitivamente tenia que ser algo difernte entre las columnas creadas por código y las que cree en tiempo de diseño. Poco después de analizarlo vi que mi error era que debía colocar en true la propiedad Multiline de Header :(.
Ya con este cambio el clásico #13#10 funciona perfectamente.

La verdad este fue un error tonto que me ocurrió por hacer un nuevo proyecto usando un ejemplo como plantilla, no volverá a ocurrir :o

Al González
04-04-2009, 00:09:32
No te preocupes, mi inquisición fue en aras de evitar la concepción de un mito. :)