Variables tipo objeto

Iniciado por Javilondo, 21 Septiembre 2010, 21:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

Javilondo

Hola amigos!

Estoy desarrollando un programa en el cual tengo un TextBox(TextBox1) un CommandButton(Command1) y un PictureBox(Picture1).
El objetivo es introducir en Text1 una lista de vectores y que al presionar Command1 sean graficados en Picture1.
Podría hacer que dentro de Command1 se ejecute el algoritmo de graficación, pero necesito declarar una función que haga esto y llamarla desde el Command1 porque posteriormente utilizaré la misma función desde varios formularios y me desharé del Text1 ya que incluiré la opción de leer archivos.vec donde se almacenaran los vectores.
No quiero que la función antes mencionada actue sobre el Picture1, sino que trabaje con otro objeto tipo PictureBox. Entonces se me ocurrió que podría declarar esta función como un objeto PictureBox y retornar el resultado del proceso mediante la invocación de la función en una asignación. Ejemplo:
Código (vb) [Seleccionar]

Private Sub Command1_Click()
    Picture1 = funcion(Text1)
End Sub
Private Function funcion(parametro string) As PictureBox

    'Codigo de interpretacion de vectores (tokenizer)
    'Bla, bla, bla, etc.

    'Codigo de graficado de vectores
    'ejemplo hipotetico de un vector graficado con el metodo line sobre la misma funcion:
    funcion.Line (50, 40)-(100, 150), vbRed
    'De esta manera la funcion devuelve el resultado en forma de un objeto tipo PictureBox

End Function

El código que interpreta los vectores ya lo tengo resuelto con un tokenizer que separa el string entrante en un array multidimensional tipo long.
Declaré una función tipo objeto (PictureBox) que tiene un parámetro(string) por donde ingresa la lista de vectores para que posterirmente sean procesados individualmente y que los grafique en la función de tipo PictureBox. En teoria el código me parecía correcto, pero en la práctica me sale un error:
Error '91' en tiempo de ejecucuón :
Variable de tipo Object o la variable del bloque With no está establecida

Nunca me había pasado esto antes con una función, pero el hecho es que es la primera vez que declaro una función como una variable de tipo objeto y no se que pueda estar mal.
Para descartar que fuese un error al declarar la función elaboré un nuevo programa pero ésta vez sólo con un PictureBox(Picture1) y un CommandButton(Command1).
Declaré una variable de nombre pic y como tipo PictureBox para trabajar con ella y posteriormente asignarla a Picture1. En el código puse lo siguiente:
Código (vb) [Seleccionar]

Dim pic As PictureBox

Private Sub Command1_Click()
    pic.BackColor = vbRed 'Esta vez cambie el metodo para descartar que fuera un error de sintaxis del metodo anterior
    Picture1 = pic
End Sub

Ejecuté el programa y al presionar Command1... ¡Crash! volvió a salir el mismo error. fue cuando me di cuenta de que no era ni un error de declaración de función ni de sintaxis del método line, entonces deduje que es un error de asignación ó declaración de variables tipo Object (Tal como aparecía en el error emergente).

¿Alguien sabe en qué estoy mal, o si estoy omitiendo algo obvio?
Si alguien me puede ayudar le estaré muy agradecido y además quedará como referencia futura por si alguien llega a tener el mismo problema.

Gracias.

He dicho.

ignorantev1.1

Y por que no pasar el apuntador de "picture1" como parametro a "funcion"?

BlackZeroX

.
Trabaja con un DC... es mas General asi puedes pintar en DONDE SE TE DE LA REGALADA GANA.

en si se me ocurren solo dos parametros

Código (Vb) [Seleccionar]


Public Function DrawLineGraf(ByRef Coordinates() As Long, ByVal hDC As Long) As Long
...
Manejos d eFunciones GDI, APIS, ETC
...
End Function



Dulces Lunas!¡.
The Dark Shadow is my passion.

Javilondo

Cita de: ignorantev1.1 en 22 Septiembre 2010, 04:19 AM
Y por que no pasar el apuntador de "Picture1" como parametro a "funcion"?


  • ¿a que te refieres con pasar el apuntaddor?
  • De ser así ¿Que caso tendría si paso un picture1 como parámetro? si lo nececito como salida y que yo sepa los parámetros son de entrada (o tal vez estoy equivocado).
  • Además cómo si utilizo a Picture1 en la función cómo ésta será independiente de cada futuro formulario (necesito imparcialidad para cada formulario)

