• Martes 13 de Mayo de 2025, 20:34

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 ... 14 15 [16] 17 18 ... 29
376
Visual Basic 6.0 e inferiores / Re: Error en Imagen en un boton
« en: Viernes 16 de Enero de 2009, 02:12 »
Cita de: "gihv85"
Hola oye yo tengo ese problema pero me dice ke no
me marca error de loadlibrary
 por ke??

No entiendo tu pregunta/problema, puedes explicarte con más detalle ?.

377
VB .NET / Re: problema con decimales
« en: Viernes 16 de Enero de 2009, 00:01 »
Me parece muy bien que busques una solución alternativa.

Sin embargo al caso presente le pongo 2 'peros'.

El primero es que siempre que haya que tratar un número como caracteres (tal como haces convirtiéndolo en una batriz de chars), implica una pérdida importante de eficiencia. Esto por sí sólo, es razón suficiente para descartar un algoritmo basado en esa manera, salvo que no exista un modo alternativo realmente eficaz. En el caso presente no está justificado, las funciones que te he expuesto son muy sencillas y simples. Podrías perfectamente remplazar la parte del bloque if ---then  por el bloque select case, perfectamente, para casos más o menos complejos y eso sería todo. Hablando claramente formatear un número a través de caracteres es una cagada, en el 99% de los casos.

El segundo 'pero' es que los bloques try .. catch aunque son muy útiles, hay que saber cuando usarlos. Rresulta una estupidez esperar un error donde no debe haberlo, entonces algo como
Código: Visual Basic
  1.  
  2. dim r,s,t as string
  3.     s="Ho" : t= "la"
  4.     try
  5.         r = s & t
  6.         messagebox.show r
  7.     catch ex as exception
  8.         messagebox.show ex.exception
  9.     finally
  10.         messagebox.show " Mundo."
  11.     end try
  12.  
  13.  
.... es una solemne estupidez... Hay que utilizar bloques try..catch , pero sólo cuando pueda generarse un error que no podamos controlar, porque las funciones llamadas o los parámetros utilizados queden fuera de nuestro control. Te puedo dar una regla sobre cuando usar bloques try..catch; es como usar un guardaespaldas, pregúntate: cuando se usa un guardaespaldas ?... cuando existe una amenaza, si no la hay, sobra el guardaespealdas, lo mismo se aplica para el try ...catch. Para ir desde la cama al baño, no necesitas un guardaespaldas, no hay amenaza.

Por último un pero menor... es el nombre de la función... getRedondeo ... No sería más sencillo llamarlo Redondear ?, getLoquesea lo que indica es que se obtiene lo que sea, dicho de otro modo, get es tomar algo 'ya almacenado' y si fuera el caso previamente calculado. Cuando algo no está almacenado, sino que debe hacerse, debe calcularse, porque es una acción, es una acción entonces en estos casos es mejor usar un verbo, así si prefieres usar terminología inglesa podrías usar 'DoRound', 'Do' hacer... o 'CalculateRound'. Si tienes que coget una cerveza de la nevera usa GetCerveza(nevera), pero si la cerveza debe elaborarse entonces usa DoCerveza(1 litro, 5kg cebaza, 200gr malta,....).. No es lo mismo ir a una pastelería y pedir una tarta GetTarta (tomar tarta), que ir a pedir el encargo de una tarta (una tarta con unas especificaciones que implica que deba reunirse los ingredientes y hacerla), en este caso lo llamaríamos DoTarta (hacer la tarta y romarla).

Son sólo indicaciones, seguirlas o no ya es cosa tuya.

378
Diseño de Algoritmos / Re: Problema: algoritmo con miles de comparaciones...
« en: Sábado 10 de Enero de 2009, 16:22 »
Cita de: "eolith"
una tabla de 6 columnas y 30.000 filas,
todos los elementos son enteros del 1 al 50,
cada fila están ordenados ascendentemente, y no puede haber ninguno repetido.

quiero saber el número de elementos coincidentes que hay entre cualquier pareja de filas...
dificultad viene a la hora de buscar una solución lo más rápida posible ya que comparar 30.000 filas con todas las demás son unos 450 millones de comparaciones solo a nivel de fila con fila...
Más luego las comparaciones de los números dentro de cada pareja de filas....


Particularmente este tipo de problemas tratándose de números enteros tiene una fácil solución, más cuando se conoce el número mayor de la serie y especialmente si es lo más pequeño posible, en tu caso concurren las 3 situaciones. La solución no lleva más de una décima de segundo para las 30.000 filas, he utuilizado algoritmos similares para varios cientos de millones y llevaba aproximadamente unos 20 minutos, creo recordar que la última vez utilicé uno de unos 10 millones y tardó unos 35 segundos (en mi equipo de casa que va a 1500Mhz.).

No obstante para ponerte un ejemplo de código debo entender exactamente que tratas de decir con: 'número de elementos coincidentes que hay entre cualquier pareja de filas', ya que es obvio que no está claramente especificado que pretendes hacer, hay un puñado de cosas diferentes y parecidas entre sí que se 'acoplan' a ese concepto de forma generalizada. Esto es:
1  tu quieres recorrer todas las filas y desechar primero todas las repetidas (que haya una única copia de cada una de ellas si/no).
2 recorrer todas las filas y encontrar todas las coincidencias de al menos 1 elemento (columna) con respecto a  1 fila concreta si/no.
3 Ordenar todas las filas en orden ascendente/descendente si/no.
4 Cuando varía un elemento     se considera una variación sólo si está en la misma posición, o en cualquier posición si/no, ...
5 ,6 , 7 etc...

Responde a esto y te expongo un par de ejemplos que resuelven lo 1º y lo 3º a la vez en sólo 1 recorrido y lo 2º y/o lo 4º en otro recorrido. Si tienes 30.000 filas un recorrido es un bucle de 30.000 filas.

379
Visual Basic 6.0 e inferiores / Re: como puedo cerrar con X
« en: Viernes 9 de Enero de 2009, 15:36 »
Cita de: "master33"
la aplicacion funciona con un menu el cual selecciono la opcion y despliego el form y despues tengo que volver al menu lo cual lo hago con CMD pero no puedo(nose como hacer eso) volver al menu cuando presionan la X "cerrar" del form

Esta pregunta estaría mejor en la sección de 'principiante',seas o no principiante, la pregunta si lo es.

Para cerrar un formulario y volver al anterior debes haberlo abierto con form2.showdialog en vez de con form2.show . Entonces cuando cierres el form2 de la forma que sea se cerrará sólo este (si no lo impides en su evento queryunload) y regresarás al form1. Entonces tal como te indicaba f_Tanori, igual dará cerrarlo desde el botón de control en la interfaz; 'cerrar' o desde código; con unload Me .

Importante: Si tienes un código como este:

código dentro de un botón
Código: Visual Basic
  1.  
  2. dim k as integer, b as integer
  3.     for k= 0 to 30
  4.       b=b +1
  5.    next
  6.    form2.show
  7.   for k= 0 to 30
  8.       b=b +1
  9.    next
  10.  
  11.  

después de  form2.show inmediatamente se ejecuta el resto de líneas que hay en el 2º bucle.

pero si el código fuera éste:
Código: Visual Basic
  1.  
  2. dim k as integer, b as integer
  3.     for k= 0 to 30
  4.       b=b +1
  5.    next
  6.    form2.showdialog
  7.   for k= 0 to 30
  8.       b=b +1
  9.    next
  10.  
  11.  

