PDA

Ver la versión completa : Gráficos en VB



welvis30
03-04-2007, 09:06
Buenas... resulta que estoy haciendo un proyecto en VB y yo de VB no tengo mucha idea, la cuestión es la siguiente...

El programa crea lineas, por medio del evento line y mediante coordenadas creas las que te interesan...ahora bien me gustaría poder mover las figuras creadas..pero no sé numerar cada linea para luego más tarde poder moverlas, es decir, si se le aplica un movimiento mediante coordenada, coger todas las lineas y moverlas...no se si me explico bien.

Aqui pongo parte del código


Private Sub crear_Click()
Monitor.Line (creax1, creay1)-(creax2, creay2), vbBlack
End Sub



Private Sub move_Click()
vx1 = x1.Text
vy1 = y1.Text
Monitor.Cls
Monitor.Line (creax1 - vx1, creay1 - vy1)-(creax2 - vx1, creay2 - vy1), vbBlack
End Sub

Gracias de Antemano

welvis30
03-04-2007, 11:03
Después de luchar durante unas horas descubrí que lo mejor era hacer una array con un contador, pongo aquí el código



Dim contador As Integer
Dim coordenada(1 To 20, 1 To 4) As Integer

Dim x1 As Integer
Dim x3 As Integer
Dim y1 As Integer
Dim y2 As Integer
Private Sub borrar_Click()
Monitor.Cls
contador = 0
lineas.Caption = contador
End Sub

Private Sub crear_Click()
contador = contador + 1


coordenada(contador, 1) = creax1
coordenada(contador, 2) = creay1
coordenada(contador, 3) = creax2
coordenada(contador, 4) = creay2

Monitor.Line (coordenada(contador, 1), coordenada(contador, 2))-(coordenada(contador, 3), coordenada(contador, 4)), vbBlack
' Monitor.Line (200, 400)-(3000, 700), vbBlack


lineas.Caption = contador
End Sub

Private Sub move_Click()
' vx2 = x2.Text
' vy2 = y2.Text
vx1 = movex1.Text
vy1 = movey1.Text
Monitor.Cls


movimientos = contador

Do While movimientos > 0

coordenada(movimientos, 1) = coordenada(movimientos, 1) - vx1
coordenada(movimientos, 2) = coordenada(movimientos, 2) - vy1
coordenada(movimientos, 3) = coordenada(movimientos, 3) - vx1
coordenada(movimientos, 4) = coordenada(movimientos, 4) - vy1

Monitor.Line (coordenada(movimientos, 1), coordenada(movimientos, 2))-(coordenada(movimientos, 3), coordenada(movimientos, 4)), vbBlack
movimientos = movimientos - 1
Loop


lineas.Caption = contador
End Sub

eXcalibur
03-04-2007, 12:39
Te recomiendo que crees una clase Linea para gestionar todos los movimientos de la misma.

welvis30
03-04-2007, 13:22
Bufff veré que puedo hacer, porque VB es muy novedoso para mi..lo empece ayer mismo :S

eXcalibur
03-04-2007, 16:08
Entonces olvidate, pensaba que ya estabas más rodado.
El tema de la clase es porque quieres tratar a esas líneas como objetos. Si hicieras una clase, podrías hacer métodos como .dibujar (x,y,l) o .mover(x,y), simplificando muchísimo el trabajo, además de que el código queda más limpio.
Saludos.

welvis30
03-04-2007, 17:46
Pues mira, eso es lo que intentaba hacer en un principio, pero nada al final he hecho matrices, y bueno cuando coja más conocimientos a ver...por que también es verdad que tanta matríz conforme complicas el programa marea.

Saludos y Gracias!

eXcalibur
03-04-2007, 18:37
Claro, es mucho más limpio y correcto.
El guille nos muestra la diferencia entre arrays y clases:
http://www.elguille.info/vb/VB_CLS.HTM#cls001

welvis30
04-04-2007, 09:26
La de el guille me complica un poco que soy muy nuevo, he estado mirando esto
http://www.adrformacion.com/cursos/visual2/leccion2/tutorial2.html

pero tengo una duda...lo que quiero guardar en una clase se pone en el key? no puede haber un key para llamarla y luego poner el dato?

me explico, mira lo que tengo yo
clase.Add A, "(coordenada(contador, 1), coordenada(contador, 2))-(coordenada(contador, 3), coordenada(contador, 4)), vbWhite"