Disculpa si mis preguntas son atrevidas pero así es la ignorancia y deseo reducirla.
He dicho.

Javilondo

Cita de: BlackZeroX en 22 Septiembre 2010, 06:33 AM
.
Trabaja con un DC... es mas General asi puedes pintar en DONDE SE TE DE LA REGALADA GANA.
Dulces Lunas!¡.

Gracias por responder.
Tengo una duda: ¿ que es un DC?
¿Hay manera de hacerlo sin invocar APIs? (no estoy en contra de las apis, pero creo que un código sobrio puede llegar a superar a una llamada al sistema)
He dicho.

BlackZeroX

Cita de: Javilondo en 22 Septiembre 2010, 06:35 AM
Cita de: ignorantev1.1 en 22 Septiembre 2010, 04:19 AM
Y por que no pasar el apuntador de "Picture1" como parametro a "funcion"?


  • ¿a que te refieres con pasar el apuntaddor?
  • De ser así ¿Que caso tendría si paso un picture1 como parámetro? si lo nececito como salida y que yo sepa los parámetros son de entrada (o tal vez estoy equivocado).
  • Además cómo si utilizo a Picture1 en la función cómo ésta será independiente de cada futuro formulario (necesito imparcialidad para cada formulario)

Disculpa si mis preguntas son atrevidas pero así es la ignorancia y deseo reducirla.


* El apuntador me parece que se refiere me parace al handle de la ventana ( hwnd )

* Si los parametros son Salida y Entrada
Prueba esto...



public/friend/private sub/function/property DiHola(byref StrOut as string)
   StrOut= "Hola Mundo"
end sub/function/property



* Para lo tercera usa el Handle del DC del pinture... y trabaja con APIS GDI son mas rapidas, es mas eficiente y como son DC puedes meterle el parametro que desees.

Dulces Lunas!¡
The Dark Shadow is my passion.

BlackZeroX

#6
EDITO:

OJO LO DEL hDC TE LO DIGO VIENDO A FUTURO!¡.




por cierto las apis son estas

Código (vb) [Seleccionar]


Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long



y podras pintar donde desees...

Mira aquí tienes un EJEMPLO (Cambia la linea resaltada por esta)

Código (vb) [Seleccionar]


hdcDestino = picture1.hdc



o por hdc del lugar deseado, por default esta el hDC del escritorio ( PINTARA EN TODA LA PANTALLA ).

Código (vb,60) [Seleccionar]


'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandesido //
'   // o achicado, si es en base a este codigo es requerido    //
'   // el agradacimiento al autor.                             //
'   /////////////////////////////////////////////////////////////

Option Explicit

'   //  GetSystemMetrics
Const SM_CXSCREEN = 0 'X Size of screen
Const SM_CYSCREEN = 1 'Y Size of Screen
'   //  CreatePen
Const PS_DOT = 2
Const PS_SOLID = 0
'   //  Apis
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
Private Type POINTAPI
   x                   As Long
   y                   As Long
End Type
Private Type tLineas
   PuntoInicio         As POINTAPI
   PuntoFinal          As POINTAPI
End Type
Dim RegionWindows       As RECT
Dim hdcDestino          As Long

Private Sub Form_Load()
   Hide
   '   //  Región/Resolución de Pantalla
   With RegionWindows
       .Bottom = GetSystemMetrics(SM_CYSCREEN)
       .Left = 1
       .Right = GetSystemMetrics(SM_CXSCREEN)
       .Top = 1
   End With
   hdcDestino = GetDC(0)
   Timer1.Interval = 100
   Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim Linea               As tLineas