Entonces cuando se ejecuta la línea form2.showdialog la ejecución se queda en esa línea. cuando se cierre el formulario 2 entonces se continúa en la 1ª línea del 2º bucle.

Esto debes tenerlo en cuenta para evitar supuestos 'problemas' inadvertidos...

380
VB .NET / Re: problema con decimales
« en: Martes 30 de Diciembre de 2008, 11:30 »
Hay que crear unas pequeñas funciones que nos den el formato que necesitemos, te pongo un ejemplo con 3 funciones (sobrecargadas) que soluciona estos problemas... y de ,los que puedes deducir el camino a seguir para ajustarlo a otras ideas.

En esta primera función, se pasa el valor que se desea formatear y se pasa el límite que fija redondearse arriba o abajo. en el código del 'botón 1'  se muestra ejemplos y el resultado de llamadas con distintos valores.
Código: Visual Basic
  1.  
  2. ' fijado un limite lo que supera esos decimales devuelve el siguiente entero
  3.     ' si no supera el límite devuelve el entero
  4.     Public Function Redondear(ByVal cifra As Double, ByVal Limite As Double)
  5.         Dim resto As Single = cifra Mod 1
  6.  
  7.         If resto <= Limite Then
  8.            Return Math.Floor(cifra)
  9.         Else
  10.             Return Math.Ceiling(cifra)
  11.         End If
  12.     End Function
  13.  
  14. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  15.         ' usando 1 limite:
  16.         MsgBox(Redondear(234.54, 0.4)) ' devuelve 235
  17.         MsgBox(Redondear(234.54, 0.6)) ' devuelve 234
  18.         MsgBox(Redondear(234.54, 0.54)) ' devuelve 234
  19.         MsgBox(Redondear(234.99, 0.98)) ' devuelve 235
  20. End Sub
  21.  
  22.  

En la siguiente función, que es una sobrecarga de la anterior se pasan 2 límites, uno inferior y otro superior si el límite superior es un punto superior al limite inferior se comporta como la función anterior también sucede este comportamiento si el límite superior es igual o menor que el limite inferior, pero si el límite superior dista del limite inferior se devuelve el valor que se introdujo sin formatear...

El 'botón 2' prueba el uso de esta función con algunos ejemplos.
Código: Visual Basic
  1.  
  2. ' ahora se usan 2 límites, si es menor o igual al limite inferior devuelve el entero anterior,
  3.     '   si es mayor o igual que el limite superior devuelve el entero superior
  4.     '   si está entre ambos límites devuelve el valor entrado.
  5.     Public Function Redondear(ByVal cifra As Double, ByVal LimiteInf As Double, ByVal LimiteSup As Double)
  6.         Dim resto As Single = cifra Mod 1
  7.  
  8.         If resto <= LimiteInf Then
  9.             Return Math.Floor(cifra)
  10.         ElseIf resto >= LimiteSup Then
  11.             Return Math.Ceiling(cifra)
  12.         Else
  13.             Return cifra
  14.         End If
  15.     End Function
  16.  
  17. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  18.     ' usando 2 limites: superior e inferior
  19.         MsgBox(Redondear(234.54, 0.4, 0.6)) ' devuelve 234.54
  20.         MsgBox(Redondear(234.54, 0.5, 0.51)) ' devuelve 235
  21.         MsgBox(Redondear(234.34, 0.5, 0.51)) ' devuelve 234
  22.         MsgBox(Redondear(234.34, 0.25, 0.26)) ' devuelve 235
  23.         MsgBox(Redondear(234.54, 0.5, 0.2)) ' devuelve 235 si limite superior es menor que limite inferior este caso es equivalente a usar 1 sólo límite.
  24. end sub
  25.  
  26.  

En la 3ª función que es sobrecarga de las anteriores se muestra justo el caso que indicas. Esto es usamos 3 límites. Si la parte decimal es igual o menor que el limite inferior se redondea al entero menor más próximo, si la parte decimal es igual o superior al límite superior edondea al entero mayor más próximo y si no es ningúno de los casos anteriores se devuelve la parte entera + el límite medio fijado.

Nota que el límite medio no realiza comprobaciones de si está en un rango dado, esto sólo sería necesario si quisiéramos indicar 4 límites. Lo que hace es que si no es ninguno de los 2 casos anteriores. En tu pregunta los valores para estos límites deberían ser:  redondear( valor, 0.25,0.75,0.5  )
El 'botón 3' muestra unos ejemplos del uso de esta función y el resultado a cada caso.
Código: Visual Basic
  1.  
  2. ' como en el caso anterior, pero ahora cuando no está en márgenes inferior o superior devuelve el punto medio indicado...
  3.     Public Function Redondear(ByVal cifra As Double, ByVal LimiteInf As Double, ByVal LimiteSup As Double, ByVal LimiteMed As Double)
  4.         Dim resto As Single = cifra Mod 1
  5.        
  6.         If resto <= LimiteInf Then
  7.             Return Math.Floor(cifra)
  8.         ElseIf resto >= LimiteSup Then
  9.             Return Math.Ceiling(cifra)
  10.         Else
  11.             Return Math.Floor(cifra) + LimiteMed
  12.         End If
  13.     End Function
  14.  
  15.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  16.        ' usando los 3 límites: supeior inferior y medio
  17.         MsgBox(Redondear(234.54, 0.4, 0.6, 0.5)) ' devuelve 234.5
  18.         MsgBox(Redondear(234.62, 0.5, 0.6, 0.5)) ' devuelve 235
  19.         MsgBox(Redondear(234.50, 0.5, 0.6, 0.3)) ' devuelve 234  pero un valor de de 234.51 devolvería 234.3
  20.         MsgBox(Redondear(234.34, 0.25, 0.6, 0.3)) ' devuelve 234.3
  21.     End Sub
  22.  
  23.  

Math.Ceiling, Math.Floor y math.Round son funciones de redondeo, la 1ª devuelve el entero siguiente al actual, el 2ª ídem pero aplicando el inferior, el 3ª devuelve el entero más próximo, hemos usado floor y ceiling para contruir nuestro propio formato de redondeo. La traducción literal de ceiling y floor es techo y suelo, para que no parezca algo 'raro' o misterioso...

Si tienes que hacer bastantes más cosas al respecto podría interesarte realizar una pequeña clase de matematicas donde vas reuniendo este tipo de funciones.

Además las funciones no son fijas en el sentido de que en cada llamada podemos fijar unos límites distintos. si creas una clase podrías especificar unas propiedades con dichos límites (que podrían definirse con el constructor de la instancia) y así no pasar en cada llamada a la función estos valores sino que los recogería internamente... eso queda como ejercicio para tí.

Cualquier duda que tengas pregunta...

381
VB .NET / Re: Guardar imagen con SaveFileDialog
« en: Domingo 28 de Diciembre de 2008, 21:49 »
No estoy seguro de haberte entendido.
Lo que leo y me parece entender luego en la siguiente línea me parece otra cosa.

Dices que quieres hacer transparente al usuario el salvar la imagen. Si esto es todo y entendí correctamente lo que quieres es que el usuario no indique la ruta y el nombre para el fichero, lo que tienes que hacer es usar una ruta, nombre y extensión por defecto.

A falta de indicaciones precisas, te propongo un código que usa o no el savefiledialog a gusto... lo hago modificando el código que expones...

