|
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 ... 10 11 [12] 13 14 ... 29
276
« en: Lunes 11 de Mayo de 2009, 20:30 »
Hola, estoy haciendo un programilla de VB 6.0 a partir de una dll en C++, y me da este error en la siguiente linea:
Alguien sabe el motivo o como solucionarlo?
... Dim cpu As Single DLLpon_cpuUsage (cpu) MsgBox "Datos introducidos correctamente"
...
Dim cpuUsage As Single
DLLdame_cpuUsage (cpuUsage)
Supongo que la línea a la que te refieres es a la que has marcado en negrita.... ---------- Post data: Me edito no había leído que más abajo incluías parte del código que estás usando: float FAR PASCAL DLLdame_cpuUsage() { return my_Process.dame_cpuUsage(); }
Como puedes ver esa declaración no utiliza parámetros... entonces tu código debería quedar así: ' esto es lo que has puesto: DLLdame_cpuUsage (cpuUsage) ' y esto es lo que debes poner: cpuUsage= DLLdame_cpuUsage ()
277
« en: Viernes 8 de Mayo de 2009, 09:01 »
Bueno, esto ya no es un problema de VB, esto es claramente un problema matemático, es decir un algoritmo... un problema independiente del lenguaje... Lo que te falta es comprobar que el número que se ofrece como solución debe ser primo para que sea un número perfecto... to te propongo este sencillo algoritmo: Private Sub Command1_Click() Call NumPerfecto(10) End Sub Public Function NumPerfecto(ByVal m As Long) Dim k As Long, n As Double For k = 2 To m n = (2 ^ k) - 1 If EsPrimo(n) Then ' entonces lo siguiente es numero perfecto n = (2 ^ (k - 1)) * n Print n; End If Next End Function Private Function EsPrimo(ByVal n As Double) As Boolean ' calcula o mejor comparalo con una tabla.... de primos If n...... Then ' si n aparece en una tabla de primos entonces es primo EsPrimo = True End if End Function
Como verás sólo te falta añadir la comprobación de la condición de primo. lo más efectivo es usar una tabla de primos (calcular cada número es bastante lento), además para hacerlo más óptimo, puesto que en cada iteración el número a buscar es más grande, a la función es primo debería añadírsele un parámetro para que en base a él guardara el último lo calizado en la tabla y comenzar desde él o bien resetaearlo y empezar de nuevo.. te ilustro esa idea... (verás que la función esprimo2 ahora está completa, sólo falta la tabla que deberías cargar al inicio... si necesitas una tabla de primos, puedes probar a buscarla por internet, de todas formas creo recordar que tengo guardado en algún duisco duro tablas de hasta el primer millón de primos y otros archivos más pequeños... Public Function NumPerfecto2(ByVal m As Long) Dim k As Long, n As Double, v as double me.autoredraw=true me.cls Call EsPrimo2(1, True) ' aquí reseteamos sin afectar en nada al resto, es decir hacemos que el static de esprimo2 'k' tome el valor 1 For k = 2 To m v = (2 ^ k) - 1 If EsPrimo2(n) Then ' entonces lo siguiente es numero perfecto n = (2 ^ (k - 1)) * v Print k, v, "=", n: End If Next End Function Private Function EsPrimo2(ByVal n As Double, Optional Resetear As Boolean) As Boolean Static k As Long ' eneavo nº consultado en la tabla If Resetear = True Then k = 1 ' compara con una matriz de primos cargada al inicio Do While tablaprimos(k) <= n If n = tablaprimos(k) Then EsPrimo2 = True Exit Do End if k = k + 1 Loop End Function
En realidad dado que que pronto se alcanzan cifras muy grandes de n, incluso recorrer la tabla de primos continuando desde donde se quedó la última vez puede llegar a ser lento (depende de cuantos números quieras calcular, claro), y en dicho caso deberías modificar el algoritmo para hacer una detección más óptima ( por ejemplo utilizando marcadores sobre la tabla), pero de lo que trata el problema es de encontrar una solución y eso es lo que se hace... el resto queda a tu esfuerzo. Si algo no lo entiendes, ya sabes, pregunta...
278
« en: Jueves 7 de Mayo de 2009, 19:51 »
Me cito... por si no te enteraste la 1ª vez.. Lo 1º es indicarte que este es el foro de VB no de C.
Sobre porqué no te 'admite' los include, es mejor que lo preguntes en el foro de C# : viewforum.php?f=50 o en el de C, C++ : viewforum.php?f=18 que para eso están... quizás no los hayas visto, aveces ocurre tenerlo delante de las narices y no verlo.
279
« en: Jueves 7 de Mayo de 2009, 19:44 »
weno tengo un problema nosé como hacer un programa para contar los dias del mes ejemplo
ingreso 29/05/09 Y q me cuente cuantos dias faltan para acabar el año ,cuantos dias an pasado desde esa fecha hasta la fecha actual ... No tienes que hacer tantas historietas de cálculos, hay funciones al efecto... Private Sub Form_Load() Dim fecha1 As Date, fecha2 As Date fecha1 = CVDate("29/05/09") fecha2 = CVDate("31/12/09") MsgBox "diferencia entre fechas: " & DateTime.DateDiff("d", fecha1, fecha2, vbMonday, vbFirstJan1) End Sub
280
« en: Martes 5 de Mayo de 2009, 23:32 »
Si, al principio es lento, pero a medida que va pasando el tiempo, parece como si te metieras en la piel del 'individuo' que lo hizo y empiezas a avanzar un poco más rápido, nunca dejará de asombrarte determinadas 'barbaridades' y a veces verás un tocho de código de 30-100 líneas que simplemente se puede resumir en 4 líneas, pero debido al tamaño hasta que no lo analices complatamente (esas 30-100 líneas) no te das cuenta de lo que pretendía hacer, luego, inevitablemente, se te escapa una sonrisa de tipo desesperante (es como si trataras de resolver un puzzle infantil) ....
281
« en: Martes 5 de Mayo de 2009, 23:23 »
Lo 1º es indicarte que este es el foro de VB no de C. Lo 2º es preguntarte por qué escribes en mayúsculas...
En cuanto a tu problema, lo puedes solucionar fácilmente con la api SetParent 1 Al formulario modal le cambias la propiedad visible a false, 2 Haces el showdialog al formulario modal, 3 Haces el setparent del control, si el control no tiene hwnd, mételo en un contenedor (por ejemplo un picturebox) y se lo aplicas a este. Debes hacer pública una función del formulario padre o friend, a la que invocas. 4 Reubica la posición del control, si fuera necesario 5 Ahora haces visible el formulario modal.
Al terminar, antes de cerrar el formulario modal, debes volver a hacer un setparent en la dirección opuesta (origen y destino se intercambian).
282
« en: Martes 5 de Mayo de 2009, 22:56 »
No hay problema en aceptarlo. Simplemente hay que poner las cosas claras a quien te hace el encargo.
Hay que explicarle tu limitación al respecto (posiblemente use fórmulas que desconozcas), en este caso conviene que quede perfectamente aclarado que no son 1 sino varias tareas.
A - Estudiar el código escrito: tratar de captar estructuras, enumeraciones, funciones... B - Ordenar las ideas: trata de unificar estructuras, funciones y enumeraciones y deducir las clases resultantes. C - Rehacer el código: rediseña un esqueleto más sólido que permita añadidos sin que fuercen cambios profundos. Especialmente sepáralo completamente de la interfaz, no metas código de cálculo dentro de un botón, dentro de un botón sólo debe ir código de interfaz y llamadas a funciones que realizan el cálculo, pero no el cálculo mismo. D - Hacer los añadidos nuevos: saber donde se deberá ubicar, entender como influirá a lo que ya hay...
Otra solución es dejar de lado el código actual siempre que te endorse alguien que aunque no tenga conocimientos en programación si que tenga los conocimientos en el área solicitada. Entonces tu vas plantando la lógica y los cálculos serán llamadas a funciones del nombre del cálculo con los parámetros que utiliza, que de momento queda vacía (en esqueleto y una devolución razonable para probar la sección del programa). Por tanto en un momento dado la persona que te han asignado te deberá explicar qué cálculos se utilizan, cómo y que párametros necesita, a ti te corresponde traducir ello a código.
De todos modos estudiar un código ajeno puede llegar a ser muy molesto en ello influye el tamaño del programa (de cuántas líneas estamos hablando?) y el tiempo que puede llevarte, tanto como tu persevarancia para aguantar una situación de ese tipo.
Piensa también que no es lo mismo leer código que no entiendes realizado por un entendido que leerlo de alguien que no tiene sólidos conocimientos, hay una gran diferencia. Del primero posiblemente haya partes que tantas veces las leas, tantas veces seguirás sin entenderlas pero del segundo sólo es 'poner en orden' . Del primero posiblemente se pueda decir que te resulte difícll mejorarlo , del segundo queda fuera de toda duda que será más rápido y breve.
... en fin aceptarlo o no, depende más de tus capacidades que de otra cosa, especialmente si como dices dicho código está escrito por alguien 'principiante'...
283
« en: Domingo 3 de Mayo de 2009, 08:31 »
creo entender que ... si es asi usa el FileCopy(pathOrigen,pathdestino) JC No, no es eso lo que pide. Hola amigos mi pregunta es como agregar un archivo a mi aplicacion.....
Simplemente, puedes añadirlo como recurso a la aplicación... Luego, cuando compiles el programa y lo quedes listo para la distribución queda añadido. ...y al ejecutar la aplicacion exporte el archivo en por ejemplo en "C:" ... ya le indicas al instalador donde irá cada archivo...
284
« en: Viernes 1 de Mayo de 2009, 05:42 »
Debes usar la api: 'SetWindowPos' Esta es la declaración: Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Los parámetros son: hwnd : el hwnd del formulario en cuestión. hWndInsertAfter: este parámetro significa 2 cosas, o bien el hwnd del formulario sobre el que se posicionará debajo , o una constante que indica como se comporta en el orden Z, estas constantes te las describo como una enumeración al final... en el ejemplo... X: la nueva posición horizontal y: la nueva posición vertical CX: el nuevo ancho que le quieres dar CY: el nuevo alto que le quieres dar wFlags: son estados para especificar más opciones de tamaño y posición, resulta bastante largo de especificar en detalle, por lo que lo omito... Para probar el programa copia el código y pégalo a un nuevo proyecto, añade un botón y dale a ejecutar.... Ten en cuenta que los valores que lo colocan en primer plano son los valores -1 y 0 y el valor que le devuelve la 'normalidad' es el valor -2. Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Const MOSTRAR_VENTANA = 64 ' es el flag que vamos a meter... en hexadecimal es H40 ' las constantes cuando el parámetro hWndInsertAfter utiliza constantes... private enum enPosicionZ ORDEN_NORMAL= -2 ORDEN_EN_LA_CIMA= -1 ORDEN_ENCIMA=0 ORDEN_DEBAJO=1 end enum Private Type Rectangulo X As Long Y As Long Ancho As Long Alto As Long End Type Private p_OrdenZ As enPosicionZ Private AreaF As Rectangulo Friend Property Get OrdenZ() As enPosicionZ OrdenZ = p_OrdenZ End Property Friend Property Let OrdenZ(ByVal oz As enPosicionZ) If p_OrdenZ <> oz Then If oz > -3 And oz < 2 Then p_OrdenZ = oz Call getRect Call SetWindowPos(Me.hwnd, p_OrdenZ, AreaF.X, AreaF.Y, AreaF.Ancho, AreaF.Alto, MOSTRAR_VENTANA) msgBox("Nuevo orden z: " & p_OrdenZ) End If End If End Property Private Sub Command1_Click() Static n As Integer n = n + 1 If n = 2 Then n = -2 OrdenZ = n End Sub ' toma la posición y medidas actuales del Formulario Private Function getRect() AreaF.X = ScaleX(Me.Left, vbTwips, vbPixels) + 0 ' previsto para añadir alguna variable AreaF.Y = ScaleY(Me.Top, vbTwips, vbPixels) + 0 AreaF.Ancho = ScaleX(Me.Width, vbTwips, vbPixels) + 0 AreaF.Alto = ScaleY(Me.Height, vbTwips, vbPixels) + 0 End Function
Por último indicarte que no abuses de colocar ventanas encima del todo, deja que el usuario decida si le interesa o no. Sólo los malos programadores y las malas aplicaciones le quitan la decisión al usuario... Nota: en el modo -1 comparte orden con el administrador de tareas, el que tenga el foco activo se coloca encima... es para evitar fantasmadas de lamers... p.d.: se me olvidaba... para que se quede encima de la barra de tareas, debes maximizar la ventana y ponerla sin bordes, estos es, establece en diseño: windowstate=2 y borderstyle=0
285
« en: Miércoles 29 de Abril de 2009, 21:24 »
... de nada..
Creo que hice bien, en dividir el asunto y parar, hasta esperar respuesta, hubiera perdido el tiempo para nada...
Es habitual que alguien postee un mensaje y jamás vuelva siquiera a ver la respuesta...
286
« en: Miércoles 29 de Abril de 2009, 21:06 »
Decir también que hay formatos predefinidos para los tipos generícos de datos, los cuales se pueden invocar por sus nombres i pasar mediante una enumeración.. Un ejemplo que va pasando por diferentes formatos... tras exponer cada formato realiza una pausa de unos 3 segundos... Private Sub Text5_Validate(Cancel As Boolean) Dim t As Single ' formato moneda basado en la configuración regional del equipo Text5.Text = Format$(Text5.Text, "Currency") t = Timer Do DoEvents Loop While (Timer - t) < 3 ' este es equivalente al que solicitaba el usuarioal abrir el post Text5.Text = Format$(Text5.Text, "Standard") t = Timer Do DoEvents Loop While (Timer - t) < 3 ' con decimales... sin puntuación Text5.Text = Format$(Text5.Text, "Fixed") t = Timer Do DoEvents Loop While (Timer - t) < 3 ' notación científica Text5.Text = Format$(Text5.Text, "Scientific") t = Timer Do DoEvents Loop While (Timer - t) < 3 ' sin formato... Text5.Text = Format$(Text5.Text, "General Number") t = Timer Do DoEvents Loop While (Timer - t) < 3 ' si es cero devuelve false, en otro caso devuelve true Text5.Text = Format$(Text5.Text, "True") ' false, on, off End Sub
Hay más formatos predefinidos, sobretodo usando fechas... pero la idea creo que es ilustrativa...
287
« en: Miércoles 29 de Abril de 2009, 20:48 »
mucho mas facil asi, una pregunta F_Tanori para utilizar otro tipo de separador como un punto o simplemente un espacio ¿se puede de la misma forma?
EDIT: me respondo a mi misma pense que era tan facil como cambiar ###.###.##. o poner espacios pero con punto definitivamente no funciona y con espacio da problema en numeros grandes
saludos. Si, hay que tener cuidado, piensa que cada '#' representa una cifra, entonces una cifra sólo reconoce números y los signos de puntuación de números. Si los signos de puntuación provocan desbordamiento dará error, en el siguiente ejemplo la idea era colocar dentro del formato la parte: 'H:' precisamente por el error indicado como se ve se trata aparte. Aunque parezca limitado en realidad no lo es (aunque superar ese límite resulta tedioso), ya que podemos encadenar varios formateos: (texto= formato(a) & formato (b) & ... formato(n)) ' por ejemplo introduce la cadena: 123456789 y saldrá formateada como: 'H: 123 456 789-V', notar como H: convenientemente se ha dejado previo (parte del formato, pero inicial) Private Sub Text2_Validate(Cancel As Boolean) Text2.Text = "H:" & Format$(Text2.Text, " ### ### ###-V") End Sub
Otro ejemplo para terminar... Aquí necesitamos que el usuario ingrese un valor de 7 cifras que luego nosotros formateamos, el formato tiene 12 cifras, sin embargo el usuario nunca podrá escribir más de 7 ' previamente en diseño o en la carga del formulario establecemos el límite que deseamos, esto es: Text4.MaxLength = 7 ' antes de dar formato establecemos el nuevo largo (que ya sabemos el tamaño resultante) , luego volvemos a fijar la longitud del 'usuario' ' el resultado es que el usuario no puede ingresar más de 7 caracteres, pero nosotros si podemos mostrarle más... Private Sub Text4_Validate(Cancel As Boolean) Text4.MaxLength = 12 Text4.Text = Format$(Text4.Text, "0## #### ###") Text4.MaxLength = 7 End Sub
Si al ejemplo anterior le cambios el 0 del formato por una X es decir el siguiente código: el formato nunca rellenará hasta 12 caracteres, con la X , sólo pondrá una X La razón es que hay caracteres literales y caracteres comodín, el '0' es un carácter comodin como lo es '#', pero otros caracteres son comodín de si mismos... Hay algunos caracteres significativos, por ejemplo format$(texto ">") convierte a mayúsculas el 'texto' y el '<' a minúsculas... Private Sub Text4_Validate(Cancel As Boolean) Text4.MaxLength = 12 Text4.Text = Format$(Text4.Text, "X## #### ###") Text4.MaxLength = 7 End Sub
288
« en: Miércoles 29 de Abril de 2009, 19:40 »
Efectivamente, con format$ , además hay que usarlo en el evento validate tal como muestra F_Tanori, pero de paso aprovechamos para comprobar si está dentro de los valores deseados. Aquí el ejemplo completo que formatea el número pero además controla si el valor introducido está dentro del rango 5-100, esto es no acepta otros valores distintos de los de dicho rango. Private Sub Text1_Validate(Cancel As Boolean) Text1.Text = Format$(Text1.Text, "##,##0.00") If (Val(Text1.Text) < 5) Or (Val(Text1.Text) > 100) Then Beep Cancel = True End If End Sub
Por supuesto el control text1 debe tener su propiedad CausesValidation a True, de otro modo no recibe dicho evento... (por defecto Causesvalidation se establece a True, por lo que salvo que se cambie desde código no haría falta cambiarlo, pero para prevenir despistes quizás convenga añadir una línea en la carga del formulario: Private Sub Form_Load() Text1.CausesValidation = True End Sub y por último si quieres eliminar los decimales cuando estos son ceros el siguiente código lo muestra... sólo lo elimina cuando el valor ha sido 'validado', para no hacer pensar al usuario que el problema son los decimales... [code=vb] Private Sub Text1_Validate(Cancel As Boolean) Text1.Text = Format$(Text1.Text, "##,##0.00") If (Val(Text1.Text) < 5) Or (Val(Text1.Text) > 100) Then Beep Cancel = True Else If Right$(Text1.Text, 2) = "00" Then Text1.Text = Format$(Text1.Text, "##,##0") End If End If End Sub
[/code]
289
« en: Martes 28 de Abril de 2009, 17:40 »
De todas formas puedes llarmarlo desde código, por ejemplo durante la carga del formulario dentro del 'load'.
290
« en: Martes 28 de Abril de 2009, 09:33 »
En Vista tienes una versión distinta del componente. Las referencias son un 'numeraco' largo que se crea del componente para identificarlo unívocamente.
Por ejemplo si tienes un archivo llamado componente.dll versión 3.123 tendrás un identificador diferente si también tuvieras el mismo componente.dll versión 2.853.
Puedes hacer 1 de 2 cosas: localizar la referencia en tus archivos y sustituir el identificador manualmente por el correspondiente, o bien eliminar la referencia del proyecto, guardarlo, cerrarlo volverlo a abrir localizar la referencia nuevamente pero ahora ya la versión que viene con vista y añadirla, luego vuelve a guardar el proyecto.
291
« en: Martes 28 de Abril de 2009, 09:16 »
Necesitas un manual sobre programación orientada a objetos, cómprate un libro sencillito y pequeño que te explique los fundamentos, para aprender qué es un objeto y cómo se manipulan, de otra forma aunque se te resuelva tu duda, vendrás al día siguiente con otra tontería similar. Aprendiendo de esa manera, sólo tendrás grandes lagunas, y lo poco que sepas sólo lo sabrás 'de memoria', por que te lo han dicho, sin llegar a comprender realmente por qué es así.
292
« en: Martes 28 de Abril de 2009, 09:06 »
buenas tardes que tal,
e visto un ejemplo en visual basic 6 que en un combobox muestra dos columnas, sin crear dos combos Vas confundido, en VB6 un combobox puede mostrar varias columnas pero en realidad son la misma y única columna, es decir despliegas los elementos que tiene en vez de en una columna larga en varias columnas cortas, pero a efectos prácticos es una y sólo una columna aunque a efectos estéticos se vean varias. Piensa en un combobox como una matriz unidimensional, si necesitas 'una matriz de varias dimensiones', entonces utiliza un datagridview (por ejemplo), donde cada columna es efectivamente independiente.
293
« en: Martes 28 de Abril de 2009, 08:51 »
...Pero no me entiendes... El que no entiende eres tú... Esq en java solo he trabajado el modo consola. Eso no importa. Una matriz es igual en todos los lenguajes, las diferencias entre los lenguajes vienen por otro lado, no por la lógica ni la matemática. PD: se me habia ocurrido lo del txtbox, pero cuantos debo hacer?? solo 1??? De ser solo 1, Como hago con las posiciones?, o el VB ya sabe q es una matriz?? VB como cualquier otro lenguaje reconocerá matrices 'si le enseñas cómo', es decir se podría construir un control activeX que reciba la matriz y que tras pulsar un botón imprima el siguiente elemento. Imprimir en la consola, es casi lo mismo que imprimir en el formulario, por tanto puedes hacer un 'me.print el_elemento ', 25 elementos caben en el formulario uno bajo el otro salvo que pongas una fuente muiy grande ó tengas una pantalla/ventana muy pequeña. De todos modos los puedes poner en línea si al final del print añades una 'coma' o un espacio de tabulador para dejar mayor separación poniendo 'punto y coma'. Donde en Java usabas el: 'system.Out.Println(....)' aquí puedes utilizar 'debug.print loquesea' o 'Me.print loquesea' .. 'Me' es el equivalente a 'This'
294
« en: Viernes 24 de Abril de 2009, 04:29 »
hi amios, tengo un peño problema espero q me ayuden quiero q en un lbl me vote un nº negativo y positivo ejm -1,+2,-3,+4....
En este programa me vota : 1,3,5,.... Yo quiero q me vote -1,+3,-5,+7...... Esto es la serie de Euler... parece que ahora le ha tocado el turno a las series matemáticas para los problemas que os plantean los profesores ... que mejor que distraer al personal no usando el nombre de la serie, verdad ????. Aunque mosquito te da un algoritmo que resuelve tu problema, cuando se trabaja con números lo mejor es usar strings lo menos posible... es decir sólo en la entrega al control si es posible... El siguiente código lo resuelve de dicha manera... Private Sub Command3_Click() Dim i As Integer, n As Integer Dim paso As Integer s = 1: paso = 1 For i = 1 To HScroll1.Value Step paso n = i * s MsgBox CStr(n) s = -s Next End Sub
Lo ideal es montar el código en una función de modo que se le pasen 3 parámetros valor inicial, cantidad de elementos a calcular y distancia entre cada número, que en el bucle se identifican con el punto de inicio del bucle, punto alto del bucle (en el ejemplo se ha supuesto que un control scroll señala la cantidad a calcular) y el paso (step)... los valores se alamcenarían en una matriz que al término del bucle entrega....
295
« en: Jueves 23 de Abril de 2009, 05:28 »
bueno después de elaborar todo el mensaje al ir a añadir el código de ejemplo, se ha ido todo ahacer puñetas, la ventana se ha colgado, no sé porqué.... Como no me patece repetir el mensaje... te pongo el código y 4 breves indicaciones, si tienes dudas luego haces las preguntas que consideres... Este código va en un módulo.... Public Enum MisUsuarios Admin = 0 Ramon = 1 Juan = 2 Maria = 3 Andres = 4 Violeta = 5 End Enum Public MivariableGlobalDeEjemplo As Integer ' estas variables no deben ser accesibles al usuario Public salir As Boolean ' sale un usuario, no se cierra la aplicación. Public Cerrar As Boolean Public usuario As MisUsuarios Public Sub main() Dim mdi As MDIForm Form1.Caption = "Panel del administrador..." ' allí hay un botón tal que su código es cerrar=true Form1.Show 1 ' formulario del administrador.... el administrador arranca la aplicación, cuando ciere su ' ventana puede entrar otro usuario ... Siguiente: Call ResetVariables 'aquí llamamos a un procedimiento que restablece las variables al valor deseado como inical... usuario = (usuario Mod 5) + 1 ' garantiza que rota entre usuarios pero no regresa al admin ' en vez de usarse un usuario tras ootro aquí debería mostrarse una ventana de login... Set mdi = Nothing Set mdi = New mFrm1 mdi.Show Do DoEvents Loop While salir = False salir = False If Cerrar = False Then GoTo Siguiente ' al llegar aquí se cierra la aplicación, definitivamente, para ello sólo el admin debería acceder a cambiar el valor de salir ' entrando en su panel de administrador 'end ' sólo cuando no haya tareas pendientes... en este caso no las hay pero al salir de main termina la aplicación, no necesitamos end. End Sub Public Function getNombreUsuario(ByVal numero As MisUsuarios) As String Select Case numero Case 0 getNombreUsuario = "Administrador " Case 1 getNombreUsuario = "Ramón " Case 2 getNombreUsuario = "Juan " Case 3 getNombreUsuario = "María " Case 4 getNombreUsuario = "Andrés " Case 5 getNombreUsuario = "Violeta " End Select End Function Public Function ResetVariables() MivariableGlobalDeEjemplo = 25 ' .... End Function
Este otro código va en el formulario MDI Public VariableDeEjemploReseteadaTrasCerrarMDI As String Private Sub MDIForm_Load() Me.Show ' centrado a lo ancho, arriba, 2/3 del ancho de pantalla y 2/3 del alto de pantalla Me.Move (Screen.Width - Me.Width) / 2, 0, (Screen.Width / 3) * 2, (Screen.Height / 3) * 2 Me.Move (Screen.Width - Me.Width) / 2, 0 Me.Caption = "El usuario: " & getNombreUsuario(usuario) & "tiene su ventana de aplicación lista..." End Sub Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer) Unload Me salir = True End Sub Private Sub mnuMDI_Click(Index As Integer) MsgBox "valor actual de la variable interna del form MDI: " & VariableDeEjemploReseteadaTrasCerrarMDI VariableDeEjemploReseteadaTrasCerrarMDI = InputBox("Modifica el texto y luego cierra la aplicación, volverá a resurgir como el ave Fénix, con los valores de este form reseteados y con los valores globales restablecidos desde la función al efecto...", "Cambiamos el valor de la variable ahora...", VariableDeEjemploReseteadaTrasCerrarMDI) End Sub Private Sub mnuVariables_Click(Index As Integer) MsgBox "el valor actual de la variable 'MivariableGlobalDeEjemplo', es: " & MivariableGlobalDeEjemplo Select Case Index Case 0 MivariableGlobalDeEjemplo = 20 Case 1 MivariableGlobalDeEjemplo = 30 Case 2 MivariableGlobalDeEjemplo = 99 End Select MsgBox "El valor de 'MivariableGlobalDeEjemplo', que se resetea tras cada reinicio del MDI ha cambiado al valor: " & MivariableGlobalDeEjemplo End Sub
Para recrear correctamente el proyecto, crea un nuevo proyecto, añade un módulo y un formulario MDI, luego cambia en las porpiedades del proyecto para que arranque desde main. el formulario MDI renómbralo a mFrm1 Éste lleva 2 menús, el 1º tiene 3 submenús, el 2º sólo tiene un submenú.... El bucle principal realiza en este orden: a ) restablecer las variables globales.... llamando a una rutina b ) loguear al usuario... en el ejemplo el loguin es simulado, (no forma parte del problema) c ) resetear el estado del formulario MDI (o mantener el estado actual)... Si necesitas detalles o explicaciones adicionales, realiza las preguntas oportunas... Incluyo un archivo comprimido que puedes descargar si no quieres teclear...
296
« en: Martes 21 de Abril de 2009, 15:41 »
Sr(a) ...o ser del espacio exterior, ó ... Cuando se habla con alguien no es necesario saber su sexo, ni su ciudad, ni su edad, ni su 'color preferido' ni nada más que su nombre. Baste decir su nombre: Nebire a secas no te deja caer en posibles errores, salvo que la malintencionalidad de uno quiera suscitar disputa creándose un 'auto-cacao mental'. La critica es saludable. "Cuando es Constructiva". El último párrafo (que parece ser en el que basas toda tu respuesta), sólo te invito a hacer el uso adecuado del foro. antes de postear asegúrate de hacerlo en el sitio adecuado. Dicho de otra manera, en ese párrafo te señalaba que no confundas un 'foro' con un 'chat'. El hacer una refelexion de tipo tecnica, no persigue descalificar. Sino poner las cosas en su lugar. El problema de delphi con respecto a desarrolo de aplicaciones "practicas" en el area de inteligencia artificial, radica en la poca documentacion que existe al respecto. (cuando hablo de problema, se refiere a una situacion que debe ser resuelta). Por si no entendio, la disyuntiva: "delphi<=>ia", apela a la posibilidad de poder incoporar rutinas que "reconozcan patrones", en forma nativa dentro de un ejecutable delphi. ¿por que nativas? por que es muy facil portar delphi (que trabaja en windows) a Lazaruz (que trabaja en Linux/windows) la alternativa ".net", es un salvavidas "lento". (aqui, no es mi intencion decir .net en malo). se debe entender asi: .net , no cumple las espectativas , en relacion tiempo de respuesta al cual estan habituados, los clientes (usuarios finales). ..bla, bla, bla... para justificar tu mala leche. Yo no he mencionado en ninguna parte de mi mensaje, nada ni de : NET, ni de Delphi, ni de 'posibilidad de poder incoporar rutinas que "reconozcan patrones"', ni de ' es un salvavidas "lento"', ni de '.net , no cumple las espectativas', ni nada de nada de lo que mencionas, para que saques conclusiones de ningún tipo. La verdad es que con interlocutores como usted se hace "dicifil avanzar". Fíjate que difícil es avanzar (conmigo), que te señalo (en el mensaje anterior), que uses el lenguaje que te salga de los güevos, sin preocuparte de lo que digan los demás acerca del lenguaje que a ti te parece adecuado a tus necesidades (aunque sólo fuera por que es el único que conocees en profundidad), especialmente si has concebido un modo de llevarlo a cabo (aquello que quieres hacer) . ...O sea no por ser distinto a usted, pretendo faltarle el respeto... Claro, claro... fíjate si somos distintos, yo tengo la piel verde, una cabeza que ocupa la mitad de mi masa corporal, con un sólo ojo y 4 patas (12 dedos por cada pie) y escribo con 3 orejas que son como tentáculos, además mi lenguaje natural es el 'raticulín', de modo que utilizo un programa automático para traducir al español. Provengo del planeta Ganímedes y formo parte de una avanzadilla cuyo objetivo es invadir toda la galaxia para ser los amos del mundo... por eso contesto en estos foros, para distraer a la gente mientras me hago con el control del palneta. ...vamos que cualquier parecido entre tú y yo es pura casualidad... pero ávido tú, con 3 mensajes ya conoces todas las diferencias entre tú y yo. Que, por supuesto, los demás foreros, ¿tontos ellos?, no han percibido. Mira, en el mensaje anterior sólo te he indicado 3 cosas:la 1ª que... Un lenguaje poco apto para determinada tarea se convierte automáticamente en el más apto (para una determinada persona... ) SI es el único disponible, o el único que se conoce. la 2ª que... el (conocimiento y) uso de matemáticas y/o física es deseable, pero si no se poseen, no está todo perdido, todavía pueden crearse buenos programas en el 95% de las situaciones, queda claro que quizás no se podrá diseñar un programa que controle un experimento de una central nuclear, pero todavía la interfaz gráfica o partes del mismo si. la 3ª que... aunque me agrada conversar de casi cualquier cosa, hay que distinguir las diferencias entre un foro y un chat, y que por ello (porque esto no es un chat) este mensaje no está ubicado en el sitio más adecuado. Esto es el resumen de mi mensaje anterior, cualquier otra interpretación de tu parte se debe a las 'diferencias' que tu encuentras y que por cortesía te he enumerado...
297
« en: Sábado 18 de Abril de 2009, 20:12 »
HOla!!!
vi tu programa y me gusta lo que hace es genial que te muestre las operaciones, pero mi profesor es algo raro y los temas no los explica diferente yo no uso funciones para el de biseccion, me gustaria que me agregaras para poderte hacer unas preguntas con respecto al programa y tmbn si no es molestia para que me pases ese codigo mi correo es al...arruga hotmail puto compadre. de antemano muchas gracias ( Borrar dirección email, o editarlo ) A ver, alemarva... No vayas alegremente exponiendo tu email por internet, sólo conseguirás llenar tu correo de basura y quedarte bastante molesto e inútil. Por otro lado las preguntas que tengas puedes hacerlas en el foro (esa es su función). Yo no he visto que nadie se haya ofrecido a atender preguntas por correo, además que no se tolera (ni es deseable) ....
298
« en: Sábado 18 de Abril de 2009, 20:04 »
...he buscado y no he hayado nada... Esto sólo es posible si no sabes buscar... ...los que he hayado son muy complicados, y necesito algo mas sencillo...
Esto también es improbable... Un bucle While es casi idéntico a un bucle for. De entrada sirven para lo mismo, repetir un determinado código una cierta cantidad de veces. La diferencia entre el 'for' y 'while' es que la cantidad de veces que se ejecuta un bucle for es más o menos conocida, en cambio en un bucle while se usa cuando no se sabe la cantidad de iteraciones que se deben hacer. (digo que la cantidad de iteraciones de un bucle for es más o menos conocida, porque puede programarse de forma que su ciclo de salida nunca se alcance, en cuyo caso se sale con exit for... o un goto...). No obstante mejor que explicar while es explicar Do...loop que es lo mismo. Los siguientes son firmas del mismo tipo de bucles while...wend do while .... loop do until .... loop do ... loop while ... do ... loop until ... La caracterítica de este tipo de bucle es que es condicionado (un bucle for en principio es incondicional, se ejecuta un número determinado de veces, aunque esto sólo es la definición del mismo, ya que en la práctica no es verdad.). Que un bucle es condicionado quiere decir que se ejecuta mientras se cumpla una condición (tambén puede expresarse, mientras no se cumpla una condición). De hecho si traducices While significa precisamente: While = 'mientras' . Entonces la lógica del bucle es: mientras no se cumpla la condición x ' while dia <> "Lunes" : call PasearPerro("Calle VB Nº6.0", "Tobi") ..... wend ... hacer lo que haya dentro del bucle retorno de mientras
Da igaul que te hayan pedido x ejemplos yo sólo te pondré 1. Crea un proyecto, añade un botón y mete este código dentro del evento click del botón. Inicio= timer Me. Backcolor= vbBlack: Me.forecolor= vbWhite command1.enabled=false Do doevents Ahora= timer Me.cls: Me.CurentX= 200: me.currenty=200 Me.Print cstr( Ahora - inicio) & " segundos..." loop while ahora - inicio < 3600 command1.enabled= true
Este ejemplo, crea una pausa de 1 hora. Timer es una función que le pregunta al sistema cuanto tiempo ha transcurrido desde las 12 de la noche. (Nota: el ejemplo fallará si se ejecuta entre las 11 de la noche y las 12, ya que cuando llegue a las 12 timer retorna su valor a 0, como el propósito es meramente ilustrar el uso de los bucles condicionales, pasamos por alto esta situación). Cuando pulsamos el botón, lo primero que se hace es desactivar el botón (no se puede pulsar nuevamente), hasta que sale del bucle después de una hora, que como se ve le indicamos que se vuelva a activar. Para hacer el ejemplo, más ilustrativo hemos añadido unas simples líneas que van mostrando el 'paso' de la ejecución del bucle. Para probarlo, es mejor que cambies el valor de la condición de 3600 (1 hora) a por ejemplo 30 sg, que es una espera 'asumible'. Fíjate que podemos remplazar la firma del bucle sustituyendo : 'do' por 'while ahora - inicio < 3600' y sustituyendo 'loop while ahora - inicio < 3600' por wend... en el caso presente, el cambio no tiene importancia, sin embargo en otros casos no es tolerable. La razón principal reside en cuando se comprueba la condición.. si la condición se pone abajo, el bucle se ejecuta siempre como mínimo 1 vez, en cambio si se ejecuta la condición arriba, puede darse el caso de no llegar a entrar en el bucle si la condición ya se satisface...´Con esto lo que te quiero indicar es que de alguna manera olvides el uso de while ...wend en favor del do ... loop que por lo indicado es más versátil. Por último indicarte que el bucle do ... loop permite tanto el uso de 'while', como de 'until'... Decir que cualquier bucle puede ser erediseñado para usar indistintamente uno u otro, pero según el caso de que se trate es más fácil diseñar un bucle con while o con until... (until = hasta que...) . El uso de estas 2 posibilidades es el equivalente a decir: 'El domingo no trabajo", esta frase es más fácil que decir "No trabajaré aquel día que no sea ni lunes ni martes ni miércoles... ni sábado'... el ejemplo anterior reconvertido a until: Inicio= timer Me. Backcolor= vbBlack: Me.forecolor= vbWhite command1.enabled=false Do doevents Ahora= timer Me.cls: Me.CurentX= 200: me.currenty=200 Me.Print cstr( Ahora - inicio) & " segundos..." loop until ahora - inicio >= 3600 command1.enabled= true
En este caso ha sido fácil (porque sólo usamos una condición y además es de comparación)... fíjayte que al caso es lo mismo decir : 'Hacer esto : sumar 1 : mientras la suma sea menor de 100' que lo siguiente: 'Hacer esto : sumar 1 : hasta que la suma sea mayor o igual que 100' ...ya debería quedarte claro...
299
« en: Miércoles 15 de Abril de 2009, 01:15 »
• Si el número es par, dividirlo en dos. • Si el número es impar, multiplicarlo por tres y sumarle 1. • Se debe repetir este proceso hasta que el número ingresado se transforme en 1. suponiendo que el número ingresado es 20 sería: Valor inicial: 20 Valor siguiente: 10 Valor siguiente: 5 Valor siguiente: 16 Valor siguiente: 8 Valor siguiente: 4 Valor siguiente: 2 Valor siguiente: 1 Valor final es 1, numero de pasos necesarios: 7
El algoritmo es una famosa serie que se llama 'serie granizo', aunque probablemente gugleando lo encontrarás más fácilmente con el nombre de la 'Conjetura de Collatz' ... Hace años estuve trasteando con esta serie para mostrar puntos espaciales en 3 dimensiones, más que nada por curiosear.. pero como te indica Mosquito, no se hacen tareas. Ya tienes info para realizar búsquedas.. si es que vuelves por aquí a leerlo... por ejemplo el número 99999 produce una serie de 225 números (226 si lo consideras también a él) y el 9999, 98 el 20 que has expuesto 7.
300
« en: Domingo 12 de Abril de 2009, 14:27 »
No das detalles de lo que llevas avanzado, pero bueno... supondremos entonces que estás al principio, es decir sabes lo que quieres hacer(o casi) pero no como lograrlo... Como debes saber la notación postfija no precisa parçéntesis. Bien partiendo de aquí es necesario que sepas y establezcas una tabla de prioridades aplicada a los operadores... Para no hacerlo más complejo de lo necesario supondremos que tus operadores son operadores aritméticos, es decir +, - *, / (las 4 operaciones básicas). Como sabrás el orden de prioridad de los operadores aritméticos es 1º: multiplicación, 2º: división, 3º: suma, 4º: resta. Por tanto una expresión como: 5*2 + 3 / 3 - 6 * 2 puede de entrada ser distinto de : (5*2) + (3/3) - (6*2) y ser distinto de: (5 * 2 + 3) / (3 - (6 * 2)) , etc... por tanto a dichos operadores hay que añadir los operadores: 0º: ( , y el -1º: ) Dicho de otro modo, la tabla de prioridades es una definición de las 'normas' cuyo criterio ha de cumplir tu programa según lo esperado. Debes saber que lo que está entre paréntesis se ejecuta antes que el resto, por ello los símbolos de paréntesis deben definirse también como operadores, en este caso sólo operan prioridad, lo que implica un orden, por tanto si los defines como operadores de orden, nadie podrá decirte que no. Entendiendo correctamente estos antecedentes, ya podemos empezar a formular nuestro analizador... ..digamos que nuestro compilador tendrá al menos 2 fases claras, una que analiza las expresiones entradas y otra que después evalúa (opera con) el resultado. Ciertamente para ello necesitamos una pila y lo mejor para todo ello es trabajar con clases, para trabajar más cómodamente cada apartado. Visual Basic no tiene una pila como objeto de programación, por tanto lo 1º será recrear una sencilla pila. Te pongo un un ejemplo, que podrás modificar a tu gusto. nota especialmente que a esta pila le hemos dado una propiedad 'especial', al permitir que actúe como fifo, filo incluso como ambas a la vez... Nota que el VB 6.0 lo mejor para implementar una pila es una colección. y nota también que nuestra pila es una pila genérica, por eso utilizamos elementos de tipo variant. Si a la hora de utilizarlo tienes claro que sólo usarás un tipo de elemento, por ejemplo string, sería conveniente cambiar los prototipos a string en vez de a variant, sin embargo fíjate que es probable que necesites usar más de una pila en tu proyecto por lo que podrías necesitar realmente tener un tipo variant,... qué tal si la pila de tu proyecto usara como elementos precisamente elementos de tipo pila ???. Tendrías muchas posibilidades de un gran trabajo adelantado por una enorme sencilez antes esta posibilidad... piensa en ello detenidamente... Public Enum enTipoPila PILATIPO_FILO = 1 ' primero en entrar último en salir PILATIPO_FIFO = 2 ' primero en entrar primero en salir. PILATIPO_AMBOS = 3 ' se decide de qué extremo queremos sacar indistintamente End Enum Public Enum enExtremo EXTREMO_INICIAL = 0 EXTREMO_FINAL = 1 End Enum ' =========== CAMPOS DE LAS PROPIEDADES ================ Private p_Pila As New Collection Private p_TipoPila As enTipoPila ' =========== PROPIEDADES DE LA CLASE ================== Public Property Get TipoPila() As enTipoPila TipoPila = p_TipoPila End Property Public Property Let TipoPila(ByVal tp As enTipoPila) p_TipoPila = tp End Property Public Property Get Count() As Long Count = p_Pila.Count End Property '============= MÉTODOS públicos DE LA PILA ============= ' la pila siempre añade al final Public Sub Push(ByRef Elemento As Variant) p_Pila.Add (Elemento) End Sub ' en 'nuestra' pila podremos quitar del inio, del final o de ambos... ' es una pila 'especial'... ' extremos sólo es necesario para el caso de la pila de extraer de 'ambas partes indistintamente Public Function Pop(Optional Extremo As enExtremo = EXTREMO_INICIAL) As Variant If p_Pila.Count > 0 Then ' sólo si la pila tiene elementos devolvemos... Select Case p_TipoPila Case enTipoPila.PILATIPO_FILO Pop = PopFilo Case enTipoPila.PILATIPO_FIFO Pop = PopFifo Case enTipoPila.PILATIPO_AMBOS 'If IsMissing(Extremo) Then Extremo = EXTREMO_INICIAL ' If Extremo = EXTREMO_FINAL Then Pop = PopFilo Else ' toma del principio. Pop = PopFifo End If End Select Else ' quitar elementos de una colección vacía origina un error,ocasionalmente podría sustituirse por on local error resume next.. ' no devuelve elementos Pop = "No elementos" End If End Function '============= MÉTODOS privados DE LA PILA ============= ' pop siempre devuelve un elemento y luego lo elimina, en este caso del final Private Function PopFilo() As Variant PopFilo = p_Pila.Item(p_Pila.Count) p_Pila.Remove (p_Pila.Count) End Function ' pop siempre devuelve un elemento y luego lo elimina, en este caso del inicio. Private Function PopFifo() As Variant PopFifo = p_Pila.Item(1) ' las colecciones se basan en índice 1 p_Pila.Remove (1) End Function '============== MÉTODOS DE LA CLASE ================== Private Sub Class_Initialize() p_TipoPila = PILATIPO_FILO ' puesto que los valores van del 1 al 3, 0 no se admite. End Sub Private Sub Class_Terminate() Set p_Pila = Nothing End Sub
... a la tarde continúo en otro mensaje, el post será un poquito extenso... pero de momento puedes probar a mmanejar la pila
Páginas: 1 ... 10 11 [12] 13 14 ... 29
|
|
|