• Martes 13 de Mayo de 2025, 11:28

Mostrar Mensajes

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
Cita de: "johndoe90"
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:

Código: Visual Basic
  1.  
  2. float FAR PASCAL DLLdame_cpuUsage()
  3. {
  4. return my_Process.dame_cpuUsage();
  5. }
  6.  
  7.  

Como puedes ver esa declaración no utiliza parámetros...
entonces tu código debería quedar así:

Código: Visual Basic
  1.  
  2. ' esto es lo que has puesto:
  3. DLLdame_cpuUsage (cpuUsage)
  4.  
  5. ' y esto es lo que debes poner:
  6. cpuUsage= DLLdame_cpuUsage ()
  7.  
  8.  
  9.  

277
Visual Basic para principiantes / Re: Numeros perfecto
« 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:

Código: Visual Basic
  1.  
  2. Private Sub Command1_Click()
  3.     Call NumPerfecto(10)
  4. End Sub
  5.  
  6. Public Function NumPerfecto(ByVal m As Long)
  7.    Dim k As Long, n As Double
  8.    For k = 2 To m
  9.         n = (2 ^ k) - 1
  10.         If EsPrimo(n) Then
  11.             ' entonces lo siguiente es numero perfecto
  12.             n = (2 ^ (k - 1)) * n
  13.             Print n;
  14.         End If
  15.    Next
  16. End Function
  17.  
  18. Private Function EsPrimo(ByVal n As Double) As Boolean
  19.     ' calcula o mejor comparalo con una tabla.... de primos
  20.     If n...... Then ' si n aparece en una tabla de primos entonces es primo
  21.         EsPrimo = True
  22.     End if
  23. End Function
  24.  
  25.  

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...

Código: Visual Basic
  1.  
  2. Public Function NumPerfecto2(ByVal m As Long)
  3.    Dim k As Long, n As Double, v as double
  4.    
  5.     me.autoredraw=true
  6.     me.cls
  7.    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
  8.    For k = 2 To m
  9.         v = (2 ^ k) - 1
  10.         If EsPrimo2(n) Then
  11.             ' entonces lo siguiente es numero perfecto
  12.             n = (2 ^ (k - 1)) * v
  13.             Print k, v, "=", n:
  14.         End If
  15.    Next
  16. End Function
  17.  
  18. Private Function EsPrimo2(ByVal n As Double, Optional Resetear As Boolean) As Boolean
  19.     Static k As Long ' eneavo nº consultado en la tabla
  20.    
  21.     If Resetear = True Then k = 1
  22.    
  23.     ' compara con una matriz de primos cargada al inicio
  24.     Do While tablaprimos(k) <= n
  25.         If n = tablaprimos(k) Then
  26.             EsPrimo2 = True
  27.             Exit Do
  28.         End if
  29.         k = k + 1
  30.     Loop
  31. End Function
  32.  
  33.  
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
VB .NET / Re: FORMULARIO MODAL EN VISUAL C++
« en: Jueves 7 de Mayo de 2009, 19:51 »
Me cito... por si no te enteraste la 1ª vez..
Cita de: "Nebire"
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
Visual Basic para principiantes / Re: Contar Dias del mes,año
« en: Jueves 7 de Mayo de 2009, 19:44 »
Cita de: "fraj"
weno tengo un problema  :wacko:  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...

Código: Visual Basic
  1. Private Sub Form_Load()
  2.     Dim fecha1 As Date, fecha2 As Date
  3.    
  4.     fecha1 = CVDate("29/05/09")
  5.     fecha2 = CVDate("31/12/09")
  6.     MsgBox "diferencia entre fechas: " & DateTime.DateDiff("d", fecha1, fecha2, vbMonday, vbFirstJan1)
  7. End Sub
  8.  

