Autor
|
Tema: Variables tipo objeto (Leído 5,186 veces)
|
Javilondo
Desconectado
Mensajes: 15
dfghftyn fthawpri+ok5t+'9i4 v0934u34+0953vn5
|
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: 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á establecidaNunca 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: 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.
|
|
|
En línea
|
He dicho.
|
|
|
ignorantev1.1
Desconectado
Mensajes: 617
/\ Así acabo cuando quiero programar...
|
Y por que no pasar el apuntador de "picture1" como parametro a "funcion"?
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. 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 Public Function DrawLineGraf(ByRef Coordinates() As Long, ByVal hDC As Long) As Long ... Manejos d eFunciones GDI, APIS, ETC ... End Function
Dulces Lunas!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
Javilondo
Desconectado
Mensajes: 15
dfghftyn fthawpri+ok5t+'9i4 v0934u34+0953vn5
|
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.
|
|
|
En línea
|
He dicho.
|
|
|
Javilondo
Desconectado
Mensajes: 15
dfghftyn fthawpri+ok5t+'9i4 v0934u34+0953vn5
|
. 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)
|
|
|
En línea
|
He dicho.
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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!¡
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
EDITO:OJO LO DEL hDC TE LO DIGO VIENDO A FUTURO!¡.
por cierto las apis son estas 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) hdcDestino = picture1.hdc
o por hdc del lugar deseado, por default esta el hDC del escritorio ( PINTARA EN TODA LA PANTALLA ). ' ' ///////////////////////////////////////////////////////////// ' // 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!¡.
|
|
« Última modificación: 22 Septiembre 2010, 07:03 am por BlackZeroX »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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 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 []
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. 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: 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í: 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!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
Javilondo
Desconectado
Mensajes: 15
dfghftyn fthawpri+ok5t+'9i4 v0934u34+0953vn5
|
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.
|
|
|
En línea
|
He dicho.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con variables tipo char [Resuelto]
Programación C/C++
|
Danyel_Casvill
|
4
|
7,678
|
18 Agosto 2011, 18:23 pm
por PiroskY
|
|
|
Compilador cree que el objeto que pusheo en vector es distinto tipo.
Programación C/C++
|
16BITBoy
|
4
|
2,939
|
27 Mayo 2012, 21:37 pm
por Foxy Rider
|
|
|
(EXCEL-VBA) ¿Existen variables tipo CONJUNTO?
Programación Visual Basic
|
jvchino
|
2
|
2,055
|
19 Diciembre 2015, 18:50 pm
por jvchino
|
|
|
javascript - Vectores con componentes de tipo objeto.js
Desarrollo Web
|
TickTack
|
0
|
1,581
|
11 Abril 2018, 15:21 pm
por TickTack
|
|
|
AIDE - EditText no agrega objeto de tipo Spanned
Java
|
TickTack
|
0
|
1,565
|
21 Julio 2020, 01:16 am
por TickTack
|
|