al final te comento por encima el código... cualquier duda pregunta.
Código: Visual Basic
  1.  
  2. Public Class Form1
  3.     Private WithEvents saveFileDialog1 As SaveFileDialog
  4.     Private cancelado As Boolean
  5.     Private nombreImg As String = "Imagen"
  6.  
  7.     Private Function salvarImagen() As Boolean
  8.         Static ruta As String = "C:Transitofotos"
  9.         Static extension As String = ".jpg"
  10.         Static n As Integer = -1
  11.  
  12.         Dim formatoImg As System.Drawing.Imaging.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
  13.         Dim existe As Boolean = False
  14.         Dim RutaAbsoluta As String = ""
  15.  
  16.         If Me.PictureBox1.Image IsNot Nothing Then
  17.             If checkboxUsarFiledialog.Checked = True Then  ' si el usuario desea seleccionar destino sobre la imagen...
  18.                 ' asignamos valores actuales al savefiledialog
  19.                 saveFileDialog1 = New SaveFileDialog
  20.                 saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif|Imagen PNG|*.png|Imagen TIFF|*.tiff"
  21.                 saveFileDialog1.DefaultExt = extension
  22.                 saveFileDialog1.Title = "Guarda como imagen JPG o BMP"
  23.                 If ruta = "" Then
  24.                     saveFileDialog1.InitialDirectory = "C:Transitofotos"
  25.                 Else
  26.                     saveFileDialog1.InitialDirectory = ruta ' usamos la ruta usada por última vez,  es lo más probable.
  27.                 End If
  28.                 ' mostramos el objeto al usuario para que realice los cambios
  29.                 saveFileDialog1.ShowDialog()
  30.  
  31.                 ' si no canceló ni dejó vacío el nombre del fichero se continúa
  32.                 If cancelado = False Then
  33.                     If saveFileDialog1.FileName <> "" Then
  34.                         ruta = IO.Path.GetDirectoryName(saveFileDialog1.FileName)
  35.                         nombreImg = IO.Path.GetFileName(saveFileDialog1.FileName)
  36.                         Dim s() As String = Split(saveFileDialog1.Filter, "*")
  37.                         s = Split(s(saveFileDialog1.FilterIndex), "|")
  38.                         extension = s(0)
  39.                         RutaAbsoluta = saveFileDialog1.FileName
  40.                     Else
  41.                         MsgBox("Se ha abortado el proceso. Se requiere especificar ruta y nombre para el archivo...")
  42.                         Exit Function ' proceso abortado
  43.                     End If
  44.                 Else
  45.                     Exit Function ' el usuario ha abortado la operación...
  46.                 End If
  47.             Else      ' cuando el usuario 'pasa' de seleccionar destino, se hace automáticamente.
  48.                 If ruta = "" Then ruta = "C:Transitofotos"
  49.                 If nombreImg = "" Then nombreImg = "Imagen"
  50.                 RutaAbsoluta = ruta & "" & nombreImg & "_" ' no importa si hay dos \ seguidas si no hay caracteres en medio se trata como una sola.
  51.  
  52.                 If checkboxAutonumerado.Checked = True Then ' si se eligió autonumerar el nombre del archivo...
  53.                     Do     ' genera un autonumerado para la imagen
  54.                         n += 1
  55.                         existe = ExisteFichero(ruta & "" & nombreImg & n.ToString & extension)
  56.                     Loop While existe = True
  57.                     RutaAbsoluta &= n.ToString & extension
  58.                 Else   ' si se eligió añadir fecha y hora al nombre del archivo
  59.                     RutaAbsoluta &= Replace(Date.Now.ToShortTimeString, ":", "_") & extension   ' no se admiten los : como parte de nombre de archivos (pero necesario para la unidad).
  60.                 End If
  61.             End If
  62.  
  63.             If IO.Directory.Exists(ruta) = False Then
  64.                 IO.Directory.CreateDirectory(ruta)
  65.             End If
  66.            
  67.             ' tomamos el formato
  68.             Select Case extension
  69.                 Case ".jpg"
  70.                     formatoImg = System.Drawing.Imaging.ImageFormat.Jpeg
  71.                 Case ".bmp"
  72.                     formatoImg = System.Drawing.Imaging.ImageFormat.Bmp
  73.                 Case ".gif"
  74.                     formatoImg = System.Drawing.Imaging.ImageFormat.Gif
  75.                 Case ".png"
  76.                     formatoImg = System.Drawing.Imaging.ImageFormat.Png
  77.                 Case ".tiff"
  78.                     formatoImg = System.Drawing.Imaging.ImageFormat.Tiff
  79.                 Case Else
  80.                     ' si no es ninguno de los anteriores automáticamente será jpg
  81.             End Select
  82.  
  83.             ' finalmente guardamos el archivo
  84.             Try
  85.                 Me.PictureBox1.Image.Save(RutaAbsoluta, formatoImg)
  86.                 Return True ' si todo fue ok devolvemos true
  87.             Catch ex As System.Exception
  88.                 MessageBox.Show(ex.Message)
  89.             End Try
  90.         End If
  91.     End Function
  92.  
  93.     Private Function ExisteFichero(ByVal rutaFichero As String) As Boolean
  94.         Return IO.File.Exists(rutaFichero)
  95.     End Function
  96.  
  97.     Private Sub saveFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles saveFileDialog1.FileOk
  98.         cancelado = e.Cancel
  99.     End Sub
  100.  
  101.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  102.         MsgBox("El intento de guardar la imagen " & IIf(salvarImagen() = True, "tuvo éxito.", "fracasó."))
  103.     End Sub
  104.  
  105.     Private Sub txt_codigo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_codigo.TextChanged
  106.         nombreImg = txt_codigo.Text
  107.     End Sub
  108. End Class
  109.  
  110.  

En el formulario hay 1 botón que llama a la función de guardar. Hay 2 checkbox 1 permite especificar si queremos guardar la imagen a través del savefiledialog o no, el otro determina si para guardar el nombre de la imagen usamos un método autonumerado o lo basamos en la hora actual. Hay un textbox para indicar si quremos un nombre 'base' para el nombre de la imagen, luego se le aplica el autonumerado ó la hora si no elegimos usar el savefiledialog y naturalmente un picturebox.

El savefiledialog se designa con eventos para determinar si el usuario canceló la operación en cuyo caso se aborta el proceso.

Se han añadido 2 formatos más (PNG y TIFF) que también suelen ser útiles.

Se ha incluído una comprobación de carpeta para saber si existe y en caso de que no, se crea la ruta, sino daría error,

A partir de aquí puedes hacer las modificaciones que te parezcan convenientes.
Cualquier aclaración que precises pregunta.

382
Visual Basic para principiantes / Re: Que metodo usar
« en: Lunes 1 de Diciembre de 2008, 23:33 »
Cita de: "F_Tanori"
:no:

Constantemente convierten hilos de VB en offtopic ! y se generan discusiones tipo chat, las cuales no deberian de permitirse ya que desvirtuan el hilo, y lo deforman con mensajes sin razon y en ocaciones rayando en lo estupido , el sitio cuenta con una seccion para hablar de lo que sea se llama Taberna del Bit y tambien creo recordar que hay una area de chat.

En lo personal se me hace bastante molesto leer mensajes que NO SIRVEN PARA NADA , en los subforos especificos para un tema DE PROGRAMACION, generando BASURA que despues indexan los buscadores , que restan reputacion  y seriedad a este sitio , ya me ha tocado llegar a solocodigo a traves de google por temas que no son propios del contexto de este foro.

