• Sábado 27 de Abril de 2024, 04:30

Autor Tema:  Algo sencillo: Error de Line en un Sub  (Leído 2275 veces)

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Algo sencillo: Error de Line en un Sub
« en: Miércoles 12 de Agosto de 2009, 21:19 »
0
Hace mucho que no trabajo con lineas en VB6.0, he hecho un procedimiento en el mismo formulario donde lo voy a usar, el code es el siguiente:

Código: Visual Basic
  1. Private Sub Etapas(PictureKe As PictureBox)
  2.  
  3. 'Organizando pictureke
  4. With PictureKe
  5.     .AutoRedraw = True
  6.     .BackColor = vbBlack
  7.     .Top = 0
  8.     .Left = 0
  9.     .Width = Me.Width
  10.     .Height = Me.Height
  11.     .ScaleMode = 6
  12.  
  13. End With
  14.  
  15. 'dibujando lineas
  16. With PictureKe
  17.     PictureKe.Line (0, 0)-(10, 10), vbWhite
  18. End With
  19.  
  20.  
  21. End Sub
  22.  

¿Donde esta el error?...
saludos y gracias por contestar.


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Algo sencillo: Error de Line en un Sub
« Respuesta #1 en: Sábado 15 de Agosto de 2009, 06:08 »
0
Trazas una línea diagonal. como el modo de escala lo has puesto en milímetros, un valor de 10 es 1 cm.
No veo ningún error... luego deduzco que el problema deriva de otras propiedades que tienes activadas...

Puede aparecer algún error de visionado, pero si es este caso, éste debe ser por otras propiedades que tienes en el picture que le pasas a la función... me refiero a propiedades tales como Drawmode, drawwidth,  como es una línea y no una caja en este caso no se considera fillstyle y como le indicas el color blanco, tampoco importa fillcolor...

El otro posible error es del tipo 480, de Autoredraw.... suele deberse al tamaño del control y estar relacionado con el modo de escala del contenedor ...  trato de explicártelo...
al establecer el ancho al picture de las medidas del formulario, utilizas la propiedad width y height, si por ejemplo hay tablecido una escala en el form de pixels, y este tiene 1000 pixels de ancho, al pedirle el 'Width'  VB te da los twips que es (1000 * screen.TwipsperpixelX)  (por ejemplo yo que tengo una resolución de 1600x1200 esta constante (screen.TwipsperpixelX es de 15 , de hecho un vistazo rápido da 15120 twips, los 120 twips restantes son del borde del form (4 píxeles a cada lado: 4*2 * 15= 120 twips)...
...Esto origina entonces que el width de tu picture sea 15120 milimetros (ya que toma el valor que le das ) un ancho así por un alto también grande (15120 milimetros es 15'12 metros) precisa una gran cantidad de memoria para administrar el contenido gráfico, al activar autoredraw por tanto se desborda el tamaño que Mocosft tiene limitado ... En la práctica esto sreporta un error de Autoredraw, con el número 480.

Esto tiene  3 soluciones:
1 -  El modo más sencillo (no es el más eficaz y también puede darte problemas si no conoces a fondo como interactúan las escalas) es tener el formulario con la misma escala que el picture. Ahora bien el cambio de escala del formulario  debe tenerse en cuenta el tamaño, puede dar también el error 480, si por ejemplo estableces esclas como milimetros o cm. si tu pantalla es de 15 cm de ancho, por ejemplo, y le pasas el ancho en pixels (pongamos 640) interpreta que son 640cm (6'4 metros). Si notienes claro como actúa VB, es mejor que lo modifiques en diseño y veas como afecta a las medidas...

 2- Si necesitas mantener el tipo de escala en el formulario por ejemplo en vbpixels (3), entonces puedes usar las propiedades scalewiidth y scaleheight para tomar sus datos, scalewidth y scaleheight mantiene los valores de la medidas de ancho y alto del objeto de acuerdo al modo de escala que tiene el control. ( Mucho ojo, cuando la escala está en VbUser (0), ya que en este caso puedes definir cualquier unidad como medidas para el control, en este caso la constante de escala es libre queda definida por el usuario respecto de los twips ... Para pedir las medidas que tiene la escala debes usar scalewidth y scaleheight en vez de width y height, tal como te indico en el código siguiente... nota que esto no establece el picture del mismo tamaño que el formulario que es lo que intuyo que quieres hacer...
 
Código: Visual Basic
  1.  
  2.    .Width= Me.scalewidth
  3.  
  4.  

3 - Éste modo es el correcto, con él controlas perfectamente las medidas entre diferentes escalas. No necesitas cambiar la escala del formulario, puede estar en la que precise estar y además logramos que el picture tenga las mismas medidas que el formulario, que es lo que tú (creo) que quieres... te pongo el código, que además creo (recordar vagamente) ya habertelo explicado en alguna ocasión anterior a propósito de otro código donde modificabas propiedades del cliente...
Código: Visual Basic
  1.  
  2.  .Width= scaleX(me.Width, me.scalemode, .ScaleMode)
  3. ' ...etc...
  4.  
  5.  
Como ves, toma la medida origen  y cambia su valor desde la escala en la que está a la escala a donde se destina, podemos poner directamente la escala si la conocemos o bien dado que pasar controles por referencia y cada control podría tener una escala distinta, solicitar la escala del control (es lo que hacemos en el código de ejemplo)  donde se va  apllicar (la del picture). Esto lo hace tomando las constantes que mantiene entre escalas... y las constantes de la pantalla (que dependen de la resolución a la que esté el monitor)... como usas en destino escalas decimales, lo que dibujes se verá del mismo tamaño independientemente de la resolución del monitor... y del monitor en que se vea.

Espero haberte aclarado tus dudas... ya que no identificas el tipo de error que te resulta.


Eso sí, cuando un control debas establecerle varias propiedades piensa en usar mejor el método move, como en el ejemplo, ya que establece las 4 propiedades de una sola vez (no fuerza a repintar la ventana con cada propiedad modificada sino que se hace de una vez, esto es las comprobaciones pertienentes se hacen una sola vez y se redibuja al final, por tanto una sola vez y no 4.
Código: Visual Basic
  1.  
  2.  
  3. ' usa esto....:
  4.     call .Move ( 0,0,me.width, me.height)
  5. ' O bien esto, si una propiedad no varía:
  6.     call .Move( .left, .Top, me.width, me.height) ' si no quieres usar el call debes quitar los paréntesis...
  7.  
  8. '  ....cuando quieras usar esto. Esto fuerza a redibujar el formulario 4 veces, el modo de arriba sólo 1:
  9.     .Top = 0
  10.     .Left = 0
  11.     .Width = Me.Width
  12.     .Height = Me.Height
  13.  
  14.  
«Ma non troppo»
----> ModoVacaciones = False<----

Jimbenit

  • Miembro MUY activo
  • ***
  • Mensajes: 269
  • Nacionalidad: co
    • Ver Perfil
    • http://ingenieriacivil.foroactivo.com
Re: Algo sencillo: Error de Line en un Sub
« Respuesta #2 en: Jueves 20 de Agosto de 2009, 16:11 »
0
Excelente explicación amigo Nebire...
Mi error era el 480, pero tu explicación me sirvió para estudiar algunos errores adicionales... :good:


Yo quiero mucho a Toph ---> Mi Web]http://ingenieriacivil.foroactivo.com[/url]