evitar parpadeo del cursor sin usar screenupdating

13/10/2006 - 18:40 por Ivan | Informe spam
Hola a todos

estoy haciendo una macro para simular la escritura en directo en un
cuadro de texto de la barra de dibujo. Parece funcionar bastante bien,
pero no logro evitar el parpadeo continuo del cursor mientras se
ejecuta. Explico un poco el funcionamiento (y expongo el codigo al
final).

Lo que hace el codigo es ir 'extrayendo' caracter tras caracter de un
texto depositado en una celda de una hoja (oculta) e irlo concatenando
en el cuadro de texto.

para conseguir un retardo de tiempo que permita ver la secuencia de
'escritura' utilizo una funcion de las APIs (facilitada por HM) que
'crea? retardos de x milisegundos en la ejecucion del codigo (no estoy
seguro de que sea esto lo que haga, pero supongo que sera algo asi).

el problema es que no puedo (o al menos no he podido) usar
App...Screenupdating porque entonces oculta el proceso y muestra solo
el resultado final (el texto completo), y no se si hay otra forma para
evitar el parpadeo del cursor, o al menos intentar atenuarlo al maximo.

el codigo es el siguiente (posiblemente haya formas mejores/mas
eficientes de lograr lo mismo ¿quizas con sendkeys?)

Private Declare Sub Retardo Lib "kernel32" _
Alias "Sleep" (ByVal Milisegundos As Long)

Sub EscribirEnVivoCuadroT()
Dim Pos As Byte, Fin As Byte, lt As String
Dim hj As Worksheet
QuitarTexto 'elimina el cuadro de texto si existe
CrearCuadroTexto 'crea un nuevo cuadro de texto
Set hj = ThisWorkbook.Worksheets("Hoja3")
With Worksheets("Hoja1").Range("a1")
Fin = Len(.Value)
hj.Shapes(1).TextFrame.Characters.Text = ""
For Pos = 1 To Fin
lt = .Characters(Pos, 1).Text
DoEvents
Retardo 130
With hj.Shapes(1)
With .TextFrame
.HorizontalAlignment = xlHAlignCenter
With .Characters
With .Font
.Name = "ZephyrScript"
.Size = 16
End With
.Text = .Text & lt
End With
End With
End With
Next
End With
Set hj = Nothing
End Sub

si podeis echarme una mano de nuevo os lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#6 Ivan
17/10/2006 - 03:17 | Informe spam
hola de nuevo Hector Miguel, ... tarde,. pero vuelvo a darte la
barrila si tienes un hueco

he estado dandole vueltas y mas vueltas a tus palabras, y, claro, ha
ocurrido lo inevitable...he acabado mareado. De ahí un poco la
tardanza.

te comento:

lo 1º que he hecho ha sido cambiar la forma de acceso a las imagenes.
Te confieso que no acabo de entender lo que se refiere a como incrustar
y 'proveer' las imagenes. Lo que he hecho es cargarlas una sola vez por
codigo pero con AddPictures (no consigo ayuda sobre'Pictures', me dice
elemento oculto) y (creo que) vinculadas. Aunque la cuestion tamaño no
seria problema, pues las he adaptado a las medidas que necesito
(gracias a tus macros sobre tamaño/posicion de formas y ventana), pero
aun asi creo que tienes razon y que es mas sencillo/compacto
adjuntarlas con el libro que en una carpeta 'adosada' Ahora en vez de
eliminarlas y volverlas a cargar, lo que hago es jugar con su
visibilidad.

!!! por cierto, me he dado cuenta de que el ID de las formas insertadas
se incrementa aunque las elimines, y aunque cierres la sesion y
empieces de nuevo e incluso para un nuevo libro, el nombre tambien se
incrementa, pero este creo que solo durante la sesion, mientras que el
indice refleja el nº real -> ej. tras mi ultima comprobacion ->
ID:->1103, Name:->Text Box 79, Index:-> 9 (que es el nº real de
formas)

¿esto quiere decir algo?. aunque supongo que solo es una especie
de registro, la 'imagen' de 1103 'formas' espectrales danzando por el
limbo de mi ordenador me da un poco de 'yuyu'

bueno, a lo que iba, una vez separados el proc. de carga y el de
manipulacion, en este he estado haciendo pruebas con la
inclusion/exclusion de doevents, y sigo sin acabar de aclararme. Si lo
omito con las imagenes no parece pasar nada (malo), pero ya no van
paseandose sino a la carrera hasta su sitio final. y si lo omito con el
cuadro de texto, parece no pasar nada (e incluso a veces creo que no
pasa) pero a veces de repente escribe como que no, o no muestra la
secuencia completa de escritura, sino solo el principio y de repente lo
muestra completo, o si intento cancelar con el boton (con la variable
boolean) se me cuelga.

bueno, que de momento, y si tu no ves riesgo de corrupcion o similar
para el archivo, he optado por dejar ambas, a la espera de tus
comentarios