aquí guardo las coordenadas de una linea, pero claro cuando voy hacer otra es lo mismo y me da error porque se repite...umm voy a seguir luchando a ver si avanzo.

NOTA: Si lo pongo entre comillas sé que no coge las variables y por eso dice que es igual, pero si le quito las comillas me dice que hay un error en las comas que separan las coordenadas :/

Saludos

eXcalibur
04-04-2007, 13:03
Tienes que hacer un vector de esa clase, es decir, tu creas tu clase con sus metodos, y luego en el formulario te haces una variable que se tu clase

Dim MiClase(10) as NombreClase

Entonces, a partir de ahora harás referencia a esa clase así:

MiClase(x).Pintame (x,y,l)

No se si me explico.

welvis30
05-04-2007, 09:51
Ahora me han pedido que esas lineas las pueda mover con el cursor..es decir que pueda arrastrarlas y cambiarlas de coordenadas por el PictureBox...para ello necesitaría seguro lo de las clases? es que no me quedo muy clara la cosa y estado ahi luchando, pero...

La array es doble es decir
hago una array que por cada una tenga 4 para las coordenadas x1 y1 - x2 y2
en tonces yo en una clase que pongo las arrays que contienen...1ª linea, 2ª...

Porque ahora para cogerlo con el ratón tendría que clickar en algún objeto digo yo y que se moviese en coordenadas o sin clases también puedo? puf... madre mia ajaja nose para que me meto en estos fregaos.

welvis30
20-04-2007, 09:27
A ver si me puedes ayudar eXcalibur, me da error de compilación cuando intento crear la linea, si hago un "Print lii(1,1)" me dice que es un dato erroneo entonces no sé si estoy agregando bien a la clase el dato, o es que no lo llamo bien..te pongo lo que llevo


Dim lii(1 To 50, 1 To 4) As New Collection
Dim linea As New clase_linea 'clase_linea contiene x1,x2,y1,y2

lii(contador, 1).Add linea, linea.x1
lii(contador, 2).Add linea, linea.y1
lii(contador, 3).Add linea, linea.x2
lii(contador, 4).Add linea, linea.y2

Monitor.Line (lii(contador, 1), lii(contador, 2))-(lii(contador, 3), lii(contador, 4))

eXcalibur
20-04-2007, 09:34
welvis, sube el código y postea la dirección, así podemos ver el código entre todos y seguro que te ayudamos

welvis30
20-04-2007, 10:24
Es que he vuelto atrás porque lo estaba haciendo todo con matrices como empece, pero veo que no, que tengo que hacer clases por huebos entonces he vuelto atrás y no tengo muxo código, pongo aquí el completo.



Dim contador As Integer
-----------------------------------------------------
Private Sub crear_Click()
Dim lii(1 To 50, 1 To 4) As New Collection

Dim linea As New clase_linea

Set linea = Nothing
linea.x1 = creax1
linea.x2 = creax2
linea.y1 = creay1
linea.y2 = creay2

contador = contador + 1

lii(contador, 1).Add linea, linea.x1
lii(contador, 2).Add linea, linea.y1
lii(contador, 3).Add linea, linea.x2
lii(contador, 4).Add linea, linea.y2



Monitor.Line (lii(contador, 1), lii(contador, 2))-(lii(contador, 3), lii(contador, 4)), vbWhite


lineas.Caption = contador
End Sub


creax1,creax2....son valores de campos de texto para introducir las coordenadas.
Hay un módulo de clase con el nombre clase_linea.cls


Option Explicit

Public x1 As String
Public y1 As String
Public x2 As String
Public y2 As String


Creo que queda claro, si no, lo subo, es que solo es eso ahora mismo, porque cuando consiga manejarme bien con las clases, pues ya migrare al que llevo más ámplio.
.-Saludos-.

welvis30
23-04-2007, 08:38
A ver, voy avanzando poco a poco :D ya puedo crear las lineas y almacenarlas como objetos :D:D:D:D!!!

Pero ahora nose como puedo aplicarle eventos tipo mousse_down a un objeto que aún no está creado, cada linea es una colección, pero almacenada mediante matriz...me explico...
linea(1) = coordenadas de la linea
linea(2) = coordenadas de la linea

Yo no sé llamar al objeto por ejemplo para decirle...que cuando clikes sobre el objeto aparezca nose...algo no sé seleccionarlo y modificarlo de manera gráfica.

Subo lo que llevo http://download.yousendit.com/96C0112F05C0CBCA

.-Saludos-.