Valoremos el contenido de nuestras respuestas para cuidar, la informacion que tenemos y la comunidad a la que pertenecemos y no llenemos de basura solo por responder.

 :hitcomp:
Saludos
Totalmente de acuerdo.

Recuerdo a quien lo haya olvidado que también existen los mensajes privados para cuchichear de modo ajeno al tema del foro y para esos intercambios de tipo rifi-rafe.

383
Visual Basic 6.0 e inferiores / Re: Error usando IsEmpty()
« en: Lunes 1 de Diciembre de 2008, 23:21 »
... a ver Moxkito... la expresión If Not IsEmpty(Pasarela61850.Nodos61850) Then visto el código siempre devolverá 'not false' (not porque le preguntas not empty).

IsEmpty tiene 'utilidad práctica' cuando se usa con los variants, para otros casos no es muy útil... te pongo 1 sencillo ejemplo

supongamos un formulario:
Código: Visual Basic
  1.  
  2. Dim t() As Integer
  3. Private Sub Form_Load()
  4.     If IsEmpty(t) = True Then
  5.         MsgBox "t NO ha sido inicializada"
  6.     else
  7.        ' entrará aquí
  8.        MsxBox  "t SI ha sido inicializada"
  9.     End If
  10. End Sub
  11.  
  12.  

Ahora supon el código casi idéntico, pero nota que la línea de declaración de la matriz 't' está comentada:
Código: Visual Basic
  1.  
  2. ' Dim t() As Integer
  3. Private Sub Form_Load()
  4.     If IsEmpty(t) = True Then
  5.         ' entrará aquí
  6.         MsgBox "t NO ha sido inicializada"
  7.     else
  8.         MsxBox  "t SI ha sido inicializada"
  9.     End If
  10. End Sub
  11.  
  12.  

Como en tu código declaras tanto 'pasarela' (as ...) entonces nunca te dará true (dentro del propio módulo, fuera sólo si es privada), porque está inicializada... ( en el caso de  la matriz 'nodo61850'  si no fuera declarado daría un error diciendo que no es un miembro de tPasarela61850 y se inicializa tan pronto como haces una declaración de una variable que es del tipo al que pertenece)
Quizás lo que quieras preguntarle es si tiene asignación de datos válidos... para eso usa isnull() ó quizás más adecuadamente quieras preguntarle si el array está inicializado,  para eso acuérdate de aquella conversación que mantuvimos acerca de saber si un array estaba o no inicializado, repásalo...

Cita de: "m0skit0"
Lo que no termino de entender es lo de "los tipos definidos por el usuario de módulos de objeto públicos".

Siempre he pensado que es 'lioso' como para que no se entienda adecuadamente.... trataré de explicarlo.
Los UDT (User Defined Types) cuando se usan en un formulario tienen forzosamente que ser declarados privados, al igual que las API declaradas dentro del formulario, la razón se apoya en la forma que VB6.0 'divide' el código público y privado, se detalla más abajo (dim equivale a escribir Private en vb6.0)

Por ejemplo al intentar ejecutar el siguiente código:
Código: Visual Basic
  1.  
  2. Public Type tiempo   ' aquí dará error estando dentro del formulario, o lo ponemos privado o lo movelos a un módulo.
  3.        dias As Integer
  4.        semanas As Integer
  5.        meses As Byte
  6.        bisiesto As Boolean
  7.        'mes As NombreMeses
  8. End Type
  9. Dim t As tiempo
  10. Private Sub Form_Load()
  11.      t.bisiesto = True
  12.      t.dias = 365
  13.      t.meses = 12
  14. End Sub
  15.  
  16.  

... dará error porque si declaramos la estructura (UDT, TDU en español) Tiempo en el (dentro del) formulario tendremos que cambiarlo a privado para poderlo usarlo, y además por ser privado sólo podremos usarlo dentro del formulario. Si queremos que pueda ser usado fuera del formulario entonces lo podremos declarar público pero entonces deberemos moverlo a un módulo.

Esto sucede así porque la forma que tiene visualbasic de definir código público disponible en el proyecto es a través del módulo. Lo que confunde es que esto sólo se refiere a constantes, Tipos definidos por el usuario (estructuras, TDU), matrices y declaraciones (de DLLs).   Un módulo puede también tener código privado. Pero un  formulario que tenga algo de lo marcado en otro color anteriormente sólo puede contenerlo si se declara privado. Nota que en cambio las funciones y  rutinas (SUBs) si pueden ser públicas o privadas en el formulario.

Saludos...

384
VB .NET / Re: Graficas en VB 2005 sin usar evento PAINT
« en: Domingo 23 de Noviembre de 2008, 00:20 »
Es cierto, a todo lem undo se le hace extraño...
Te respondo brevemente:

Si en vb6.0 querías hacer una línea dentro de un picture hacía como indicas picture1.line(xo,yo)-(xf,yf),color . Al hacer esto fíjate que el grueso de línea y algunas otras opciones gráficas quedaban definidas por el contenedor donde se dibujaba es decir picture1.DrawWidth  implicaba el ancho de los métodos gráficos referidos al picture1.

Ahora en VB2005-2008...  se ha querido separar e independizar, te pongo un ejemplo que será más significativo y te comento dentro del mismo:

Código: Visual Basic
  1.  
  2. Dim p = New Pen(Color.Red, 2) ' Creo una 'brocha' del color y ancho indicados
  3.  
  4. ' suele ser útil si vamos a emplear mucho gráfico importar la clase
  5. Imports System.Drawing.Graphics
  6.  
  7. ' cuando queremos utilizar un gráfico a nivel de formulario suele ser útil describir una variable para usar los gráficos
  8. Dim g As Graphics
  9.  
  10. ' para usarlo en un momento dado, por ejemplo en un picturebox
  11. g = PictureBox1.CreateGraphics  ' esto indica que g vamos a usarlo dentro del picturebox1
  12.  
  13. ' finalmente de ejemplo una línea:
  14. g.DrawLine(p, xo, yo, xf, yf)  ' el pen que indicamos, y las cordenadas todas juntitas...
  15.  
  16.  
  17.  

Supongo que ya te atreverás a graficar sin problemas...

El código lo puedes ejecutar desde un botón o si prefieres desde un timer (como indicas), eso ya al gusto de cada uno.

385
Visual Basic 6.0 e inferiores / Re: Controlar El Joystick Desde Visual Basic
« en: Jueves 20 de Noviembre de 2008, 08:35 »
Cita de: "DrakerDG"
:comp: Encontré información interesante sobre el uso de funciones del API para el control del Joystick
por ejemplo de aquí: http://foros.solocodigo.com/viewtopic.php?f=53&t=37460

Tienes también estas otras APIs de las que disponer:
Las de Treshold es para especificar una especie de salto, algo así como si mi salto lo establezco en 10 sólo me comunicará que ha sido movido cuando alcance el valor 10 ó  -10,  Es controlar los eventos de movimiento por movimiento en vez de enviarnos un evento cada cierto lapso de tiempo y comprobar nosotros si el movimiento es tan minúsculo no interpretarlo como movimiento y desencadenar todos los eventos asociados a un movimiento quizás debido al pulso del usuario... así este salto sería la unidad mínima que nos informará cuando ocurra, también es útil si queremos que dentro de un área existan sólo determinado número de movimientos. imagina una cuadrícula de 1008 x 1008 píxels, si nosotros solo concebimos aceptable que existen 8 x 8 cuadrículas (por ejemplo si nuestro tablero fuera para un ajedrez) entonces sólo nos interesaría computar como movimiento cuando se haya movido  la mitad  de una casilla es decir (1008/ (8 * 2))=63, sólo nos comunicará movimiento cuando se haya movido 63 píxeles, lo cual nos asegura que ha cambiado a otra casilla en nuestro tablero 8x8.
Private Declare Function joyGetThreshold Lib "winmm.dll" Alias "joyGetThreshold" (ByVal id As Long, lpuThreshold As Long) As Long
Private Declare Function joySetThreshold Lib "winmm.dll" Alias "joySetThreshold" (ByVal id As Long, ByVal uThreshold As Long) As Long