y finalmente, respecto a saltarse la presentacion, y aunque
probablemente acabe usando tu propuesta, he estado haciendo pruebas
con la variable boolean asignada al boton y no parece ir mal, pero
'ensucia' el codigo bastante, aparte de que puedan existir otros
riesgos, sobre todo si intento restringir el uso del teclado, o sus
efectos durante la presentacion.

si no te importa, y aunque abultan considerablemente, pongolos codigos
principales para que los eches un ojo si puedes.

Un saludo y hasta pronto
Ivan

Option Explicit
Private Declare Sub Retardo Lib "kernel32" _
Alias "Sleep" (ByVal Milisegundos As Long)
Public Saltar As Boolean

Sub CerrarPresentacion3()
Saltar = True
End Sub

Private Function Salida(ByVal hj As Worksheet, ByVal Salir As Boolean)
As Boolean
If Salir = False Then
Salida = False
Exit Function
Else
Call MostrarMenuHoja3
Set hj = Nothing
Worksheets("Hoja3").Activate
Salida = True
End If
End Function

Sub PruebaInsertarFotos()
Dim MiHj As Worksheet
Dim InSup As Single, InIzq As Single
Dim IncreSup As Single, IncreIzq As Single
Dim Ancho As Single, Alto As Single
Dim nroFoto As Single
Set MiHj = ThisWorkbook.Worksheets(2)
With MiHj.Buttons.Add(610, 520, 150, 20)
.Caption = "Saltar presentacion"
.OnAction = "CerrarPresentacion3"
End With
For nroFoto = 2 To 8
Ancho = 142.5: Alto = 142.5
Select Case nroFoto
Case 2: InSup = 381.25: InIzq = 600.5: IncreSup = -1: IncreIzq -1
Case 3: InSup = 235: InIzq = 600.5: IncreSup = 0: IncreIzq = -1
Case 4: InSup = 90: InIzq = 600.5: IncreSup = 1: IncreIzq = -1
Case 5: InSup = 90: InIzq = 20: IncreSup = 1: IncreIzq = 1
Case 6: InSup = 235: InIzq = 20: IncreSup = 0: IncreIzq = 1
Case 7: InSup = 381.25: InIzq = 20: IncreSup = -1: IncreIzq = 1
Case 8: InSup = 245: InIzq = 175.5: IncreSup = 1: IncreIzq = 1
Ancho = 435.37: Alto = 580
End Select
Application.ScreenUpdating = False
MiHj.Shapes.AddPicture "C:\Documents and Settings\Ivan\" & _
"Mis documentos\Libreria 3-7\Introduccion\Foto" & nroFoto & _
".jpg", msoTrue, _
msoTrue, InIzq, InSup, Ancho, Alto
MiHj.Shapes(nroFoto).Visible = msoFalse
Next
With MiHj.Shapes.AddLabel(msoTextOrientationHorizontal, _
110.25, 20.25, 423.75, 349.5)
.Placement = xlFreeFloating
.ScaleHeight 25.5, msoFalse: .ScaleWidth 60.5, msoFalse
.IncrementLeft 80: .IncrementTop 60
With .TextFrame
.HorizontalAlignment = xlHAlignCenter
With .Characters.Font
.Name = "ZephyrScript"
.Size = 24
End With
End With
.Visible = msoFalse
End With
Set MiHj = Nothing
End Sub

Sub ProbarLlamadaFotos()
Dim MiHj As Worksheet, Celda As Range
Dim InSup As Single, InIzq As Single
Dim IncreSup As Single, IncreIzq As Single
Dim Ancho As Single, Alto As Single
Dim nroFoto As Single, MilSeg As Long
Dim Pos As Byte, Fin As Byte, lt As String
Set MiHj = ThisWorkbook.Worksheets(2)
MiHj.Shapes(1).Visible = msoCTrue
For nroFoto = 2 To 8
If Salida(MiHj, Saltar) = True Then Exit Sub
Ancho = 142.5: Alto = 142.5
Select Case nroFoto
Case 2: InSup = 381.25: InIzq = 600.5: IncreSup = -1: IncreIzq -1
Case 3: InSup = 235: InIzq = 600.5: IncreSup = 0: IncreIzq = -1
Case 4: InSup = 90: InIzq = 600.5: IncreSup = 1: IncreIzq = -1
Case 5: InSup = 90: InIzq = 20: IncreSup = 1: IncreIzq = 1
Case 6: InSup = 235: InIzq = 20: IncreSup = 0: IncreIzq = 1
Case 7: InSup = 381.25: InIzq = 20: IncreSup = -1: IncreIzq = 1
Case 8: InSup = 245: InIzq = 175.5: IncreSup = 1: IncreIzq = 1
Ancho = 435.37: Alto = 580
End Select
Application.ScreenUpdating = False
With MiHj.Shapes(nroFoto)
.Left = InIzq: .Top = InSup
.LockAspectRatio = msoTrue
.Placement = xlFreeFloating
.ScaleHeight 0.01, True
.Visible = msoCTrue
Application.ScreenUpdating = True
For MilSeg = 1 To 100
If Salida(MiHj, Saltar) = True Then Exit Sub
.ScaleHeight MilSeg / 100, True, msoScaleFromMiddle
.ScaleWidth MilSeg / 100, True, msoScaleFromMiddle
If nroFoto <> 8 Then
.IncrementLeft 6.33 * IncreIzq
.IncrementTop 3.3 * IncreSup
End If
DoEvents
Retardo 20
Next
End With
Next
If Salida(MiHj, Saltar) = True Then Exit Sub
Application.Wait Now + TimeSerial(0, 0, 5)
With MiHj.Shapes(9): .Visible = msoCTrue
For Each Celda In Worksheets("Hoja1").Range("a1:a" & _
Worksheets("Hoja1").[a65536].End(xlUp).Row)
If Salida(MiHj, Saltar) = True Then Exit Sub
Fin = Len(Celda.Value)
With .TextFrame.Characters: .Text = ""
For Pos = 1 To Fin
If Salida(MiHj, Saltar) = True Then Exit Sub
lt = Celda.Characters(Pos, 1).Text
.Text = .Text & lt
DoEvents
Retardo 125
Next
End With
Application.Wait Now + TimeSerial(0, 0, 3)
Next
End With
Set MiHj = Nothing
MostrarMenuHoja3
NombrarTodosLosShapes
End Sub
Respuesta Responder a este mensaje
#7 Héctor Miguel
17/10/2006 - 05:32 | Informe spam
hola, Ivan !