Dim hPen                As Long
   '   //  Dibujamos lineas al Azar
       '   //  Calculamos el Punto de Inicio
   Linea.PuntoInicio.x = NumeroAleatorio(RegionWindows.Left, RegionWindows.Right)
   Linea.PuntoInicio.y = NumeroAleatorio(RegionWindows.Top, RegionWindows.Bottom)
       '   //  Calculamos el Punto Final
   Linea.PuntoFinal.x = NumeroAleatorio(RegionWindows.Left, RegionWindows.Right)
   Linea.PuntoFinal.y = NumeroAleatorio(RegionWindows.Top, RegionWindows.Bottom)
   '   //  Dibujamos la Linea
   '   //  Dibujamos los puntos    Inicio y Final en color rojo
       '   //  Color de la Linea
       hPen = CreatePen(PS_SOLID, 1, vbRed)
       DeleteObject SelectObject (hdcDestino, hPen)
       Ellipse hdcDestino, Linea.PuntoInicio.x - 2, Linea.PuntoInicio.y - 2, Linea.PuntoInicio.x + 2, Linea.PuntoInicio.y + 2
       Ellipse hdcDestino, Linea.PuntoFinal.x - 2, Linea.PuntoFinal.y - 2, Linea.PuntoFinal.x + 2, Linea.PuntoFinal.y + 2
       DeleteObject hPen
       '   //  Color de la Linea
       hPen = CreatePen(PS_SOLID, 1, (RGB(NumeroAleatorio(0, 255), NumeroAleatorio(0, 255), NumeroAleatorio(0, 255))))
       DeleteObject SelectObject (hdcDestino, hPen)
       '   //  Iniciamos una nueva Linea (Punto de Inicio)
       MoveToEx hdcDestino, Linea.PuntoInicio.x, Linea.PuntoInicio.y, ByVal 0&
       '   //  Finalizamos la Linea (Punto Final)
       LineTo hdcDestino, Linea.PuntoFinal.x, Linea.PuntoFinal.y
       DeleteObject hPen
End Sub
Public Function NumeroAleatorio(MinNum As Long, MaxNum As Long) As Long
Dim Tmp                                 As Long
   If MaxNum < MinNum Then: Tmp = MaxNum: MaxNum = MinNum: MinNum = Tmp
   Randomize: NumeroAleatorio = CLng((MinNum - MaxNum + 1) * Rnd + MaxNum)
End Function



Dulces Lunas!¡.
The Dark Shadow is my passion.

BlackZeroX

Código (vb) [Seleccionar]


Private Sub Command1_Click()
   Picture1 = funcion(Text1)
End Sub

Private Function funcion(parametro string) As PictureBox

   'Codigo de interpretacion de vectores (tokenizer)
   'Bla, bla, bla, etc.

   'Codigo de graficado de vectores
   'ejemplo hipotetico de un vector graficado con el metodo line sobre la misma funcion:
   funcion.Line (50, 40)-(100, 150), vbRed
   'De esta manera la funcion devuelve el resultado en forma de un objeto tipo PictureBox

End Function



intenta asi

Código (vb) [Seleccionar]


Private Sub Command1_Click()
   call ProcesoX(Text1, Picture1 )
End Sub

Private sub ProcesoX(byval Parametro string, byref Pic PictureBox)
    'Codigo de interpretacion de vectores (tokenizer)
    'Bla, bla, bla, etc.
   Pic.Line (50, 40)-(100, 150), vbRed
End Function

[]
The Dark Shadow is my passion.

BlackZeroX

.
Perdon por los Post pero es que no te lei completamente solo vi lo de graficas y enseguida se me ocurrio lo del DC o hWnd para obtener asi el Handle y el rectangulo... pero bueno

y para lo del crash:

Código (vb) [Seleccionar]


Dim pic As PictureBox

Private Sub Command1_Click()
   pic.BackColor = vbRed 'Esta vez cambie el metodo para descartar que fuera un error de sintaxis del metodo anterior
   Picture1 = pic
End Sub



Así:

Código (vb) [Seleccionar]


Public/Friend/Private pic As PictureBox ' Deja Dim para procesos, funciones, propiedades, Constantes del proceso... etc.

Private Sub Command1_Click()
   Set pic = picture1
   pic.BackColor = vbRed 'Esta vez cambie el metodo para descartar que fuera un error de sintaxis del metodo anterior
   Set pic = Nothing
End Sub



Dulce Infierno Lunar!¡.
The Dark Shadow is my passion.

Javilondo

Muchas Gracias Miguel Ángel
si no te contestaba es porque estoy tardando en digerir toda la información.
Ya me dejaste mucha tarea.
Publicaré los resultados.
He dicho.