Las de Capture es para 'enganchar' un determinado joystick a tu programa,  vamos fijar el que vas a usar de los disponibles en tu sistema.
Private Declare Function joyReleaseCapture Lib "winmm.dll" Alias "joyReleaseCapture" (ByVal id As Long) As Long
Private Declare Function joySetCapture Lib "winmm.dll" Alias "joySetCapture" (ByVal hwnd As Long, ByVal uID As Long, ByVal uPeriod As Long, ByVal bChanged As Long) As Long


No he mirado tu código, pero lo he descargado, cuando tenga un tiempito le hecho un vistazo.
Saludos y suerte.

386
La taberna del BIT / Re: Chavez o Uribe
« en: Miércoles 19 de Noviembre de 2008, 09:37 »
Cita de: "m0skit0"
Cita de: "Nebire"
En política y religión, rara vez los argumentos satisfacen a alguien al punto de que cambie de opinión.
Habla por ti...
Esto que dices es una tontería típica de no saber que responder. Si alguien te pregunta que tienpo hace ahí ... tu no contestas en mi casa hace esto, sino que dices AQUÍ hace esto, y al decir aquí te refieres a la población donde resides. De igual forma resulta tonto decir eso de habla por tí... lo que he dicho anteriormente es algo que cualquiera habrá comprobado día sí y día también a lo largo de su vida.... por tanto generalizar es lo más correcto además tu respuesta es aún más estúpida cuanto que yo no he afirmado 'nadie ... cambia' sino que he admitido las excepciones posibles al decir 'rara vez ... alguien cambie'.

Cita de: "m0skit0"
Cita de: "Nebire"
en el supuesto caso de que Chávez quedara como presidente, yo me iría del país
... ten en cuenta que lo cuenta en la democracia no es TÚ opinión, sino la de la mayoría.
Ya empieza a ser costumbre... te columpias diciendo cosas que no te has molestado ni siquiera en verificar. Mira este enlace: http://es.wikipedia.org/wiki/Regla_de_la_mayor%C3%ADa donde te indica claramente que 'La regla de la mayoría no debe ser confundida con la democracia, aunque ésta suele hacer uso de ella aplicada al pueblo elector. Sistemas no democráticos utilizan la regla de la mayoría en muchas ocasiones, y los sistemas democráticos suelen no utilizarla en muchas ocasiones....'  
 y un poco más abajo...
'...Frecuentemente y de manera errónea, se confunde «democracia» con regla de la mayoría. Es cierto que la democracia liberal moderna, tiene como una de sus reglas principales la aplicación de la regla de la mayoría, aplicada al pueblo, es decir a los ciudadanos, y principalmente para la elección de autoridades. Sin embargo, por un lado los sistemas democráticos tienen infinidad de mecanismos que atenúan la regla de la mayoría (refiriéndose a la mayoría del pueblo) y en otros casos mecanismos de decisión que no la utilizan en ningún momento (las decisiones presidenciales, las decisiones judiciales, etc.). Por otra parte sistemas no democráticos utilizan frecuentemente la regla de la mayoría para tomar decisiones, como por ejemplo la elección del papa por los cardenales en la Iglesia Católica, la toma de decisiones en una junta militar, etc...'

Actualiza o mejor aún corrije tus supuestos conocimientos sobre democracia, no son correctos para nada. No puedes pretender dar lecciones sobre Democracia a nadie.

Cita de: "m0skit0"
En Venezuela Chávez ganó DOS referéndums (que todos los organismos internacionales calificaron de limpios, incluso los yankis) y sobrevivió a un golpe de estado que no fue condenado por ninguna de las supestas "democracias" occidentales....
Te olvidas... que también en Venezuela, él mismo protagonizó un golpe de estado, pero... ah, claro si tu eras muy chiquitín, ni siquiera te dabas cuenta de lo que estaba pasando... será por eso que lo has olvidado o será que quizás esté prohibido recordarlo.

Cita de: "m0skit0"
¿Queréis democracia o queréis yankilandia? Esa es la cuestión. No confundan ambas cosas.
Ya ha quedado patente tu visión y conocimientos de lo que entiendes por Democracia, deja de usar una palabra cuyo significado desconoces en absoluto.
Por otro lado habrá que buscar un término para definir a los maniáticos que una vez tras otra cuando alguien no está de acuerdo con una postura de tipo político asume que sólo existe su postura y la de 'yankilandia'. De entrada se llama Fijación pero es algo más que eso... Supongo que Chávez  debe haber sodomizado a parte de la población a través de 'su canal de noticias' (único en el mundo) donde sólo suelta panfletadas contra Bush y en general contra  tú 'yankilandia'... de tanto repetir el estribillo ya se os ha quedado a alguno. Se sirve de ese dicho popular que dice:  'Calumnia que algo queda...'

Bush es ya historia... veremos que pasa cuando finalice el plazo de Chávez que 'tú mayoría', votó porque no haga ni un mandato más. Veremos si cuando ese plazo venza podremos decir que ya es historia y veremos si no tendremos que volver a habalr de él por su implicación en turbias historias... Veremos si es capaz de asumir la decisión de la  mayoría que él mismo convocó.  :food:

p.d.: Espero que dejes de utilizar la palabra Democracia contínuamente en tus post habido como se ha demostrado tu desconocimiento del significado auténtico de esa palabra... Mira que creer que Democracia = opinión de la mayoría   :rain:   :bravo:

387
La taberna del BIT / Re: Chavez o Uribe
« en: Miércoles 12 de Noviembre de 2008, 03:21 »
Cita de: "m0skit0"
 Si las cosas se argumentan debidamente yo estoy dispuesto a cambiar de opinión (no sería la primera ni la última vez, espero)
En política y religión, rara vez los argumentos satisfacen a alguien al punto de que cambie de opinión.

Yo no eligiría ni a Chávez ni a Uribe... pero si no quedara más remedio, elegiría a Uribe, y en el supuesto caso de que Chávez quedara como presidente, yo me iría del país... (como fuera, pero me iría).
Prefiero un país sin presidente que con Chávez como presidente.

388
VB .NET / Re: Duda Control Joystick VB.NET
« en: Miércoles 12 de Noviembre de 2008, 03:04 »
Hola.

Nunca he usado esas API, pero un vistazo rápido al visor de API, confirma mis sospechas... Te adjunto la declaración original de estas API y las estructuras para VB.6 que obviamente deben ser correctamente interpretadas para vb > 6.0

Código: Visual Basic
  1.  
  2. Public Declare Function joyGetPosEx Lib "winmm.dll" Alias "joyGetPosEx" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long
  3. Public Declare Function joyGetDevCaps Lib "winmm.dll" Alias "joyGetDevCapsA" (ByVal id As Long, lpCaps As JOYCAPS, ByVal uSize As Long) As Long
  4. Public Type JOYCAPS
  5.         wMid As Integer
  6.         wPid As Integer
  7.         szPname As String * MAXPNAMELEN
  8.         wXmin As Integer
  9.         wXmax As Integer
  10.         wYmin As Integer
  11.         wYmax As Integer
  12.         wZmin As Integer
  13.         wZmax As Integer
  14.         wNumButtons As Integer
  15.         wPeriodMin As Integer
  16.         wPeriodMax As Integer
  17. End Type
  18. Public Type JOYINFOEX
  19.         dwSize As Long                 '  tamaño de la estructura
  20.        dwFlags As Long                '  indicadores de lo que hay que devolver
  21.        dwXpos As Long                 '  posición x
  22.        dwYpos As Long                 '  posición y
  23.        dwZpos As Long                 '  posición z
  24.        dwRpos As Long                 '  timón/posición del 4º eje
  25.        dwUpos As Long                 '  posición del 5º eje
  26.        dwVpos As Long                 '  posición del 6º eje
  27.        dwButtons As Long              '  estado de los botones
  28.        dwButtonNumber As Long         '  número del botón que está presionado ahora
  29.        dwPOV As Long                  '  estado del punto de vista
  30.        dwReserved1 As Long            '  reservado para la comunicación del controlador winmm
  31.        dwReserved2 As Long            '  reservado para expansión futura
  32. End Type
  33.  
  34.  
  35.  

Como puedes ver , debes cambiar los tipos de datos originales, un long en vb6.0 es un integer (int32) en vb2008.
Haz también las correcciones pertienentes en la sub InitJoy (xJa, xRj deben declarase como integer visto la devolución de las API).

luego yo haría los siguientes cambios:
Código: Visual Basic
  1.  
  2.     ' cambiaría esto:
  3.     Public MYJOYCAPS As JOYCAPS
  4.  
  5.     ' por esto
  6.     Public MYJOYCAPS() As JOYCAPS
  7.  
  8.     ' esto:
  9.     xJa = joyGetNumDevs
  10.    ' por esto:
  11.     xJa = joyGetNumDevs - 1
  12.     ReDim MYJOYCAPS(0 To xJa)
  13.  
  14.     ' esto:
  15.     Dim xJn As Integer
  16.  
  17.    Debug.Print("Longitud MYJOYCAPS: " & Len(MYJOYCAPS))
  18.     For xJn = 0 To xJa
  19.          Debug.Print(xJn)
  20.          xRj = joyGetDevCapsA(xJn, MYJOYCAPS, 404)
  21.              If Val(MYJOYCAPS.wPid) <> 0 Then
  22.                 Debug.Print(MYJOYCAPS.wPid)
  23.              End If
  24.     Next
  25.  
  26.     ' por esto, añadiendo un bloque try ... catch:
  27.     Dim n As Integer
  28.  
  29.     Debug.Print("Longitud MYJOYCAPS(0): " & Len(MYJOYCAPS(0)))
  30.     n = -1
  31.     Do While n < (xJa - 1)
  32.         n = n + 1
  33.         Debug.Print(n)
  34.         Try
  35.             xRj = joyGetDevCapsA(n, MYJOYCAPS(n), 404)
  36.                If MYJOYCAPS(n).wPid <> 0 Then
  37.                 Debug.Print(MYJOYCAPS(n).wPid)
  38.              End If
  39.  
  40.         catch
  41.              msgbox err.Description
  42.         Finally
  43.            '.
  44.     Loop
  45.  
  46.  
  47.  

Yo no tengo Joysticks así que no puedo probarlo...
Una vez que arregles ese desaguisado de los tipos de datos, si tienes más problemas vuelve a preguntar con el error devuelto

389
Diseño de Algoritmos / Re: LISTAS ENLAZADAS
« en: Sábado 8 de Noviembre de 2008, 21:34 »
Podría ayudarte a despejar tus dudas y tal, pero la verdad a mi el código sin indentar me espanta, solo veo tochos de palabras.

Un código indentado y más o menos coloreado me permite de un vistazo descubrir la estructura (aunque sea seudocódigo), pero lotes de palabras.... ya te digo me espantan.

Usa los tags '['code']'  el código indentando '['/code']'   pero sin las comillas simples que he añadido para que no se ejecute el tag y se perciba lo que debes escribir...

390
VB .NET / Re: Migrar desde Delphi
« en: Sábado 8 de Noviembre de 2008, 21:27 »
No sé en que podremos ayudarte. el trabajo lo tienes que hacer la persona a la que han contratado al efecto, si eres tú, pués eso.

A preguntas puntuales siempre se podrá responder, pero si se te queda grande porque no conoces Delphi, te va a ser difícil por no decir imposible, llevar a cabo la tarea que te han encomendado...

Yo que tú pediría la planificación inicial (esquemas y demás) y trataría de montarlo desde ahí (si es que tenían algún plan y si se ciñeron a él, si luego han ido añadiendo y quitando sobre la marcha esas partes tendrías que trabajarlas revisando el código...

391
VB .NET / Re: Dudas sobre propiedades del formulario
« en: Sábado 8 de Noviembre de 2008, 21:15 »
Cita de: "Jimbenit"
Tengo otra pequeña duda
Estoy trabajando en un formulario MDI en VB2005, pero el area cliente es un poco reducida, como un 70% del area disponible, cuando los formularios "hijos" se maximizan, estos formularios debe ocupar el area cliente disponible, es decir, el 70% del area cliente del formulario "padre", vean la siguiente figura

Vean que el area cliente del formulario "Padre" tiene un tabControl y el resto es el area cliente que es donde se encuentra el formular io "hijo", la preguntas es:
Como puedo crear este efecto en el formulario "padre"?, que tenga un tabcontrol a la izquierda y que el area cliente sea lo que sobre (y no toda el area disponible)
Hola... siento tardar en responder, pero últimamente entro con menos frecuencia.

Te adjunto una imagen donde te explico como lograr que el tabcontrol (o cualquier otro control) se ajusta y queda fijado a una zona determinada.
Te explico los pasos... después de situar en tabcontrol sobre el formularo MDI, (suéltalo en cualquier parte), pinchas sobre el tabcontrol, pero no en cualquier parte, sino en las solapas, tal como señalan el paso 1 (fíjate que si pulsas sobre el área interior del tab, lo que se resalta es el panel interior, pero lo que queremos seleccionar es el tabcontrol, para acceder a sus propiedades, no a las fichas individuales, date cuenta en el paso 1 arriba a la derecha la flechita que aparece diferente de la cruz que aparece en la imagen marcada como no (X)).

Una vez tengas las propiedades del tabcontrol a la vista (paso 2) pulsa en dock (ajuste) esa propiedad controla el mantenerse firme tal como indican los bloques de la figura, ajustar a la izquierda (paso 3) es lo que tu quieres , si fuera tipo menú sería ajustar al tope, el centro es centrar en el a´rea libre del formulario y abajo del todo está none (libre sin ataduras).

También te muestro como el formulario hijo lo puedes maximizar, con lo que el área aumenta ligeramente al 'perderse' sus bordes, el menú se une (si lo tiene) al menú del MDI container , para restaurar el tamaño que tenía previamente pulsaríamos donde indico maxim... que en realidad debería haber puesto restaurar, pero cosas del dibujo, piensas una cosa y luego pones otra y cuando te das cuenta ya lo has guardado y subido... :brickwall:



p.d.: No sé que es lo que tienes con o contra Toph, tampoco me importa, pero no involucres a nadie sea lo que sea...

392
Visual Basic 6.0 e inferiores / Re: Controlar Impresiones Y Escaneos
« en: Sábado 8 de Noviembre de 2008, 19:57 »
mensaje repetido

393
Visual Basic 6.0 e inferiores / Re: Controlar Impresiones Y Escaneos
« en: Sábado 8 de Noviembre de 2008, 19:56 »
No seais tan incautos...

cuando alguien quiere prestar su ayuda, dirá lo que necesitais ú os dará el programa o el enlace, huid de las tonterías del email, en más de un 95% de los casos, son gente que quiere listas de incautos como vosotros que deja su email, para luego agobiaros de publicidad...  
son spammers a la caza de gazapos...

No importa que ahora salga a decir 'yo no soy así y para probarlo aquí os dejo lo que sea...' si es preciso lo busca y lo coloca para seguir manteniendo su status...
No sé claramente que dicen las normas del foro al respecto, pero este tipo de mensajes no deberían estar tolerados.

394
Visual Basic para principiantes / Re: ordenar ms y min en una lista
« en: Lunes 3 de Noviembre de 2008, 13:14 »
Es normal que no te devuelva correctamente ....
Tienes varias cosas que corregir, pero sólo me voy a ceñir a las 2 funciones del módulo

1º ) Esta declaración: 'Function mx(may As Integer)' (y la otra del menor) , cualquier declaración de una función sin tipo de retorno se entiende como Variant, sin embargo se observa que recibe un entero,y viendo lo que hace sería pués lo correcto que devolviera un entero tal que declararla así: 'Function mx(may As Integer) as integer' . Si en una función no vas a usar el parámetro de retorno y lo devuelves por referencia directamente desde el parámetro, entonces sería mejor que fuera una sub en vez de una function. aunque en algunos casos una sub pueda funcionar más rápido en devolver valores que una función, sólo interesa cuando la cantidad de llamadas es muy grande y no usamos inmeditamente el valor devuelto, ya que si esto último no se cumple no existe ventaja en la velocidad.

La función (funciones) que tienes son un ejemplo donde es conveniente devolver el valor como devolución de llamada porque el valor es un resultado final, si una matriz fuera evaluada sobre un sólo ítem la llamada a la función sería acorde que se devolviera con byref a través del parámetro dejando la devolución de la llamada libre para devolver una circunstancia concreta, ya que sería un valor 'medio' de un proceso mayor y no un proceso final en sí mismo.

En una función no conviene usar otroas variables que las declaradas explícitamente dentro de la misma, a través de sus parámetros y/o algunas constantes globales, así usar 'list1', no es lo adecuado, porque al hacer eso restringes la capacidad de una función, ya que la fuerzas a trabajar a una parcela concreta (sólo funciona con esa lista) si en cambio le pasas como parámetro un listbox la función podría aplicarse a cualquier lista que le pasaras y no sólo a list1.Es decir le estás restando universalidad a la función.  Pero bueno, supondremos que es sólo un ejercicio...

Si como dices esas funciones están en un módulo, duiudo que funcionen ya que marcarían error al usar list1, y en ese caso se debería indicar como form1.list1... por lo que queda claro que no lo tienes en un módulo como señalas sino dentro del formulario.

En la devolución de las funciones (las dos) lo que devuelves es 1, fíjate ya le dices después de hacer lo que sea que 'mx = 1', por tanto lo que devolverá es 1. Por otro lado puesto que no declaras may dentro del parámetro se sobrenetiende que es byRef por lo que todavía podría funcionar, sin embargo al recibir la llamada, ignoras ese valor en favor del retorno explíxito de la llamada.
'n = mx(may)' . O usas call mx(may) y sigues usando may hasta el final o usas mx= may al final de la función.

También se observa en relación con lo anterior un intento mísero de querer tener control del resultado de la función cuando usas: 'If n = 1 Then', sin embargo resulta absurdo desde el momento en que nunca tiene oportunidad de ser un valor distinto de 1 ya que la función al final hace un si o si  'mx = 1', esto sólo puede variar cuando haya un error y en ese caso ya el propio entorno se encarga de parar la ejecución porque tampoco existe control de errores (si es que esperaras uno, sobre código adicional que hayas retirado al mostrar el ejemplo).

Luego veo que en el supuesto módulo declaras variables globales a variables que se repiten dentro de una y otra función, al respecto debes saber que las variables de una función 'nacen' y deben 'morir'  en la función, así la línea 'Dim nume, j As Integer, y As Integer, i, p As Integer' es casi un insulto a la función, pués que impide en un momento dado usar i ó p en otra función y obtener errores porque de entrada no eran 0, debo recordar si el valor que tiene actualmente me es útil al caso presente o acaso si es opuesto ?.... esto no son formas...
 
En fin en tan poco código produces tantos y tantos errores que se me han quitado hasta las ganas de resolverte las dudas... porque creo que igualmente sólo serviría para cometer otras decenas de atropellos... sólo puedo recomendarte que dejes el código de momento, y que no vuelvas a escribir una línea más hasta que te hayas leído por lo menos un manual que sepas que es una variable, qué es una función, que es un método o subrutina, etc, etc, etc... de lo contrario adquirirás muy malos hábitos que luego te costará mucho corregir y serás un programador caótico e ineficiente sin futuro alguno.

395
VB .NET / Re: Como pasar de codigo morse a texto
« en: Lunes 3 de Noviembre de 2008, 06:01 »
salió repetido el mensaje...

396
VB .NET / Re: Como pasar de codigo morse a texto
« en: Lunes 3 de Noviembre de 2008, 05:58 »
Hola.

El problema que tienes es que tu tomas del texto carácter a carácter, luego en el bloque select case le dices que si es uno de aquellos a 'b' se le añada tal... pero claro elo código morse no es un código basado en 1 sólo carácter sino en varios, por tanto puesto que sólo tomas un carácter en el bloque select case sólo coincidrá cuando sea '.' ó '-' , es decir punto o raya (E y T), porque son los únicos caso de un sólo carácter.

La solución no es posible. De hecho para que fuera sencillo debería haber un carácter separador entre cada signo del código, sino es así no hay manera de saber si la secuencia '-.-.-.' es ';' o si es 'NNN' ó 'KR' ó 'CN', etc....

El código ha sido abandonado de los procesos digitales por los errores ineludibles cuando una máquina intenta interpretar el 'acento' de cada conferenciante. Si hubiera un tercer signo separador, sería otra cosa, o bien una regla de separación , por ejemplo en binario se usan también sólo dos dígitos pero para interpretar un cóodigo se establece previamente el tamaño de cada 'palabra', casos:  byte= 8 códigos, Integer=32 códigos, etc... Caudno se teclea, el separador es una pausa en el tiempo, que una persona puede interpretar correctamente con cierto adiestramiento, pero en un texto lineal, es prácticamente imposible, habría que hacer un programa de inteligencia artificial  primero para crear un contexto y luego probar si lo que sigue es consecuente con el contexto, si no lo es habría que recrear un nuevo contexto, etc... Todavía no tenemos esa potencia de análisis apenas hemos emepezado a procesar el lenguaje humano, como saber si la secuencia es un texto humano o los datos de la matriz de una imagen... o un ruido previo para ofuscar y entorpecer a un posible oyente... ?

No te rompas los cuernos con morse, aunque si es por precticar siempre aprenderás algo....