... confieso que no acabo de entender lo que se refiere a como incrustar y 'proveer' las imagenes.
Lo que he hecho es cargarlas una sola vez por codigo pero con AddPictures
(no consigo ayuda sobre'Pictures', me dice elemento oculto) y (creo que) vinculadas.
... las he adaptado a las medidas que necesito... pero aun asi creo que tienes razon
y que es mas sencillo/compacto adjuntarlas con el libro que en una carpeta 'adosada' [...]
... por cierto, me he dado cuenta de que el ID de las formas insertadas se incrementa aunque las elimines
y aunque cierres la sesion y empieces de nuevo e incluso para un nuevo libro, el nombre tambien se incrementa
pero este creo que solo durante la sesion, mientras que el indice refleja el no. real -> ej. tras mi ultima comprobacion
-> ID:->1103, Name:->Text Box 79, Index:-> 9 (que es el no, real de formas)
esto quiere decir algo?... aunque supongo que solo es una especie de registro
la 'imagen' de 1103 'formas' espectrales danzando por el limbo de mi ordenador me da un poco de 'yuyu' [...]



[precisamente]... el 'control auto-numerado' de [algunos] objetos incrustados en hojas de calculo...
ES [una] de las 'razones' por las que mi sugerencia es 'dejar' las imagenes [incrustadas -pero- vinculadas] en el archivo
so-pena de correr el riesgo de 'corromper' el archivo :))

por el 'resto' de este mensaje... [si me das tiempo para 'digerirlo/analizarlo/probarlo/...?] :D

saludos,
hector.
Respuesta Responder a este mensaje
#8 Ivan
18/10/2006 - 02:35 | Informe spam
hola Hector Miguel

solo decirte (bueno, aparte de un par de comentarios, como no podia ser
menos en mi caso) que, sin ninguna prisa y por supuesto sin ningun
compromiso, sí te agradeceria tu opinion/correccion sobre los codigos,
y que si te es mas comodo te puedo enviar el archivo con la
presentacion (unos 250 kb en zip) para que lo veas con calma cuando
tengas algun hueco.

y ahora mis 'inevitables' comentarios:

..la verdad es que al ver el incremento del contador me escame
bastante. Te agradezco la aclaracion (llueve sobre mojado).

...lo que no acabo de entender (me temo que me he atascado en otro de
mis problemas con la terminologia) es como/porque se vinculan las
imagenes si estas ya estan 'dentro' de la hoja, o al menos esto es lo
que yo pensaba.

Bueno, disculpa mi torpeza y, en cualquier caso gracias por todo

un saludo y hasta pronto
ivan
Respuesta Responder a este mensaje
#9 Héctor Miguel
18/10/2006 - 04:10 | Informe spam
hola, Ivan !

... te puedo enviar el archivo con la presentacion (unos 250 kb en zip) para que lo veas con calma cuando tengas algun hueco.



no te olvides de adjuntar [alg]unas de las imagenes que manejas [probablemente] en sub-carpeta :))

...lo que no acabo de entender... es como/porque se vinculan las imagenes si estas ya estan 'dentro' de la hoja [...]



haz una prueba: dos archivos: uno con una imagen incrustada 'directamente' y otro por 'Shapes.AddPicture' VINCULADO
-> usa un procedimiento NO en el libro [imagen vinculada] para que no se este agregando cada vez que se abre... solo una vez ;)
cierras los lobros... revisas cuanto 'pesan'... los abres de nuevo... y [etc. etc. etc.] ;)

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida