Página 1 de 1

Label multilínea

Publicado: 29 Dic 2009, 15:16
por Jonny
Hola

Estoy intentando hacer un label en el que el texto aparezca en varias líneas, pero aun habiendo mirado todos los estilos de los controles no doy con la manera de hacerlo.
he visto alguna constante para hacerlo en otros controles, por ejemplo $BS_multiline pero en los labels no funciona.
El caso es, que si no es con label exactamente me da igual, mientras quede como si fuera ese tipo de control y pudiera poner un texto en varias líneas, ya que es un poco largo.
¿Alguien sabe como hacerlo?
a poder ser, que no sea en edits....

Gracias,

Salu2!

Re: Label multilínea

Publicado: 29 Dic 2009, 15:48
por Chefito
Puedes poner un texto en varias lineas utilizando saltos de lineas o retornos de carro: @lf, @cr, @crlf.
Ejemplo:

Código: Seleccionar todo

GUICtrlCreateLabel("Linea 1"& @lf & "Linea 2" & @lf & "Linea 3", 10, 30)
Saludos.

Re: Label multilínea

Publicado: 29 Dic 2009, 17:30
por Jonny
Hola

Así lo probé antes de mirar la ayuda incluso, pero nada. solo muestra la primera línea...
Por eso miré la ayuda, porque creí que podía tener que ver con tener que definir que fuera multilínea, pero ya veo que no.

yo tengo algo como:
GuiCtrlCreateLabel("Texto 1"&@CRLF&"Texto 2"&@CRLF&"Texto 3", 10, 30, 100, 17, $SS_Center)
y no funciona. pero con algo como lo que tú has puesto tampoco (sin especificar ancho, alto y estilo).

Salu2!

Re: Label multilínea

Publicado: 29 Dic 2009, 18:40
por Chefito
Anda que.....a ver si lo que pasa es que le has puesto muy poca altura al label y por eso solo ves la primera linea...... (valor 17). Hazla más grande a ver que tal.

Re: Label multilínea

Publicado: 29 Dic 2009, 19:56
por Jonny
Hola

nada, también lo pensé y probé ... solo se vé la primera línea.
Además de los labels ... ¿Otra forma de mostrar texto medianamente largo?

Ya que estamos, se me había ocurrido hacerlo de otra manera:
En vez de un texto estático con labels, hacer que el texto fuera apareciendo poco a poco, de izquierda a derecha, para ir leyéndolo conforme aparece
¿Es eso posible?
¿Como?
Eso quizá podría quedar mejor estéticamente ¿?

Salu2!

Re: Label multilínea

Publicado: 29 Dic 2009, 21:25
por Nahuel
Y esto? cómo lo ves? :

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

GUICreate("", 600, 400)
GuiCtrlCreateLabel("Linea 1"&@CRLF&"Linea 2"&@CRLF&"Linea 3", 10, 30, 100, 17, $SS_Center)
GuiCtrlCreateLabel("Linea 1"&@CRLF&"Linea 2"&@CRLF&"Linea 3", 100, 30, 100, 50, $SS_Center)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
No puede ser que sólo veas una línea. Algo se te está escapando. Otra forma podría ser crear un control Edit de sólo lectura. Así, hasta podrías tener barras de dezplazamiento para el texto.
Ej:

Código: Seleccionar todo

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Inet.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 493, 392, 305, 147)
$Edit1 = GUICtrlCreateEdit("", 22, 18, 449, 345,BitOR($ES_READONLY,$WS_HSCROLL,$WS_VSCROLL))
GUICtrlSetData(-1, _INetGetSource("www.google.com"))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Y para hacerlo fácil y quizás un poquito más bonito, podrías hacer una marquesina con un control IE embebido.

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


GUICreate("Marquesina", 200,60)
_CrearMarquesina("Esta es una marquesina",10,10,180,25)
GUISetState()  


; Waiting for user to close the window
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

GUIDelete()

Func _CrearMarquesina($s_texto, $i_izq, $i_top, $i_w, $i_h)
	$oIE = ObjCreate("Shell.Explorer.2")
	$GUIActiveX = GUICtrlCreateObj($oIE, $i_izq, $i_top, $i_w, $i_h)
	$oIE.navigate("about:blank")
	$oIE.document.body.topmargin=0
    $oIE.document.body.leftmargin=0
    $oIE.document.body.scroll="no"
    $oIE.document.body.innerHTML = "<marquee>" & $s_texto & "</marquee>"	
EndFunc

Claro que no queda ahí, se puede perfeccionar como más te guste. los tags de marquee en HTML aceptan muchos estilos y colores. Pero eso se lo dejo al interesado.

Re: Label multilínea

Publicado: 29 Dic 2009, 22:14
por Jonny
Hola

Muchas gracias por todos los códigos.
El de la marquesina, me ha gustado mucho... es casi lo que quería.
Aunque, yo quería concretamente que el texto apareciera por un lado y desapareciera por otro (sin volver a aparecer) no se si se podrá hacer con html, por eso de aprovechar el código que hiciste.

En el primer código, el de los labels, es curioso pero sí, en el primer label que creas solo veo una línea ¿tú ves todas?
en cambio en el segundo label que has puesto sí veo las tres líneas. Tiene que tener algo que ver alguno de los parámetros, que no son exactamente los mismos en ambos labels, pero yo no le veo mucho sentido a eso (aunque es lo único que se me ocurre).

or otra parte, me has dado una idea con lo de poner código html... Puedo hacer el diseño con html y me surge una duda entonces:
¿Si pongo links al clicar funcionaría? Así como en algunos programas como Windows live messenger, norton... y alguno más que hay por ahí, con interfaz al estilo página web.

Salu2!

Re: Label multilínea

Publicado: 30 Dic 2009, 09:29
por Ximorro
¡Hombre Jonny cuánto tiempo!

Yo he usado labels multilinea sin problemas, vuelve a revisar tu label, evidentemente 17 de alto es muy poco, ponle 37 y verás las tres líneas ¡a menos que esté tapado por otro control!

El único problema de estos labels es que no se puede centrar horizontalmente, SS_CENTER sólo centra verticalmente y no hay una variante para la otra dirección.

Claro que en el primer label de Nahuel ves una línea, ¡como que es tu label! El segundo que se ve es el tuyo... con más altura para que se vean las líneas. Efectivamente, tenía que ver con los parámetros. Jonny, Jonny, estás dormido, con lo fácil que era compararlos. :smt003

Chico, sobre la marquesina sólo tienes que mirar en internet el tag marquee de html, por ejemplo aquí:
http://www.webtaller.com/manual-html/marquee.php

Ahí se puede leer que el parámetro loop indica las veces que da vueltas, con lo que ahí pondrías una y ya está, no se repite.

Efectivamente con un objeto embebido Shell.Explorer insertas una página web, y como tal por supuesto que los enlaces funcionarían. Como puedes ver no hace falta cargar una página de un fichero de internet o local, puedes crearlo directamente en un string como ha hecho muy ingeniosamente Nahuel.

Yo usé esto para hacer una pequeña ayuda en un programa, y poder formatearlo un poco con estilos de texto, pero te advierto que tiene el problema de que los ajustes del navegador del usuario afectarán al aspecto de tu página, a mí me tocó poner valores absolutos fijos a los tamaños de las fuentes, por ejemplo.

Pues ale bienvenido de nuevo. ¡Y a ver si nos publicas alguno de tus programas, qué parece que estás haciendo muchas cosas!

Re: Label multilínea

Publicado: 30 Dic 2009, 14:00
por Jonny
Hooola!

sí, hacía ya tiempo ... que no escribía por aquí. Ando haciendo muchos programas, pero hasta que no termine el que aumente las horas del día ... jejejeje.

Pues la verdad, no se. El primer label, que es cierto que es el mío, modificando solo la altura... a todos los valores imaginables (37 no se me ocurrió) eso no daba resultado... cosas de esas raras...
Seguro, que lo pongo en otro programa con otro código totalmente diferente y como la seda.... (cosas más raras he visto).
Lo de poner html en el programa me ha llamado la atención, pero es cierto lo que dices de que puede condicionar algo la configuración del navegador... la verdad, que con lo fácil que es hacer una interfaz con AutoIt (respecto a html) que no tengo casi ni idea...

¿No hay alguna forma en AutoIt de mover texto?
y... por si me animara ¿Como se haría para que un enlace realizara una acción ya con código de AutoIt?... como si pulsaramos en un botón creado con GuictrlCreateButton() por ejemplo?

Seguiré jugando con los numeritos en los labels .. jeje.

Salu2!

Re: Label multilínea

Publicado: 30 Dic 2009, 14:35
por Ximorro
¿Qué quieres decir con mover texto? Si te refieres a algo parecido al marquee ese de html, se me ocurre por ejemplo que puedes ponerlo en una etiqueta y mover la misma. Para hacerlo sin mover la etiqueta, más parecido a marquee, tendrías que ir cambiando el texto de la misma para que dé ese efecto, no sé si parpadearía...

Lo del enlace con código de AutoIt, en html directamente no se puede, bueno, sí, montándolo en el servidor con una extensión que hay por ahí, por ejemplo aquí:
http://www.emesn.com/autoitforum/viewfo ... =6&start=0

Pero sin complicarse tanto se puede simular simplemente con un label, capturas el evento con GUIGetMsg exactamente igual que si fuera un botón y ya está, sólo que evidentemente no se presionará, el label no cambia de aspecto, pero sí te notifica del clic.
Puedes dar al label aspecto de enlace html cambiando el color a azul con GUICtrlSetColor y poniéndolo subrayado con GUICtrlSetFont($label, -1, -1, 4).
Ah, y ya puestos puedes ponerle el cursor de la manita con GUICtrlSetCursor($label, 0)

Re: Label multilínea

Publicado: 30 Dic 2009, 17:45
por Jonny
Hola

Quizá sea muy básico.... pero ¿Como se mueve un label?
y ¿como moverías el texto dentro del label, sin que este se mueva?....

Salu2!

Re: Label multilínea

Publicado: 30 Dic 2009, 23:20
por Nahuel
La única forma que por el momento se me ocurre para hacer lo que querés incluye ciclos que causan que la ventana no responda. La forma más "limpia" que sé, es con IE embebido.

Acá hice un ejemplo de una etiqueta actuando como marquesina.

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <Array.au3>

$Form1 = GUICreate("Form1", 337, 59)
$Label1 = GUICtrlCreateLabel("", 20, 16, 292, 17)
GUISetState(@SW_SHOW)

_AnimarEtiqueta($Form1, $Label1, "                         Este es un texto relativamente largo que quiero mostrar en una marquesina sin usar IE embebido")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _AnimarEtiqueta($h_Win, $h_CI, $s_Texto, $s_sep = " ", $i_vel=100, $i_sleep_inicio = 700)
	Local $a_dim = ControlGetPos($h_Win, "", $h_CI)
	If Not IsArray($a_dim) Then Return SetError(1)
	Local $i_ancho = $a_dim[2]
	Local $a_texto_split = StringSplit($s_Texto,"")
	Sleep($i_sleep_inicio)
	For $i=1 To $a_texto_split[0]
		$s_Marq = _ArrayToString($a_texto_split, $s_sep, $i)
		GUICtrlSetData($h_CI,$s_Marq)
		Sleep($i_vel)
	Next
EndFunc

A lo mejor alguien la puede optimizar, pues como está ahora funciona muy mal. Era tan sólo como ejemplo.

Re: Label multilínea

Publicado: 31 Dic 2009, 07:45
por Jonny
Hola

Gracias, intentaré mejorarlo para usarlo.

Salu2!

Re: Label multilínea

Publicado: 31 Dic 2009, 20:20
por Nahuel
Mm, ahora que le doy una segunda mirada, se podría mejorar sacando el StringSplit() y el _ArrayToString, pues hacen lento el código. Se puede reemplazarlas con un StringTrimLeft o Right.

Re: Label multilínea

Publicado: 04 Ene 2010, 10:08
por Ximorro
Para mover la etiqueta en sí (o cualquier otro control) se hace con ControlMove:
ControlMove("título", "texto", controlID, x, y [, ancho [, alto]])


"título" y "texto" son para identificar la ventana, lo mejor es poner un handler en "título". controlID es el ID de la etiqueta, el que te da al crearla.

x, y se dan en coordenadas relativas a la ventana.

Como puedes ver esta función también es la que se usa para cambiar de tamaño un control.

saludos