280
Visual Basic 6.0 e inferiores / Re: Concejo en VB6.0
« 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
VB .NET / Re: FORMULARIO MODAL EN VISUAL C++
« 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
Visual Basic 6.0 e inferiores / Re: Concejo en VB6.0
« 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
VB .NET / Re: Agregar un archivo a mi aplicacion
« en: Domingo 3 de Mayo de 2009, 08:31 »
Cita de: "javierkcjm"
creo entender que ... si es asi usa el FileCopy(pathOrigen,pathdestino)
JC
No, no es eso lo que pide.

Cita de: "Sevudo"
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.

Cita de: "Sevudo"
...y al ejecutar la aplicacion exporte el archivo en por ejemplo en "C:"
... ya le indicas al instalador donde irá cada archivo...

284
Visual Basic 6.0 e inferiores / Re: Formulario siempre visible
« 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.

Código: Visual Basic
  1.  
  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
  3.  
  4. Private Const MOSTRAR_VENTANA = 64 ' es el flag que vamos a meter... en hexadecimal es H40
  5.  
  6. ' las constantes cuando el parámetro hWndInsertAfter utiliza constantes...
  7. private enum enPosicionZ
  8.     ORDEN_NORMAL= -2
  9.     ORDEN_EN_LA_CIMA= -1
  10.     ORDEN_ENCIMA=0
  11.     ORDEN_DEBAJO=1
  12. end enum
  13.  
  14. Private Type Rectangulo
  15.     X As Long
  16.     Y As Long
  17.     Ancho As Long
  18.     Alto As Long
  19. End Type
  20.  
  21. Private p_OrdenZ As enPosicionZ
  22. Private AreaF As Rectangulo
  23.  
  24. Friend Property Get OrdenZ() As enPosicionZ
  25.     OrdenZ = p_OrdenZ
  26. End Property
  27.      Friend Property Let OrdenZ(ByVal oz As enPosicionZ)
  28.            If p_OrdenZ <> oz Then
  29.               If oz > -3 And oz < 2 Then
  30.                 p_OrdenZ = oz
  31.                 Call getRect
  32.                 Call SetWindowPos(Me.hwnd, p_OrdenZ, AreaF.X, AreaF.Y, AreaF.Ancho, AreaF.Alto, MOSTRAR_VENTANA)
  33.                 msgBox("Nuevo orden z: " & p_OrdenZ)
  34.               End If
  35.            End If
  36.      End Property
  37.  
  38. Private Sub Command1_Click()
  39.     Static n As Integer
  40.    
  41.     n = n + 1
  42.     If n = 2 Then n = -2
  43.     OrdenZ = n
  44. End Sub
  45.  
  46. ' toma la posición y medidas actuales del Formulario
  47. Private Function getRect()
  48.     AreaF.X = ScaleX(Me.Left, vbTwips, vbPixels) + 0  ' previsto para añadir alguna variable
  49.     AreaF.Y = ScaleY(Me.Top, vbTwips, vbPixels) + 0
  50.     AreaF.Ancho = ScaleX(Me.Width, vbTwips, vbPixels) + 0
  51.     AreaF.Alto = ScaleY(Me.Height, vbTwips, vbPixels) + 0
  52. End Function
  53.  
  54.  
  55.  

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
Visual Basic 6.0 e inferiores / Re: compilador de expresion posfija
« 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
Visual Basic para principiantes / Re: text con numeros
« 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...

