|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Nebire
Páginas: 1 ... 4 5 [6] 7 8 ... 29
127
« en: Jueves 25 de Febrero de 2010, 11:33 »
Esto no es un problema de VB, esto es un problema de tráfico... Falta saber si tienes o no garantías de acceso a la página.
Si la llamada la hicieras asíncrona, habría más posibilidades, y sobre todo podrías en un momento dado tomar otro tipo de acciones: reintentar, descartar esa y continuar...
128
« en: Jueves 25 de Febrero de 2010, 11:24 »
Se puede hacer sin problemas. Basta recorrer la colección controls del formulario, y preguntando por su tipo de objeto recoger los datos que precises de cada control.
Luego puedes guardarlo en un fichero... o puedes enviarlo a una aplicación, pero para esto último se deben utilizar las 'APIs' y no es recomendable para un principiante.
La cosa se complica más de la cuenta si la aplicación destino no es tuya, resultará más difícil o incluso imposible según lo que trates de hacer. Básicamente se usa una api para localizar la aplicación de destino y una vez localizada debe usarse la api sendmessage, la cuestión principal es saber que mensaje es el que necesitas enviar para que quien se supone que puede recibirlo sepa que hacer con los datos recibidos. El mensaje depende de lo que quieras hacer y de la aplicación destino.
Si eres novato, deja esto para dentro de 1 año o dos, primero aprende otras cosas más urgentes... Ahora para guardarlo a un fichero si lo puedes hacer sin dificultad, según tus conocimientos del lenguaje vb6 te será asequible con mayor o menos dificultad.
129
« en: Jueves 25 de Febrero de 2010, 11:10 »
Hola estoy tratando de implementar un sistema de matricula de estudiantes de un colegio, la idea es que la matricula se haga cada año pero me surge la duda como hacer para selecinar el año de trabajo y que el sistema me cargue unicamente los registross correspondientes a ese año para poder tranajar con ellos. he diseñado un form como el de la imagen[attachment=0:17fdbmrq]Sin título-1.jpg[/attachment:17fdbmrq] no se como seria el codigo si alguien me da una idea lo agradeceria mucho Usa un control datetimepicker para mostrar un calendario y/o limitar la fecha. Si haces búsqeudas en el foro por el nombre del control, hallarás ejemplos para manejar las propiedades que precisas...
130
« en: Jueves 25 de Febrero de 2010, 10:59 »
Detalla, a que llamas portable... ?
131
« en: Domingo 21 de Febrero de 2010, 00:38 »
Estás usando una clase connection no un objeto. Por ejemplo , tu puedes hacer este código: pero no puedes hacer esto: puesto que form no es un objeto, es necesario adjudicarle uan referencia de instancia, lo correcto sería algo como esto: Ahora bien, tu dices que cuando ejecutas el código (supongo que el proyecto de ejemplo original) el código funciona correctamente, por lo que entiendo que lo que te fallan son las referencias. Así si tu haces una referencia a 'DAO' (Microsoft DAO 3'51 Object library), te ocurrirá este error, porque la clase connection es 'PublicNotCreatable' (valor 2) cuando se diseño, lo que implica que no puede usarse New ni CreateObject. Para las clases con la propiedad Instancing que fueron diseñadas con el valor 'PublicNotCretable', significa que la aplicación crea las clases que necesite, externamente sólo podremos utilizarlas pero no crear nuevas instancias, sólo referencias a las que el objeto ActiveX permita. En DAO primero tienes que crear un objeto workspace, (luego si se requiere, opcionalmente, un objeto Database con el objeto workspace creado) y finalmente con el objeto workspace creado obtienes un objeto connection al abrir la conexión. ejemplo: Dim cn As Connection Dim ws As Workspace Set ws = DAO.CreateWorkspace("MiEspacioTrabajo", "nombreUsuario", "contraseña", dbUseJet) Set cn = ws.OpenConnection("MiConexion", , , "ODBC:DATAASE=xxx;UID=Usuario;PWD=contraseña;DSN=siseutiliza")
Por tanto es asumible que tu estás empleando un objeto connection que no es el que utiliza la aplicación original, por ejemplo si usaras una referencia al objeto ADODB (Microsoft ActiveX Data Objects 2.5 Library), si que permitirá crear instancias del objeto connection directamente, porque al crear esta librería en su diseño a las clases en la propiedad instancing se declaró 'MultiUse' (valor 5). Revisa tu proyecto y muestra una captura de las referencias que tienes en el proyecto y otra captura de las referencias del proyecto original, verás (y nosotros si nos enseñas la captura) que al menos una referencia (librería) que contiene una clase Connection no coinncide con la otra. Para ser más explícito ya en el proyecto se explica I have used dataenvironment 'and Microsoft Jet.OLEDB 3.51 ver in this case. ... Para otra ocasión explicita que tipos de objetos tienes, no basta a veces con señalar la clase también es necesario señalar la librería, ya que yo puedo crear infinitas librerías con una clase Connection de modo que nada tengan que ver entre sí aparte del nombre. Te adjunto una imagen para que '''veas''' las diferencias entre ambos objetos connection, cómo pertenecen a diferentes librerías y sobretodo las propiedades que tiene cada uno... fíjate como la clase connection de DAO no tiene el método Open, lo que debería servirte de guía para saber que no es esa referencia la que se está utilizando (en el proyecto original).
132
« en: Viernes 12 de Febrero de 2010, 21:17 »
El contenido de un textbox es una cadena de texto. Cuando haces un 'val' interpreta la cadena como un valor numérico hasta donde pueda hacerlo. En este punto vb interpreta un punto dentro de una cadena de texto como no numérico, por eso te toma sólo la parte entera. Hay 2 opciones: A ) Remplazar la coma por un punto dim var1 as double Text1.text= "789,56" text1.text= replace$(text1.text,",",".",1,1) ' sólo cambiamos la primera coma encontrado var1=val(text1.text) msgbox var1
en este caso habiendo una coma en el texto si no se remplaza haría esto: text1.text="789,56" ... msgbox var1 resultado= 789 B ) Eliminar la función val, forzando a que se realice una conversión implícita . dim var1 as double Text1.text= "789,56" var1= text1.text msgbox var1
En este caso si hubiera 1 punto en vez de una coma haría esto: text1.text="789.56" ... msgbox var1 resultado= 78956
133
« en: Sábado 30 de Enero de 2010, 11:30 »
No me he dado cuanta de tu mensaje, aunque ha pasado un tiempo ya... es casi seguro que no hayas resuelto este asunto todavía, anque posiblemente hays cambiado a otra solución o simplemente desistido. Posiblemente la mejor solución que hayas encontrado sea 'vaciarla' de contenido y es normal que no satisfaga la solución. Siempre se exige que exista una línea no fija, es posible retirarla, pero no de cualquier forma, sino usando el método concreto que se detalla: Al iniciar la aplicación si sucede que aún no tenemos ninguna línea, es cuando podemos conseguir quitarla, mira que sencillo es el código: Private Sub Form_Load() Me.Show Malla.FixedRows = 1 ' o x, las que tengamos Malla.Rows = Malla.FixedRows ' desaparecen todas las líneas que no son fijas, End Sub
Esto lo podremos hacer siempre que queramos, pero obviamente si tenemos datos, requeriría volver a añadirlos. Por lo que es cuestión de recurrir a un simple 'método'... supongamos que tenemos 1 líneas fijas y 42 líneas no fijas + esa línea que no quieres tener. Más de lo mismo, observa: ' desde la rutina llamante podría haber líneas como estas: ' de hecho una vez que pruebes el código anterior, mete estas 4 líneas al final del form_load para poder probar la rutina LimitarLineas. For k = 1 To 43 Call Malla0.AddItem("", 1) Next Call LimitarLineas(10) Private Sub LimitarLineas(ByVal n As Long) Dim fixed As Long fixed = Malla.FixedRows ' 1º guardamos el número actual de líneas fijas Malla.FixedRows = fixed + n ' ahora aumentamos las líneas fijas hasta las que queremos conservar Malla.Rows = Malla.FixedRows ' desaparecen todas las líneas que no son fijas, If n > 0 Then ' si no varió el número de líneas fijas no necesitamos REStablecer este valor, además de no necesario, produciría error. Malla.FixedRows = fixed ' restablecemos el número de líneas fijas previo End If End Sub
Por otro lado, es posible eliminar líneas directamente siempre que todavía haya más líneas que las fijas, como no podemos estar siempre seguros de esto, podemos desviar la eliminación de líneas de otro modo. ' n indica la línea índice que se quiere eliminar. Private Sub EliminarLinea(ByVal n As Long) ' quizás nos interese convertirlo en una función , en cuyo caso podríamos y devolver true cuando se elimina y false cuando no... eso queda a tu trabajo. if (n < Malla.fixedRows) or (n => Malla.Rows) then exit sub ' para eliminar líneas fijas, mejor usar otra rutina distinta así se es consciente de què se está eliminado if Malla.rows = Malla.FixedRows + 1 then 'If n = Malla.fixedRows then ' con las 2 comprobaciones previas esta resulta innecesaria pero si modificamos aquellas esta podría llegar a ser necesaria. Malla.Rows = Malla.FixedRows ' desaparecen todas las líneas que no son fijas, que siempre que entre aquí será solamente 1 más. 'End if else Malla.RemoveItem(n) end if End Sub
Nota: Malla es una instancia de un control flexgrid o mshflexgrid.... Queda a tu esfuerzo diseñar una rutina cuando lo que queremos es eliminar unbloque entero de líneas y no sólo una... Pista: elimina todas, menos 1 (estén salteadas o juntas) luego deriva la eliminación de ésta, que hemos dejado hacia la rutina anterior, pués allí ya se chequea si la línea a eliminar es o no justo la única que queda junto a las líneas fijas.
134
« en: Domingo 24 de Enero de 2010, 18:17 »
Es bastante sencillo... Te pongo un código que espero que te resulte fácil de entender En el formulario hay que añadir 1 SOLO timer que llamamos TimLed Añadimos un shape que llamamos ShaLed es una matriz, al primero le pones el índice 0 (en diseño) , los restantes los cargamos por código Añadimos un frame llamado frame1 y tres controles option llamados option1, forman una matriz tiene índices 0,1 y 2 . Para que coincida con elcódigo al indice 0 le ponemos el caption de 'horario ', al 1 "antihorario" y al 2 "parpadeante"... Eso es todo copias y pegas el código y le das ejecutar... una imagen del resultado:  Private Enum ModoIluminado LUM_HORARIO = 0 LUM_ANTI_HORARIO = 1 LUM_PARAPDEO = 2 End Enum Private Const Encendido = vbRed ' color del led encendido Private Const Apagado = &HC0C0FF ' color del led apagado Private Ilumina As ModoIluminado ' modo en que se iluminan los leds Private LedActual As Byte ' led que se enciende actualmente Private Sub Form_Load() Dim k As Single, x As Single, y As Single Dim radian As Single Dim resp As VbMsgBoxResult ' mostramos el formulario para ir viendo (si vamos paso a paso) como se realizan estas acciones. Me.Show ' damos forma al shape With ShaLed(0) .Move .Width, .Height .FillStyle = 0 ' sólido .FillColor = Apagado .Shape = 3 ' círculo End With ' Cramos dinámicamente los otros 11 leds... For k = 1 To 11 Load ShaLed(k) ShaLed(k).Move ShaLed(k - 1).Left + ShaLed(k).Width ShaLed(k).Visible = True Next ' aseguramos unas medidas y dividimos el form. en 4 cuadrantes de 120 partes cada una Me.ScaleMode = vbPixels Me.Width = ScaleX(640, vbPixels, vbTwips) Me.Height = Me.Width Me.Scale (-120, -120)-(120, 120) ' centramos el frame.. Frame1.Move -Frame1.Width / 2, -Frame1.Height / 2 ' posicionamos los leds en círculo respecto del centro (cordenada 0,0 For k = 0 To 11 radian = 6.28 / 12 * k x = Cos(radian) * 60 + Sin(radian) * 60 y = Cos(radian) * 60 - Sin(radian) * 60 ShaLed(k).Move x - 15, y - 15 Next TimLed.Interval = 100 ' un tiempo que permita apreciar el cambio. LedActual = 0 resp = InputBox("Elija el modo inicial de iluminación:" & vbCrLf & "0 : Iluminación en sentido horario." & vbCrLf & "1 : Iluminación en sentido antihorario." & vbCrLf & "2 : Iluminación parpadeante alterna." & vbCrLf & "cualquier otra plsación se interpreta como 0", "Iniciamos, la iluminación de los leds...", "0") If resp < 1 Or resp > 2 Then resp = 0 ' desactivamos previamente toodas las opciones, para que al activar uno, se invoque la rutina... For k = 0 To 2 Option1(k).Value = False Next Option1(CInt(resp)).Value = True End Sub Private Sub Option1_Click(Index As Integer) Dim k As Byte ' 1º apagamos el timer TimLed.Enabled = False ' 2º marcamos el modo de iluminación Ilumina = Index ' 3º apagamos todos los leds. For k = 0 To 11 ShaLed(k).FillColor = Apagado Next ' hacemos que el led actual sea el primero, el 0 LedActual = 0 ' 4º ponemos en marcha el nuevo modo de iluminación TimLed.Enabled = True End Sub ' aquí se ejecuta todo Private Sub TimLed_Timer() Dim anterior As Byte If Ilumina = LUM_HORARIO Then ' 1º marcamos el que ahora está encendido para apagarlo If LedActual = 11 Then anterior = 0 Else anterior = LedActual + 1 End If ' 2º lo apagamos ShaLed(anterior).FillColor = Apagado ' 3º marcamos el siguiente para encenderse If LedActual > 0 Then LedActual = LedActual - 1 Else LedActual = 11 End If ' 4º lo encendemos ShaLed(LedActual).FillColor = Encendido ElseIf Ilumina = LUM_ANTI_HORARIO Then ' 1º marcamos el que ahora está encendido para apagarlo If LedActual = 0 Then anterior = 11 Else anterior = LedActual - 1 End If ' 2º lo apagamos ShaLed(anterior).FillColor = Apagado ' 3º marcamos el siguiente para encenderse If LedActual < 11 Then LedActual = LedActual + 1 Else LedActual = 0 End If ' 4º lo encendemos ShaLed(LedActual).FillColor = Encendido Else anterior = LedActual LedActual = (LedActual + 1) Mod 2 For k = 0 To 10 Step 2 ShaLed(k + anterior).FillColor = Apagado ShaLed(k + LedActual).FillColor = Encendido Next End If End Sub
Si tienes problemas o no entiendes algo, pegunta...
135
« en: Sábado 23 de Enero de 2010, 12:55 »
23.55 , y redondeo me queda 23,55 y no puedo cambiar la coma por el punto Qué teimpide cambiar la coma por un punto o por una arroba o por lo que necesites... ? dim CambiarEsto as string, PorEsto as string CambiarEsto = "," Poresto = "." text1.text = replace(text1.text, CambiarEsto, porEsto)
136
« en: Viernes 18 de Diciembre de 2009, 13:35 »
Function esHora(ByVal txt As String) As Boolean Dim arr() As String = txt.Split(":") If arr.GetLength(0) < 2 Then Return False ElseIf Not IsNumeric(arr(0)) Then Return False ElseIf Not IsNumeric(arr(1)) Then Return False ElseIf Not IsNumeric(arr(2)) Then Return False ElseIf arr(0) < 0 Or arr(0) > 23 Then Return False ElseIf arr(1) < 0 Or arr(0) > 59 Then Return False ElseIf arr(2) < 0 Or arr(0) > 59 Then Return False End If Return True End Function 2 cosas, que no has tenido en cuenta: A - Este es un post del 2003 es decir de hace 6 años... mala cosa si el autor aún estuviera esperando respuesta. No resucites post muertos B - Éste foro es de VB6, el código que expones no se aplica aquí. Para la fecha, (si no se refiere concretamente a la hora)... Hay soluciones bastante mejores que cualquiera de las expuestas en este hilo, en los foros de vb6 ( a día de hoy) sólo es cuestión de buscar. Concretamente usar un control DTPicker (Date Time Picker). Permite opciones de formato y no requiere complejidades de validación ya que puede fijar el rango de fechas admitidas (propiedades maxDate y minDate) y permite al usuario (por torpe que sea) elegir una fecha siempre válida. Para la hora VBA.DateTime tiene funciones específicas para tratar adecuadamente la hora...
137
« en: Domingo 13 de Diciembre de 2009, 08:26 »
Antes que nada tienes que registrar la librería en el sistema: ...desde la línea de comando... regsvr32 "ruta del archivoel archivo.dll"
Luego cuando arranques el proyecto de prueba, tienes que ir al menú proyecto referencias localiza el archivo dll... y ya está. Recuerda guardar el proyecto antes de nada más... El proyecto de la dll, se abre sin más...
138
« en: Sábado 12 de Diciembre de 2009, 08:36 »
Bueno eso de sin 'fundamento lógico', querrás decir 'sin que sepas por qué'... pasa.
Un error de automatización puede suceder cuando el objeto no admite automatización. Si antes lograste acceder y luego no, debes pensar en que has cambiado algo directa o indirectamente.
Por ejemplo si estableciste un tipo de bloqueo determinado, o si intentas crear un recordset que no es aduseclient determinadas acciones no están disponibles. Recuerda que un servidor remoto no admite determinada funcionalidad que si admite un servidor local. A veces ocurre simplemente porque la cadena de conexión la has cambiado y no es correcta. Hay muchísimas razones, pero básicamente todas indican que un método o propiedad no está disponible en base a las circunstancias actuales.
139
« en: Jueves 10 de Diciembre de 2009, 10:31 »
Cuéntame como te va... al ser novata no se si serás capaz de entender las clases de vb6...
140
« en: Martes 8 de Diciembre de 2009, 21:31 »
Te mando un sencillo proyecto, si algo no lo comprendes pregunta y te detallo. Nota especialmente la diferencia entre rotar a través del mundo y rotar sobre el propio eje.
En el proyecto, cada línea se ha tomado como eje de giro dela línea un punto extremo del mismo (el inicial), puede elegirse cualquier punto intermedio de la línea o incluso un punto ajeno a la propia línea como centro de la línea...
El ejemplo se compone de 2 proyectos, el primero construye un objeto 'Rota' con capacidad para retener líneas en una colección y manipularlas, asímismo dibuja sobre un formulario, las líneas añadidas. El 2 proyecto es la aplicación que prueba y manipula el objeto.
Lo que te recomiendo es que primero ejecutes el exe dentro de´la carpeta Aplicación (puede que necesites registrar la librería, previamente). Luego abre cualquiera delos 2 proyectos para ver el código.
Nota que posiblemente tendrás que actualizar, la referencia del objeto 'Rota.Dll' dentro del proyecto que prueba la aplicación.
141
« en: Domingo 6 de Diciembre de 2009, 04:56 »
No puedes rotar una línea si no conoces sus cordenadas, del mismo modo que no puedes pegar una patada a un balón si no sabes donde está ni puedes cambiar de cadena la tele con el mando a distancia si lo has perdido.
A las bravas se podría hacer un programa de reconocimiento de patrones, pero sería costoso y no podrías estar segura de si esa la línea que te interesa y si se ha reconocido 'fielmente', como esperabas.
Lo correcto es no dibujar líneas sin control, sino supervisado, es decir puedes crear una estructura de tipo 'Lineas' donde recoges los 2 puntos que son a su vez una estructura de tipo cordenadas, luego puedes crear líneas y mediante una colección, las vas metiendo en ella, estando ya 'controladas' podrás dibujarlas, rotarlas, eliminarlas,... lo que necesites...
Dame un tiempo, para que encuentre un momento de deshaogo y te hago un sencillo ejemplo que te sirva de orientación...
142
« en: Domingo 29 de Noviembre de 2009, 02:07 »
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar... Si te parece bien haremos una especie de motor 3d sencillo... No tranquilo, si cada uno tiene sus cosas, para nada me corre prisa jeje Solo una cosa, no se a que te refieres exactamente a motor 3D, pero lo que tengo que hacer tiene k ser solo en plano 2D, para nada me tengo que complicar la vida, aunque quizas me equivoco y te refieres a otra cosa... 
Bien, si sólo necesitas rotación 2D, pués lo haremos más simple... Al considerar rotación, es necesario pensar en 3D aunque luego sólo apliquemos en 2D. Yo te dy el mínimo de teoría necesaria para que en un futuro no equivoques las cosas que es lo que le ocurre a la mayoría. Imáginate de pie en medio del salón de tu casa y enfrente de ti una ventana. Bien toma una naranja en tu mano con la otra mano clava un tenedor sobre la naranja, deja el tenedor mirando hacia la ventana. Estiende la mano que tiene la naranja, con la mano libre toca el tenedor y gíralo hasta que quede mirando hacia ti. Bien esto se llama rotación sobre su propio eje. Ahora veamos otra rotación... sigue con tu mano extendida, el tenedor estaba al principio mirando a la ventana ahora mira a ti, bueno, pués ahora gira tú, media vuelta.... verás que el tenedor ahora vuelve a mirar hacia la ventana sin embargo tu no has tocado la naranja... esta rotación se llama rotación sobre el eje del 'mundo' (en este caso el mundo eres tú). Cuando se desea hacer una rotación es necesario tener claro cual de las 2 es a la que te refieres. La 2ª es equivalente a hacer realmente 2 movimientos, uno de desplazamiento y otro de rotación, si considremos moverla sin algo que gira arrastrando de si lo que tiene (como sucede cuando tú tehas dado media vuelta. Entonces si tienes la naranja en tu mano extendida, y realizas rotación (te das medida vuelta), lo que ocurre es la 2º rotación la que se refiere al propio mundo. Para girarla sobre su propio eje hay que hacer lo que ya hemos dicho antes,,,, Mover la naranja al centro del mundo (si las cordenadas en el mundo son x=120, y=60, tenemos que hacer x=0, y=0, ya movido al centro del mundo, ahí rotamos, y luego la volvemos a desplazar donde estaba, así es como giramos sobre su propio eje algo que no está en el centro del 'mundo'. Como ves si me has seguido hasta aquí, el resultado es un poco contradictorio con respecto a lo que hemos hecho sobre la mano, sobre la mano no hemos llevado nada al centro, porque la hemos arrastrado en nuestro movimiento... en los programas nada se hace sólo tenemos que mover uno a uno cada punto. Bien, esa es la primera parte de la teoría de la rotación, la 2º parte versa sobre como calcular las cordenadas correspondientes. Básicamente lo que se hace es calcular cada punto, que compone un objeto, es decir reducimos su complejidad sean objetos, figuras o líneas a meramente puntos, luego reubicando los puntos se redibuja todo de nuevo, ...líneas, figuras, objetos... El cáclulo es el siguiente, sea 'Xo' é 'Yo' las cordenadas de origen (se conservan siempre por lo general) y sean 'Xd' e 'Yd' las cordenas de destino, estas se calculan con la siguiente fórmula: radian= 6'28 /360 * giro Xd = Cos(Radian) * Xo + Sin(Radian) * Yo Yd = Cos(Radian) * Yo - Sin(Radian) * Xo
giro son los grados que aplicamos en este momento. 6'28 es 2 * PI (el número pitagórico). 360 son las particiones que queremos considerar, si fuera un círculo muy grande a lo mejor querríamos considerar subdivisiones de grado... es decir indica en cuantas pasos queremos dividr una vuelta completa. Giro tiene que ser consonante con este valor.... Para ilustrar todo esto ponemos un simple ejemplode código.... fíjate que la rotación que hacemos es alrededor del 'centro del mundo'. Cra un proyecto nuevo, en el formulario añade un picturebos, un checkbox, un timer y un vscrollbar (o hscrollbar)... copia el código siguiente y pégalo en la ventana de código del formulario. ' nuestras variables Dim Xo As Long ' x origen Dim Yo As Long ' Y origen Dim Xd As Long ' X destino Dim Yd As Long ' Y destion Dim giro As Integer ' un valor entre 0 y 359, pero podría ser entre 0 y 100 o 0 y 150000... especifica las subdivisiones para completar una vuelta completa Const naranja = &H80FF& ' es el color para dibujar nuestra 'naranja'. ' el chackbox activa y desactiva el timer, que es donde se eejcuta la rutina de calculo y dibujado Private Sub Check1_Click() If Check1.Value = 0 Then Check1.Caption = "Rotar" Else Check1.Caption = "Parar" End If Timer1.Enabled = Not Timer1.Enabled End Sub ' al crear el formulario establecemos los valores iniciales Private Sub Form_Load() Timer1.Enabled = False ' paramos el timer y le damos un valor rápido al intérvalo... Timer1.Interval = 1 VScroll1.max=359 ' limitamos nuestro scroll con la misma cantidad de pasos que queremos que gire de una vez nuestra naranaja VScroll1.largechange=10 ' dividimos el picturebox en 400 partes de ancho y alto, si el picturebox no es cuadrado del todo, los giros tendrán forma de elipse.... prueba a modificar el tamaño para verificarlo.. Picture1.Scale (-200, -200)-(400, 400) Picture1.DrawWidth = 10 ' dibujaremos un punto, lo hacemos grande para que sea perceptible a la vista Xo = 80 ' nuestra naranja no está en el centro del mundo. por tanto nuestra rotación es alrededor del mundo, no sobre su propio eje. (con un punto tampoco lo notaríamos, si girara sobre su eje) Yo = 80 Me.Show ' antes que nada diibujamos nuestra naranjua para que se vea donde está colocada inicialmente Call Timer1_Timer End Sub ' cuando no actúa el timer, podemos rotar manualmente, paso a paso nuestra naranja Private Sub VScroll1_Change() giro = VScroll1.Value Call Timer1_Timer End Sub ' pot fin nuestra rutina de cálculo y dibujado Private Sub Timer1_Timer() Dim Radian As Double ' o single, para no despreciar decimales, aunque aquí nuestro 'mundo' (el picturebox) es entero Radian = 6.28 / 360 * giro ' calculamos el ángulo Xd = Cos(Radian) * Xo + Sin(Radian) * Yo ' calculamos la cordenada x de destino Yd = Cos(Radian) * Yo - Sin(Radian) * Xo ' calculamos la cordenada y de destino Picture1.Cls ' borramos el picturebox Picture1.Circle (40, 40), 80, vbBlue ' dibujamos un círculo, como referencia visual Picture1.PSet (Xd + 40, Yd + 40), naranja ' dibujamos nuestra naranja, le hemos añadido a 'X' e 'Y' 40, porque es la mitad de 80 , la distancia a la que se encuentra del centro, para que sea una rotación concéntrica, sino sería describiría el círculo desplazado respecto delcentro del mundo... prueba quitando los valores... giro = (giro + 1) Mod 360 ' aumentamos el giro para el próximo ciclo, nota como truncamos el valor para que nunca exceda, y regrese al origen después del final... End Sub
Nota que en todo momento x e y son siempre el mismo valor, los conservamos sin cambio, esdecir los cálculos son siempre absolutos respecto del origen... si se quieren usar valores relativos, origen de ahora es el destino del cálculo anterior, es decir 'Xo' é 'Xd' , serían ambos siempre 'x' (sustituiríamos'xo' por 'x' y 'xd' por x), y lo mismo para los 'y..' Ahora te dejo un ejercicio, imagina ahora no quremos un punto sino una línea.... dibújala (una pista: para dibujar una línea necesitamos 2 puntos).
143
« en: Viernes 27 de Noviembre de 2009, 22:20 »
Mañana te atiendo al tema que hoy se me ha hecho tarde... este mensaje es para que no pienses que lo dejo pasar... Si te parece bien haremos una especie de motor 3d sencillo...
144
« en: Jueves 26 de Noviembre de 2009, 00:06 »
puedes poner unos datos del fichero: c:qbasicfinalcuenta.txt ? De entrada lo que veo es que en el interior del bucle for...next no deja opciones.. Miremos los condicionales dentro del bucle IF pflia = flia THEN 'PRINT "codigo exitente" 'SLEEP 2 'CLS IF ppadres = padres THEN IF phijo = hijo THEN PRINT "codigo existente" SLEEP 2 CLS INPUT "ingrese cod cuenta: ", pccuenta$ END IF END IF ELSE 'EXIT DO END IF
El 'exit do' está comentado, y los otros if anidados no ofrecen alternativas, por lo que los 3 if podrían suplirse como un 'if1 and if 2 and if3 luego'. Otra cosa que veo, es que señalas que quieres comparar cadenas, pero parece ser que Pflia, flia, Ppadres, padres, Phijos e hijos son variables numéricas ( pués hiciste asignación sobre ellas Val(..)). Por lo demás, los bucles do..loop puedes condicionarlos con un while, no realizar luego dentro una instrucción a propósito para salir del bucle. Para hacerte una corrección exhaustiva conviene que detalles cual es el propósito del programa para ver qué, no corresponde con ello. ...Básicamente es correcto, quizás en vez de field, yo usaría una estructura.. así, resulta más intuitivo qué son esas variables... Type Registro Cuenta as string * 8 dCuenta as string * 20 pIni as string * 4 pFin as string * 4 end type dim elReg as registro const LargoReg= 36 ' 8+20+4+4 ' utilizando una estructura en vez de field, al hacer get debes indicar el destino (o el origen al hacer put) get #1, h,elReg
También te recomiendo usar la instrucción freefile para referirte a los ficheros: dim ff as integer ff= freefile open ruta for random as #ff len=largoReg get #ff,1,elReg ... close #ff
Usando freefile, puedes abrir varios archivos sin tener que recordar qué número le toca, resulta más dinámico, puedes abrir y cerrar, volver a abrir, etc... como usas una variable, no tienes que preocuparte del número de canal... Si el tamaño del archivo es dependiente del tamaño de registro tus bucles pueden basarse en eof en vez de calcular el número de registros ' en vez de esto: x = LOF(1) / 36 for k= 1 to x get #1,k if pFin$="Hola" then ... ' acciones next puedes usarlo así: do while not EOF(ff) get #ff,,elReg if elReg.pFin= "Hola" then .... ' acciones Loop
145
« en: Jueves 19 de Noviembre de 2009, 20:52 »
Te he mandado un par de mensajes privados, deberás ir a tu panel de control para leerlos. Al panel se accede pulsando en el botón de enlace: 'Panel de control de usuario' situado justo debajo de la ruta (por niveles) del foro (que a su vez está debajo del logo del foro).
Posiblemente te envíe algún otro más adelante, según vaya ordenando las ideas... lo ideal es que me vayas respondiendo cada mensaje según te lo envío, para que quede todo perfectamente detallado antes de hacer nada...
146
« en: Jueves 19 de Noviembre de 2009, 19:30 »
Hay que concretar bastantes detalles más... como sería largo solicitar las especificaciones de los mismos aquí, la conversación acabaría por no interesar al común del foro, por lo que te respondo por mensaje privado y al final para terminar aquí la conversación con lo que haga pondré unas capturas de imagen y una somera explicación de los detalles y el resultado, suponiendo que al final lo haga.
147
« en: Jueves 19 de Noviembre de 2009, 16:33 »
Es necesario que detalles las especificaciones claramente, de otra forma es imposible ayudarte. Por ejemplo: las alarmas, las debe crear el control (supongo que si) ? ... al indicar que debes introducir datos sobre la alarma te refieres a que contenga propiedades que puedas escribir, leer ?... si es así de que tipo deberían ser (cadenas de texto, numéricos, buleanos) y que nombres convendría que tuvieran (si son una cantidad fija y concreta) ...?.
Qué es lo que quieres almacenar en la base de datos, los datos introducidos en la alarma... ? ... y ... quien debe introducir los datos en la bd tú o el control ?
...y finalmente con alarmas te refieres a estados de alguna variable que utilizas en tu programa o a temporizadores que finalizan su ciclo. ?
Dependiendo de lo que respondas te lo podría hacer (sin recompensa), el tiempo necesario para hacerlo es relativamente breve si las especificaciones están suficientemente claras... en el fin de semana siempre suelo tener un par de horas disponibles para el foro... que podría ser suficiente si lo que solicitas es claro y no resulta demasiado complejo...
148
« en: Lunes 16 de Noviembre de 2009, 15:11 »
El algoritmo es totalmente correcto. Adolece simplemente de que es lento. Es lento porque le pides que calcule todos los divisores posibles para un número contando desde 1 hasta la mitad del número a calcular... Ejecutando el código obtengo estos valores: Nº Perfecto ______Timer_______iteraciones (valor absoluto) 6 48265.89 3 28 48265.89 190 496 48266 61498 8128 48401.82 16516090
Como ves a cada hallazgo el número de iteraciones crece exponencialmente. El siguiente número es 33550336, si en mi ordenador quickbasic ha tardado 35 segundos para hallar el 8128, para hallar el 33.550.336 a 'grosso modo' podría tardar 6 días. Este ejercicio te lo ponen no para probar que eres capaz de encontrar una solución, sino para probar cuan eficaz eres en encontrar una solución. Es un ejercicio excelente para demostrar que la 'fuerza bruta' resulta ineficaz o por lo menos te cuestiona sobre si debe o no buscarse un método alternativo más eficaz. La solución de este algoritmo ya la expliqué más arriba. La eficacia del mismo se reduce a con qué velocidad podemos hallar números primos. sin embargo para qué hallar números primos cuando ya se conocen tablas ?. Ahora bien si parte del problema lo escalcular los primos, no te dejarán usar una tabla de primos desde fichero. Por tanto, lo ideal será dividir el algoritmo en 2 partes. En la 1ª parte (que más adelante lo sugerimos como la 3ºfunción) se debería calcular una tabla de primos lo suficientemente grande como para 'alcanzar' al 5º número buscado. Como a priori no sabríamos cual es ese valor, lo adecuado sería calcular primos en rondas condicionales según se vayan necesitando, los primos hallados se deberían meter en una matriz. por ejemplo calculamos los primos existentes hasta el número solicitado, luego localizamos si el 5º número perfecto se puede hallar en ese rango, si no se encuentra buscamos primos hasta la siguiente tanda, se añaden a una matriz, nuevamente verificamos si el 5º númeroperfecto se sencuentra en la matriz ... repetimos el cilcoo hasta que se encuentre. Por supuesto puedes alterar el código sugerido para que por ejemplo busque cada 1000 primos ú otro sistema que prefieras... yo en ese sentido sólo te ofrezco una sugerencia de solución. en seudocódigo sería algo como... Previamente decidimos dividir la búsqueda de primos 'sobre la marcha', para ello necesitamos algunas variables que nos permitan controlar estos condicionantes: Primos() ' Matriz de alojamiento de los primos hallados Primos(0 to 999) ' Redimensionar la matriz cada 1000 hallados, la matriz es dinámica y acabamos de darle 1000 elementos NPrimos ' contiene números primos hallados, aunque la matriz tenga 1000 elementos nPrimos indica cuantos elementos realmente están ocupados BuscarnumerosPerfectos(Cuantos) no devuelve nada Primos(0)=1 Primos(1)=2 NPrimos =2 iniciar bucle BuscarPerfectos 2, cuantos candidato= (2^BuscarPerfectos ) -1 si EsPrimoBuscarEnMatriz(candidato)=true luego NumPerfecto= (2^ (BuscarPerfectos -1)) * candidato print NumPerfecto, fin si fin Bucle fin BuscarnumerosPerfectos EsPrimoBuscarEnMatriz(Candidato) tipo buleano PrimoMayorEnMatriz = matriz( NPrimos-1) hacer mientras PrimoMayorEnMatriz < candidato llamar a la función BuscarPrimos(LimiteMayorActualDeLaMatriz, int(SQR(candidato))) PrimoMayorEnMatriz = matriz( NPrimos-1) repetir iniciar bucle LocalizarPrimoEnMatriz 2, LimiteMayorActualDeLaMatriz si candidato= primos(LocalizarPrimoEnMatriz) luego devolver EsPrimoBuscarEnMatriz=true salir de la función fin si fin bucle ' si llega aquí devolver false fin función EsPrimoBuscarEnMatriz BuscarPrimos(desde, hasta) si desde es par, le añadimos 1, porque excepto el 2 el resto de primos es impar. iniciar bucle Recorrido desde, hasta en pasos de 2 n=Recorrido EsPrimo = true ' ' buscar divisores, un búmero no es primos si tiene divisores diferentes de 1 y sí mismo iniciar bucle CalcularSiNEsPrimo: 2, int(sqr(n)) si n mod CalcularSiNEsPrimo = 0 es divisor luego EsPrimo=false, salir del bucle siguiente en el bucle si EsPrimo = true luego meterlo en la matriz nPrimos= nPrimos +1 Primos(nPrimos)= n fin si si matriz esta llena redimensionamos conservando contenido, en otros 1000 elementos más fin bucle recorrido fin función BuscarPrimos
Comentando el código... 1 - entramos en una función, o sub, (si no sabes tratar funciones y subs en QuickBasic (o QBasic) trátalo gono una etiqueta... al final te aclaro esto) que va a localizar los números perfectos deseados. Para ello invoca a una función que determina si un número candidato a número perfecto es primo, si dicho número es primo, hay un número que se deduce como número perfecto partiendo de dicho candidato. 2 - La función es primo, primero verifica si la matriz de primos tiene contenido (de entrada sólo fijamos 2 primos en la rutina anterior (1 y 2)) si el último primo es menor que el candidato significa que puede no bastarnos con los primos que tenemos en la matriz actual para determinar si el candidato es primo, por tanto llamamos a la función que comentaremos después para localizar más primos y meterlos en la matriz. Después lo único que hacemos es recorrer la matriz y ver si el candidato está en la matriz, si está es primo si no no. Este resultado es lo que devuelve esta función. 3 - La 3ª función localiza primos, a partir del valor indicado (el último que tenemos almacenado en la matriz) hasta la raíz cuadrada del candidato actual, cada vez que se halla uno se añade a la matriz y se totaliza la cantidadde primos hallados. Si la matriz se llena se redimensiona con otros 1000 elementos más (preservando su contenido), esto se hace 1 vez con 1000 elementos no tras cada primo hallado que sería muy lento. Finalmente, si no sabes manejar funciones y rutinas en QuickBasic-QBasic siempre se puede 'simular' con etiquetas y saltos entre ellas. He aquí un ejemplo sencillo: Perfectos: ' esto es una etiqueta ' se coloca aquí el código de la 1ª función ' donde se señala: si EsPrimoBuscarEnMatriz(candidato)=true luego , hacemos previamente un salto gosub EsPrimoBuscarEnMatriz ' y luego cambiamos dicha línea por: si EsPrimo=true luego ' resto del código End ' el programa termina al llegar aquí ' esto es otra etiqueta, se puede saltar aquí con gosub nombreetiqueta EsPrimoBuscarEnMatriz : ' aquí se coloca el código de la 2ª función ' donde pone: llamar a la función BuscarPrimos(....) ' previamente ponemos estas líneas Desde = LimiteMayorActualDeLaMatriz Hasta = int(SQR(candidato))) ' luego sustituímos dicha línea de llamada por esta otra gosub BuscarPrimos 'resto del código Return BuscarPrimos : ' código de la 3ª función Return
Una etiqueta, es como un punto de entrada a una función, y 'Return' es como el punto de salida que devuelve el control a la línea siguiente a la que invocó la etiqueta, para tratarse como una rutina debe usarse gosub, goto produce un salto incondicional sin esperar retorno, porlo que aparecería un error si se salta a una etiqueta usando goto y se encuentra un return diciendo algo como (Return sin Gosub ???)... Ya depende de tu pericia del lenguaje que estimo no va muy allá... pero bueno progresa y ya nos contarás donde te estancas... p.d.: en quickbasic para trabajar con matrices dinámicas (que superen los 64Kb), es necesario arrancarlo con los siguientes parámetros en la línea de comando: Unidad:qb45QB.EXE /ah Donde unidad es la letra del disco donde está la carpeta qb45 , nota el parámetro "/ah"
149
« en: Jueves 12 de Noviembre de 2009, 10:14 »
Antes de nada quería indicarte que este tema (como el post anterior que tienes) deberían ir en el foro de ''Servidores'', no en el de seguridad y criptografía... Seguridad y criptografía básicamente se refiere a diseñar, programar, entender sobre dichos temas, lo tuyo es meramente configuración de un servidor (seguro pero servidor). ...dicho lo cual paso a responderte someramente algunos temas. si no me equivoco, la finalidad del tunelado de ssh hace que: las conexiones que se hacen en el equipo local (ftp:\localhost) son redirigidas a traves del puerto del SSH (port:22) hasta el puerto del servidor de SSH (port:22) luego, el servidor, redirige la comunicación al puerto adecuado (ftp 21,53,20) , es asi?
Casi. El puerto destino y origen no tienen porqué ser el 22, de hecho yo lo cambiaría... es habitaul encontrarse el puerto 443 . Aunque puedas usar ftp://127.0.0.1 mira si te interesa más usar http://127.0.0.1 . Si usas el ftp pasivo, le estás diciendo que no va a usar ni puerto 22 ni leches, sino que que le estás diciendo que elija uno aleatorio entre 1024 y 5000 (creo recordar), luego de elegirlo informa al cliente. Respecto del firewall a veces falla porque puede darse el caso que el ruter utilice el pueto 21 para actualizar el firmware del mismo, por tanto en dicho caso habría que entrar en el router, buscar y desactivar dicha opción.. A mi me ha ocurrido en más de una ocasión. Respecto de sygate debes mirar que no estén bloqueadas la dirección de localhost. Si no recuerdo mal esto se encuentra en 'tools -> advanced rules' o algo similar... tampoco está de más que piches en add (si está vacío, y si alguna regla definida, en editar) y verifiques las opciones en las diversas fichas... Cuando configures el servidor compruébalo haciendo un ping. Te recomiendo que localices gugleando algún manual de configuración de un servidor ssh y lo sigas paso a paso, algunas respuestas puedes deducirlas tu mismo después de probar diferentes 'recetas' de manuales... Yo hace tiempo que no toco este tema y tengo los detalles algo oxidados... Te propongo por ejemplo este pequeño y sencillo manual... deberás hacer unas pequeñas adaptaciones, pero se ajusta bastante a los programas y configuración que usas.: http://sozter.net/post/49922632/proxy-tunel-ssh
150
« en: Sábado 7 de Noviembre de 2009, 15:09 »
Quedaría más elegante si en vez de 4 líneas mal puestas, crearas 2 imágenes, un muñeco vestidito y otro en esqueleto y las 'descuartizaras' (igual tamaño, iguales medidas de trozos) y luego la fueras poniendo a medida que acierte o falle si falla pones el trozo de esqueleto... en fin algo más vistoso, usa un poco de imaginación...
Páginas: 1 ... 4 5 [6] 7 8 ... 29
|
|
|