397
VB .NET / Re: Dudas sobre propiedades del formulario
« en: Sábado 1 de Noviembre de 2008, 01:24 »
Añade un botón al formulario y este código... prueba el botón al menos 7 clicks...

Código: Visual Basic
  1.  
  2.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.         Me.FormBorderStyle = (Me.FormBorderStyle + 1) Mod 7
  4.         MsgBox(Me.FormBorderStyle)
  5.     End Sub
  6.  
  7.  

a lo 2º si maximizas el formulario hijo, cubre todo el área además el menú se integra con el formulario MDI...
Código: Visual Basic
  1.  
  2. Me.WindowState = FormWindowState.Maximized
  3.  
  4.  
Si es el único formulario hijo mostrado en ese momento el el formulario MDI puedes hacer (enel form hijo)
Código: Visual Basic
  1.  
  2.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  3.         MDIParent1.LayoutMdi(MdiLayout.TileHorizontal) ' o vertical
  4.     End Sub
  5.  
  6.  
Finalmente si hay más de un formulario, debes ajustarlo a las medidas del área 'cliente' ...  usa MDIParent1.ClientRectangle.Size

Para alcular medidas puedes ayudarte de substract o add, un ejemplo con substract:
Código: Visual Basic
  1.  
  2. Dim s As Size = MDIParent1.ClientRectangle.Size
  3. s = Drawing.Size.Subtract(s, (Drawing.Size.Subtract(Me.Size, Me.ClientRectangle.Size)))
  4.  
  5.  

398
VB .NET / Re: Ordenar una matriz..
« en: Jueves 30 de Octubre de 2008, 18:11 »
Hola...

De entrada decirte que se puede ordenar perfectamente una matriz de 2 o más dimensiones directamente sin trasvasarla a una matriz unidimensional, pero el algoritmo resultante es un poco más complejo, y ciertamente para un estudiante que se inicia sea más complejo aún de lo necesario.

Dicho lo cual te aclaro: ordenar es comparar por tamaños y colocarlos de acuerdo a esa comparación... por tanto , si ordenas de mayor a menor deberías tener una variable llamada max (o la que te dé la gana, pero que refleje la idea del mayor) y habrá de contener o bien el valor del mayor o bien el índice del valor de mayor. No obstante para empezar... el algoritmo más sencillo de entender es el de burbuja y a ese caso la variable necesaria no tiene la necesidad de llamarse max ni min, sino más bien temp, ya que contendrá un valor arbitrario de modo temporal.

El método de burbuja es casi el más sencillo de programar, de hecho es tan sencillo que se puede programar de memoria, sin pensar en menos de un minuto (menos aún, para los que teclean muy rápido).

El método de burbuja son 2 bucles anidados, el externo hha de recorrer desde 0 hasta el final de la matriz -1, el bucle interno se inicia en el valor actual  del externo +1, hasta el final de la matriz. Fíjate que 'A < B' es igual que 'B  > A' , lo digo porque a veces puede inducir a engaño pensar que si busco el mayor plantee que un elemento es menor que...estuviera mal, cuando es totalmente correcto.

El cuerpo del bucle interno lo que hace es preguntarle el valor de la matriz cuyo índice señala el primer bucle es menorque el valor de la matriz en el índice que señala el bucle interno ????, si la respuesta es si se intercambian los valores, para ello usamos esa variable temp...
Código: Visual Basic
  1. temp= matriz(bE)  ' be bucleexterno, bi bucle interno... refieren el contador de cada bucle, típicamente llamados  j,k,i
  2. matriz(bE)=matriz(bI)
  3. matriz(BI)=temp
  4.  
Fíjate de no liarte si quieres ordenar de mayor a menor o de menor a mayor, ya que con un pequeño cambio (de diferentes maneras) en esa parte del código el desarrolo final podría ser el inverso... o incluso algo desastroso. Como referencia, con los datos aportados, al final del primer bucle interno, matriz(0) contiene el mayor de todo el array....
El algoritmo de burbuja es casi el más lento, pero para unos pocos cientos de elementos no se nota...

Ya lo tienes mascado..

399
Cambia estas líneas
Código: Visual Basic
  1.  
  2.     Private Sub flfile_Click()
  3.         If flfile.FileName <> "" Then
  4.               Open flfile.FileName For Input As #1
  5.      ....
  6.      ....
  7.      ....
  8.  
  9.  

Por estas otras:
Código: Visual Basic
  1.  
  2.     Private Sub flfile_Click()
  3.         dim fich as string
  4.      
  5.         If flfile.FileName <> "" Then
  6.               fich= File1.Path & "" & File1.FileName  ' ruta entera hacia el fichero
  7.               if dir(fich)<>"" then                ' desde que se seleccionó el archivo... existe aún en diche ruta
  8.                   Open fich For Input As #1    ' si existe todavía abrimos el archivo, dando [color=#8000FF]su ruta completa[/color]....
  9.         ....
  10.         ....
  11.         ....    
  12.  
  13.  
p.d: se me ha adelantado F_Tanori al enviar la respuesta, desde que estoy respondiendo... Como indicas que estás practicando, el código que te indico sigue siendo válido sin menoscabo de lo que te indica F_Tanori...

400
VB .NET / Re: Carga de Formulario Dinamico desde .exe
« en: Lunes 27 de Octubre de 2008, 12:58 »
Que quieres que te diga...  :brickwall:  si para añadir funcioalidad a un programa sin rescribir ese programa, lo que haces es rescribir una dll, dónde está la diferencia ?.

Tienes 2 aplicaciones una es la que muestra la interfaz de ejecución y otra oculta es esa dll , tu interfaz (la ventana 1) lo primero que hace cuando arranca es ejecutar una función de la dll,  leer_el listado_de_'formularos'_disponibles, el cual le devuelve una matriz con un númerito (no absolutamente necesario), unos iconos (como matriz de long por ejemplo) y el nombre de los mismos. Esa matriz la metes en un menú 'principal'

Luego Cuando pulse en uno de esos formularios disponibles, lo que hace es llamar a la dll que muestra ese formulario dentro desí pero que está oculto y con un setparent (por ejemplo) se transfiere desde la dll a la aplicación, puedes transferir el formulario completo, o sólo un panel donde reposa lo principal, ó un panel y un menú... en fin eso ya es a tu gusto.

No es necesario disponer y usar desde una base de datos, de hecho creo que eso lo que hace es complicarlo, a cambio puedes en la dll tener una estructura equivalente a esa tabla de una bd, gestionada por una clase... con métodos tales como listar_formularios genera la matriz de items: (item, nombre, icono, descripción...) , listar_objetos_aTransferir  lista de los objetos a los que haremos un setparent dado un item de referencia, ... etc... en la dll cuando se invoquen las llamadas la clase crea dichos listados y la función ejecuta dicha devolución.

Pero date cuenta que al caso la interfaz que no quieres modificar en realidad es un cascarón hueco con una funcionalidad mínima justo para invocar la dll, por lo que no modificar la aplicación pero modificar la dll es sólo una cuestión en la práctica, vana.

Por ahí debo tener un código parecido a esto sólo que creo recordar que no eran ficheros separados, pero al caso es lo mismo, si ves que no eres capaz de sacarlo por tí mismo, me lo indicas y lo buscaría haría alguna adaptación para eliminar todo el código que no es estrictamente explicativo del ejemplo y lo subiría.

Páginas: 1 ... 14 15 [16] 17 18 ... 29