Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Insertar linebreak en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=64477)

carlos estrada 03-04-2009 05:10:36

Insertar linebreak en tiempo de ejecución
 
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:



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:

Código Delphi [-]
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:

Código Delphi [-]
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:

Código Delphi [-]
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

Cita:

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

Cita:

Empezado por carlos estrada (Mensaje 343776)
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:
Código Delphi [-]
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. :)


La franja horaria es GMT +2. Ahora son las 16:01:29.

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