Código: Visual Basic
  1.  
  2. Private Sub Text5_Validate(Cancel As Boolean)
  3.     Dim t As Single
  4.     ' formato moneda basado en la configuración regional del equipo
  5.    Text5.Text = Format$(Text5.Text, "Currency")
  6.    
  7.     t = Timer
  8.     Do
  9.         DoEvents
  10.     Loop While (Timer - t) < 3
  11.     ' este es equivalente al que solicitaba el usuarioal abrir el post
  12.    Text5.Text = Format$(Text5.Text, "Standard")
  13.    
  14.     t = Timer
  15.     Do
  16.         DoEvents
  17.     Loop While (Timer - t) < 3
  18.     ' con decimales... sin puntuación
  19.    Text5.Text = Format$(Text5.Text, "Fixed")
  20.    
  21.     t = Timer
  22.     Do
  23.         DoEvents
  24.     Loop While (Timer - t) < 3
  25.    ' notación científica
  26.    Text5.Text = Format$(Text5.Text, "Scientific")
  27.    
  28.     t = Timer
  29.     Do
  30.         DoEvents
  31.     Loop While (Timer - t) < 3
  32.     ' sin formato...
  33.    Text5.Text = Format$(Text5.Text, "General Number")
  34.    
  35.     t = Timer
  36.     Do
  37.         DoEvents
  38.     Loop While (Timer - t) < 3
  39.     '  si es cero devuelve false, en otro caso devuelve true
  40.    Text5.Text = Format$(Text5.Text, "True") ' false, on, off
  41.    
  42. End Sub
  43.  
  44.  

Hay más formatos predefinidos, sobretodo usando fechas... pero la idea creo que es ilustrativa...

287
Visual Basic para principiantes / Re: text con numeros
« en: Miércoles 29 de Abril de 2009, 20:48 »
Cita de: "Toph"
:P 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: :P 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))


Código: Visual Basic
  1. ' 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)
  2. Private Sub Text2_Validate(Cancel As Boolean)
  3.     Text2.Text = "H:" & Format$(Text2.Text, " ### ### ###-V")
  4. End Sub
  5.  

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...
Código: Visual Basic
  1. Private Sub Text4_Validate(Cancel As Boolean)
  2.     Text4.MaxLength = 12
  3.     Text4.Text = Format$(Text4.Text, "0## #### ###")
  4.     Text4.MaxLength = 7
  5. End Sub
  6.  

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...

Código: Visual Basic
  1. Private Sub Text4_Validate(Cancel As Boolean)
  2.     Text4.MaxLength = 12
  3.     Text4.Text = Format$(Text4.Text, "X## #### ###")
  4.     Text4.MaxLength = 7
  5. End Sub
  6.  

288
Visual Basic para principiantes / Re: text con numeros
« 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.

Código: Visual Basic
  1.  
  2. Private Sub Text1_Validate(Cancel As Boolean)
  3.     Text1.Text = Format$(Text1.Text, "##,##0.00")
  4.     If (Val(Text1.Text) < 5) Or (Val(Text1.Text) > 100) Then
  5.         Beep
  6.         Cancel = True
  7.     End If
  8. End Sub
  9.  
  10.  

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:

Código: Visual Basic
  1.  
  2.     Private Sub Form_Load()
  3.     Text1.CausesValidation = True
  4. End Sub
  5.  
  6. 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...
  7.  
  8. [code=vb]
  9.     Private Sub Text1_Validate(Cancel As Boolean)
  10.     Text1.Text = Format$(Text1.Text, "##,##0.00")
  11.     If (Val(Text1.Text) < 5) Or (Val(Text1.Text) > 100) Then
  12.         Beep
  13.         Cancel = True
  14.     Else
  15.         If Right$(Text1.Text, 2) = "00" Then
  16.             Text1.Text = Format$(Text1.Text, "##,##0")
  17.         End If
  18.     End If
  19. End Sub
  20.  
  21.  
 
[/code]

289
VB .NET / Re: controles en tiempo de ejecucion
« 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
VB .NET / Re: error: NameSpace "Mysql.Data.MysqlClient"
« 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
VB .NET / Re: Leer variable de otra clase
« 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
VB .NET / Re: cobobox
« en: Martes 28 de Abril de 2009, 09:06 »
Cita de: "alexis17"
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
Cita de: "Boxcarpilot"
...Pero no me entiendes...
El que no entiende eres tú...

Cita de: "Boxcarpilot"
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.

Cita de: "Boxcarpilot"
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
Visual Basic 6.0 e inferiores / Re: numeros positivos y negativos
« en: Viernes 24 de Abril de 2009, 04:29 »
Cita de: "fraj"
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...

Código: Visual Basic
  1.  
  2.  
  3. Private Sub Command3_Click()
  4.     Dim i As Integer, n As Integer
  5.     Dim paso As Integer
  6.        
  7.     s = 1: paso = 1
  8.     For i = 1 To HScroll1.Value Step paso
  9.         n = i * s
  10.         MsgBox CStr(n)
  11.         s = -s
  12.     Next
  13. End Sub
  14.  
  15.  

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
Visual Basic para principiantes / Re: Manejo de formularios en un MDI
« 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....
Código: Visual Basic
  1.  
  2.  
  3. Public Enum MisUsuarios
  4.     Admin = 0
  5.     Ramon = 1
  6.     Juan = 2
  7.     Maria = 3
  8.     Andres = 4
  9.     Violeta = 5
  10. End Enum
  11.  
  12. Public MivariableGlobalDeEjemplo As Integer
  13.  
  14. ' estas variables no deben ser accesibles al usuario
  15. Public salir As Boolean         ' sale un usuario, no se cierra la aplicación.
  16. Public Cerrar As Boolean
  17. Public usuario As MisUsuarios
  18.  
  19. Public Sub main()
  20.     Dim mdi As MDIForm
  21.     Form1.Caption = "Panel del administrador..."  ' allí hay un botón tal que su código es cerrar=true
  22.     Form1.Show 1  ' formulario del administrador.... el administrador arranca la aplicación, cuando ciere su
  23.     ' ventana puede entrar otro usuario ...
  24.    
  25. Siguiente:
  26.     Call ResetVariables 'aquí llamamos a un procedimiento que restablece las variables al valor deseado como inical...
  27.     usuario = (usuario Mod 5) + 1  ' garantiza que rota entre usuarios pero no regresa al admin
  28.     ' en vez de usarse un usuario tras ootro aquí debería mostrarse una ventana de login...
  29.    
  30.     Set mdi = Nothing
  31.     Set mdi = New mFrm1
  32.     mdi.Show
  33.    
  34.    
  35.     Do
  36.         DoEvents
  37.     Loop While salir = False
  38.     salir = False
  39.     If Cerrar = False Then GoTo Siguiente
  40.    
  41.     ' al llegar aquí se cierra la aplicación, definitivamente, para ello sólo el admin debería acceder a cambiar el valor de salir
  42.     '   entrando en su panel de administrador
  43.     '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.
  44. End Sub
  45.  
  46.  
  47. Public Function getNombreUsuario(ByVal numero As MisUsuarios) As String
  48.     Select Case numero
  49.         Case 0
  50.             getNombreUsuario = "Administrador "
  51.         Case 1
  52.             getNombreUsuario = "Ramón "
  53.         Case 2
  54.             getNombreUsuario = "Juan "
  55.         Case 3
  56.             getNombreUsuario = "María "
  57.         Case 4
  58.             getNombreUsuario = "Andrés "
  59.         Case 5
  60.             getNombreUsuario = "Violeta "
  61.     End Select
  62. End Function
  63.  
  64.  
  65. Public Function ResetVariables()
  66.     MivariableGlobalDeEjemplo = 25
  67.     ' ....
  68. End Function
  69.  
  70.  
  71.  


Este otro código va en el formulario MDI
Código: Visual Basic
  1.  
  2.  
  3. Public VariableDeEjemploReseteadaTrasCerrarMDI As String
  4.  
  5.  
  6. Private Sub MDIForm_Load()
  7.     Me.Show
  8.    
  9.     ' centrado a lo ancho,  arriba, 2/3 del ancho de pantalla y 2/3 del alto de pantalla
  10.     Me.Move (Screen.Width - Me.Width) / 2, 0, (Screen.Width / 3) * 2, (Screen.Height / 3) * 2
  11.     Me.Move (Screen.Width - Me.Width) / 2, 0
  12.    
  13.     Me.Caption = "El usuario: " & getNombreUsuario(usuario) & "tiene su ventana de aplicación lista..."
  14. End Sub
  15.  
  16.  
  17.  
  18. Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  19.     Unload Me
  20.     salir = True
  21. End Sub
  22.  
  23. Private Sub mnuMDI_Click(Index As Integer)
  24.     MsgBox "valor actual de la variable interna del form MDI: " & VariableDeEjemploReseteadaTrasCerrarMDI
  25.    
  26.     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)
  27. End Sub
  28.  
  29. Private Sub mnuVariables_Click(Index As Integer)
  30.     MsgBox "el valor actual de la variable 'MivariableGlobalDeEjemplo', es: " & MivariableGlobalDeEjemplo
  31.     Select Case Index
  32.         Case 0
  33.             MivariableGlobalDeEjemplo = 20
  34.         Case 1
  35.             MivariableGlobalDeEjemplo = 30
  36.         Case 2
  37.             MivariableGlobalDeEjemplo = 99
  38.     End Select
  39.     MsgBox "El valor de 'MivariableGlobalDeEjemplo', que se resetea tras cada reinicio del MDI ha cambiado al valor: " & MivariableGlobalDeEjemplo
  40. End Sub
  41.  
  42.  

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
Inteligencia Artificial / Re: Paradoja ia (redes neuronales) delphi<-> ia
« en: Martes 21 de Abril de 2009, 15:41 »
Cita de: "daniloski"
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'.

Cita de: "daniloski"
   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'.

Cita de: "daniloski"
  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.

Cita de: "daniloski"
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) .

Cita de: "daniloski"
...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
Visual Basic 6.0 e inferiores / Re: Metodo Biseccion
« en: Sábado 18 de Abril de 2009, 20:12 »
Cita de: "alemarva"
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
Visual Basic para principiantes / Re: ejemplos de while
« en: Sábado 18 de Abril de 2009, 20:04 »
Cita de: "rogerfor"
 ...he buscado y no he hayado nada...
Esto sólo es posible si no sabes buscar...
Cita de: "rogerfor"
...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:

Código: Text
  1. mientras no se cumpla la condición x    ' while dia <> "Lunes"  : call PasearPerro("Calle VB Nº6.0", "Tobi")  ..... wend
  2.    ... hacer lo que haya dentro del bucle
  3. retorno de mientras
  4.  
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.
Código: Visual Basic
  1.     Inicio= timer
  2.     Me. Backcolor= vbBlack: Me.forecolor= vbWhite
  3.     command1.enabled=false
  4.     Do
  5.         doevents
  6.         Ahora= timer
  7.         Me.cls: Me.CurentX= 200: me.currenty=200
  8.         Me.Print cstr( Ahora - inicio) & " segundos..."
  9.     loop while ahora - inicio < 3600
  10.     command1.enabled= true
  11.  
  12.  
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:
 

Código: Visual Basic
  1.     Inicio= timer
  2.     Me. Backcolor= vbBlack: Me.forecolor= vbWhite
  3.     command1.enabled=false
  4.     Do
  5.         doevents
  6.         Ahora= timer
  7.         Me.cls: Me.CurentX= 200: me.currenty=200
  8.         Me.Print cstr( Ahora - inicio) & " segundos..."
  9.     loop until ahora - inicio >= 3600
  10.     command1.enabled= true
  11.  
  12.  
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
Diseño de Algoritmos / Re: HELP DFD
« en: Miércoles 15 de Abril de 2009, 01:15 »
Cita de: "advancedd"
•   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
Visual Basic 6.0 e inferiores / Re: compilador de expresion posfija
« 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...
Código: Visual Basic
  1.  
  2.  
  3. Public Enum enTipoPila
  4.     PILATIPO_FILO = 1            ' primero en entrar último en salir
  5.     PILATIPO_FIFO = 2            ' primero en entrar primero en salir.
  6.     PILATIPO_AMBOS = 3           ' se decide de qué extremo queremos sacar indistintamente
  7. End Enum
  8.  
  9. Public Enum enExtremo
  10.     EXTREMO_INICIAL = 0
  11.     EXTREMO_FINAL = 1
  12. End Enum
  13.  
  14.  
  15. ' =========== CAMPOS DE LAS PROPIEDADES ================
  16.  
  17. Private p_Pila As New Collection
  18. Private p_TipoPila As enTipoPila
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26. ' =========== PROPIEDADES DE LA CLASE ==================
  27.  
  28. Public Property Get TipoPila() As enTipoPila
  29.     TipoPila = p_TipoPila
  30. End Property
  31.     Public Property Let TipoPila(ByVal tp As enTipoPila)
  32.         p_TipoPila = tp
  33.     End Property
  34.  
  35. Public Property Get Count() As Long
  36.     Count = p_Pila.Count
  37. End Property
  38.  
  39.  
  40.  
  41.  
  42.  
  43. '============= MÉTODOS públicos DE LA PILA =============
  44.  
  45. ' la pila siempre añade al final
  46. Public Sub Push(ByRef Elemento As Variant)
  47.     p_Pila.Add (Elemento)
  48. End Sub
  49.  
  50. ' en 'nuestra' pila podremos quitar del inio, del final o de ambos...
  51. '  es una pila 'especial'...
  52.  
  53. ' extremos sólo es necesario para el caso de la pila de extraer de 'ambas partes indistintamente
  54. Public Function Pop(Optional Extremo As enExtremo = EXTREMO_INICIAL) As Variant
  55.     If p_Pila.Count > 0 Then  ' sólo si la pila tiene elementos devolvemos...
  56.         Select Case p_TipoPila
  57.             Case enTipoPila.PILATIPO_FILO
  58.                 Pop = PopFilo
  59.             Case enTipoPila.PILATIPO_FIFO
  60.                 Pop = PopFifo
  61.             Case enTipoPila.PILATIPO_AMBOS
  62.                 'If IsMissing(Extremo) Then Extremo = EXTREMO_INICIAL '
  63.                 If Extremo = EXTREMO_FINAL Then
  64.                     Pop = PopFilo
  65.                 Else  ' toma del principio.
  66.                     Pop = PopFifo
  67.                 End If
  68.         End Select
  69.     Else   ' quitar elementos de una colección vacía origina un error,ocasionalmente podría sustituirse por on local error resume next..
  70.         ' no devuelve elementos
  71.         Pop = "No elementos"
  72.     End If
  73. End Function
  74.  
  75.  
  76.  
  77.  
  78.  
  79. '============= MÉTODOS privados DE LA PILA =============
  80.  
  81. ' pop siempre devuelve un elemento y luego lo elimina, en este caso del final
  82. Private Function PopFilo() As Variant
  83.     PopFilo = p_Pila.Item(p_Pila.Count)
  84.         p_Pila.Remove (p_Pila.Count)
  85. End Function
  86.  
  87. ' pop siempre devuelve un elemento y luego lo elimina, en este caso del inicio.
  88. Private Function PopFifo() As Variant
  89.     PopFifo = p_Pila.Item(1)  ' las colecciones se basan en índice 1
  90.         p_Pila.Remove (1)
  91. End Function
  92.  
  93.  
  94.  
  95.  
  96.  
  97. '============== MÉTODOS DE LA CLASE ==================
  98.  
  99. Private Sub Class_Initialize()
  100.     p_TipoPila = PILATIPO_FILO ' puesto que los valores van del 1 al 3, 0 no se admite.
  101. End Sub
  102.  
  103. Private Sub Class_Terminate()
  104.     Set p_Pila = Nothing
  105. End Sub
  106.  
  107.  

... 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