Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - okik

#641
engel lex No te ignoro, de hecho el comentario anterior era dirigido a ti, lo que pasa es que hice un copia y pega el alias y no me di cuenta que no era tuyo. :silbar:

En fin gracias  los dos

Vale ahora entiendo, gracias a esta explicación más mundana:
Código (xml) [Seleccionar]
"es es hombre o es mujer, pero no puede ser ambos al mismo tiempo y siempre tinene que ser uno"

Sinceramente, ahora que lo veo, no sabría, en programación como usar esto. He visto códigos que lo usaban y sabía lo que hacían, es decir, el objetivo de su uso, pero no como opera este operador.

Por ejemplo:
Para pasar el valor A a B y el valor B a A.


Código (xml) [Seleccionar]
A= 5
B= 6

A = A Xor B
B = B Xor A
A = A Xor B

Ahora A= 6 y B= 5


No entiendo qué mente matemática retorcida puede ultramar tal propósito solo para pasar lo de A a B y viceversa, ni aún entendiendo el funcionamiento de dicho operador. En fin, será cosa de genios.

Nunca he estudiado  lógica proposicional, de hecho aunque he estudiado matemáticas, no tenía ni idea de esta rama, sí de la lógica en sí (aunque no la he tocado), pero no de Lógica proposicional.




Álgebra de Boole, lo explica genial gracias. A veces uno no sabe por donde tirar si no pregunta

https://es.wikipedia.org/wiki/%C3%81lgebra_de_Boole
#642
Gracias Gh057 Y [/b]engel lex[/b], me lo has dejado más claro, voy entendiendo la lógica.

He comprendido lo de bit a bit con el 101 y 011, se compara dígito por dígito. Pero
porqué...
Código (xml) [Seleccionar]

1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0


es decir ¿porqué 1 xor 0 es 1?, lo entendería se fuera 1+0 =1
¿Porqué 0 xor 1  es 1? como antes si fuera 0+1= 1
Pero llega el 1 xor 1, ¿Porqué diantres es 0? Si resto rompe la regla anterior

Sl2



y 1 + 1 = es 10 en binario
#643
Hola

Bueno, pues eso. ¿cuál es la lógica?

Vamos a ver de:
5 xor 3 devuelve 6

Según la ayuda de MSDN es porque como 5 = 101 (en binario ) y 3 = 11 pues devuelve  
110 que es el equivalente binario de 6.

En fin, menuda explicación chorra. Yo creo que el/la que lo puso no tenía ni idea. Y si la tenía, se ha explicado como por el culo. Por que ha dicho lo mismo pero con binarios.

Y luego está esto:
"Realiza una exclusión lógica entre dos expresiones de tipo Boolean o bien una exclusión bit a bit entre dos expresiones numéricas."

Más de lo mismo, es peor que el lenguaje administrativo.


Una ayudita porfa
:-(
#644
Ok, gracias Elektro

Oye, en confianza, que lo de la "bronca" no me refería a tí , eh  ;)

Bueno la otra forma sería así:

Código (vbnet) [Seleccionar]
   
<DllImport("user32.dll", BestFitMapping:=False, CallingConvention:=CallingConvention.Winapi, CharSet:=CharSet.Unicode, EntryPoint:="user32")> _
   Public Shared Function GetCursorPos(ByRef lpPoint As POINTAPI) As Boolean
   End Function


Y establecer el siguiente Imports:
Código (vbnet) [Seleccionar]
Imports System.Runtime.InteropServices

Evidentemente es lo que dices, aquí puedo establecer los parámentros de la llamada.

Pero quería decir que si funciona o realmente no hace falta establecer nada pues ya vale aunque sea al estilo de VB6, digo yo.




Bueno, sabiéndolo personalmente siempre buscaré la forma de no tener que usar funciones API.


#645
Hola

Soy emigrante de VB6 a .NET, de hecho ya me han echado la "bronca" en varias ocasiones por usar la metodología de VB6 en .NET cuando no era necesario. He visto que se puede prescindir de algunas funciones API de Windows en .NET.  El caso es que no se cuales funciones ya están incluidas en .NET o no.

Una que ahora mismo estoy buscando es el GetCursorPos, para determinar la posición X, Y del puntero en el escritorio.

Llamando así funciona:

Código (vbnet) [Seleccionar]
   
   Structure POINTAPI
       Public X As Integer
       Public Y As Integer
   End Structure
   Private Declare Function GetCursorPos Lib "user32.dll" ( _
   ByRef lpPoint As POINTAPI) As Integer



Pero parace ser que es más de '.NET' ponerlo así:

Código (vbnet) [Seleccionar]
  Public Structure POINTAPI
       Public X As Integer
       Public Y As Integer
   End Structure

 <Runtime.InteropServices.DllImport("user32.dll")> _
   Public Shared Function GetCursorPos(ByRef lpPoint As POINTAPI) As Integer
   End Function


No se, me extrañaría que los de Microsoft, al construir .NET no hubieran establacido funciones internas de .NET para todas funciones incluidas en DLLs de Windows como USER32.DLL. y no tener que hacer estas llamadas.


Saludos y gracias




Pues nada que en dicho caso parece que es lo que digo:

Código (vbnet) [Seleccionar]

'Posición X del cursor en el escritorio
  Me.Text = Cursor.Position.X


Fuente:
https://msdn.microsoft.com/es-es/library/system.windows.forms.cursor.position%28v=vs.110%29.aspx

No entiendo porqué, si como parece estoy en lo cierto, tanta gente postea y fomenta el uso de estas llamadas cuando no son necesarias

#646
buenas..

¿Hay alguna forma de eliminar elementos repetidos en un Array?


Me he hecho una función, que me ha costado, el ingeniarlo quiero decir, que es la siguiente:


Código (vbnet) [Seleccionar]
   Public Function DeleteArrayRepetitions(ByVal strArray1() As String, ByVal Sorted As Boolean) As Array
       Dim strArray2(0) As String
       Dim TempElement As String
       Dim Count1 As Integer
       Dim Count2 As Integer
       For Each TempElement In strArray1
           Count1 += 1
           If Count1 = 1 Then strArray2(0) = TempElement
           If Array.IndexOf(strArray1, TempElement, Count1) = -1 Then
               ReDim Preserve strArray2(Count2)
               strArray2(Count2) = TempElement
               Count2 += 1
           End If
       Next
       If Sorted = True Then Array.Sort(strArray2)
       Return strArray2
   End Function



Lo que hace es comprobar uno por uno los elementos del strArray1 y si no está repetido lo pasa al strArray2, hasta completar una lista sin repeticiones. Una vez el strArray2 está completo lo pasa a la función DeleteArrayRepetitions que también es un Array. Es decir, la función devuelve una lista sin repeticiones.



En un intento de reducirlo más, resulta que obtengo un código más o menos igual solo que esta vez usando Array.LastIndexOf en lugar de Array.IndexOf



Código (vbnet) [Seleccionar]
   Public Function DeleteArrayRepetitions(ByVal strArray1() As String, ByVal Sorted As Boolean) As Array
       Dim strArray2(0) As String
       Dim Count As Integer = 0
       Dim Count2 As Integer = 0
       For Each Element In strArray1
           Dim Last As Integer = Array.LastIndexOf(strArray1, Element)
           If Count = Last Then
               ReDim Preserve strArray2(Count2)
               strArray2(Count2) = Element
               Count2 += 1
           End If
           Count += 1
       Next
       If Sorted = True Then Array.Sort(strArray2)
       Return strArray2
   End Function





Para usarlo se hace los siguiente:

Código (vbnet) [Seleccionar]
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim Numbers() As String = {"1", "5", "5", "5", "4", "1", "12", "4", "55"}

'Quita los elementos repetidos
       Numbers = DeleteArrayRepetitions(Numbers, True)

'Lista los elementos del Array en un ListBox
       For Each Element In Numbers
           ListBox1.Items.Add(Element)
       Next
   End Sub


El ListBox mostrará:

1
12
4
5
55


A pesar que las funciones funcionan bien, debe haber alguna forma más sencilla, alguna función en VBNET que permita hacerlo. He probado con Array y ArrayList, pero no he visto nada.

Sl2
#647
Que tal esto:

Código (vbnet) [Seleccionar]
Public Class Form1
    Dim WB As New WebBrowser

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Button1.Text = "Cargar página"
        Button2.Text = "Upload Image"
        Button2.Enabled = False
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        WB.ScriptErrorsSuppressed = True
        Try
            WB.Navigate("http://www2.yapo.cl/ai/form/7?ca=15_s")
            Me.Cursor = Cursors.WaitCursor 'Cambia el cursor a espera

            'Espera a que cargue la página
            Do While (WB.ReadyState <> WebBrowserReadyState.Complete)
                My.Application.DoEvents()
            Loop

            If WB.ReadyState = WebBrowserReadyState.Complete Then
                Me.Cursor = Cursors.Default 'Retorna el cursor normal
                Button2.Enabled = True
            End If
        Catch ex As Exception
            MsgBox("No se ha podido gargar la página")
        End Try

    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim clElement As HtmlElementCollection = WB.Document.GetElementsByTagName("Input")
        For Each Element As HtmlElement In clElement
            Dim controlName As String = Element.GetAttribute("input").ToString
            If Element.GetAttribute("name").Equals("file") Then
                Element.InvokeMember("click")
            End If
        Next
    End Sub
End Class


No me acaba de gustar porque si metes mal la URL el segundo botón se activa igualmente, pero por ahí va la cosa. Crear un sistema de espera a que se cargue la página.

Por cierto, para este código NO necesistas introducir físicamente un WebBrowser en el formulario, gracias a :        Dim WB As New WebBrowser


De modo que puedes introducir datos y hacer clics a botones sin que se vea la página.




#648
Cita de: Eleкtro en 20 Junio 2015, 00:32 AM

Si no necesitas navegar en la página entonces no necesitas usar IE (WebBrowser) ni el host de MSHTML ni nada parecido, puedes usar la Class HttpWebRequest/HttpWebResponse (entre otras) para realizar peticiones a una url y obtener la respuesta (el código fuente de la página).

➢ HttpWebRequest Class (System.Net) - MSDN
➢ HttpWebResponse Class (System.Net) - MSDN

....


Es justo lo que necesitaba gracias
#649
Hola

Antes de nada, felicitarte Elektro por tu ayuda aquí, que es incalculable. Ya que te esfuerzas mucho y es de apreciar pues mucha gente contesta con monosílabos.

Parece que sabes mucho de esto. Perdona mi ignorancia y a ver si puedes decirme si este otro método podría servir, quizás algo chapucero:

Descargo la web con la función API, URLDownloadToFile y establecer BINDF_PRAGMA_NO_CACHE que según encontré en el MSN es :
 Value that indicates that the resource will not be stored in the Internet cache.

Alojo el archivo único en una carpeta temporal. Y luego lo abro con Webbrowser.

Código (vbnet) [Seleccionar]
   Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
   (ByVal pCaller As Integer, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Integer, _
    ByVal lpfnCB As Integer) As Integer

   Const BINDF_PRAGMA_NO_CACHE = &H2000
   Const ERROR_SUCCESS = 0

   Public Function GetCodeWEB(ByVal sURL As String) As String

       Dim sLocalTempFile As String = My.Computer.FileSystem.SpecialDirectories.Temp & "\file_web.html"

       If URLDownloadToFile(&H0, sURL, sLocalTempFile, ERROR_SUCCESS Or BINDF_PRAGMA_NO_CACHE, &H0) = ERROR_SUCCESS Then
           Dim strBuffer As New System.IO.StreamReader(sLocalTempFile)
           Return strBuffer.ReadToEnd
           strBuffer.Close()
       Else
           GetCodeWEB = "Página no encontrada"
       End If


   End Function








En cuanto a lo del control WebBrowser es una ventana host  que como dices va con IE y lógicamente para mostrar el contenido web primer se alojan los archivos en el caché, para después cargarlo.

Sin embargo puedo usar...

Código (vbnet) [Seleccionar]
Dim WB as new WebBrowser

...sin haber integrado ningún WebBrowser en el formulario.

Código (vbnet) [Seleccionar]

Dim WB As New WebBrowser
       WB.Navigate("http://...")
       Dim CodeWeb As String = WB.DocumentText


Aun así supongo que se guardan datos de caché, que era la duda que yo tenía.







#650
hola

No había caído, gracias. Aprecio tu aporte.


Como prueba he conectado el móvil para usarlo como modem y utilizar la conexión del mismo. El código sigue funcionado. He sustitiudo (0) por Firts.

Código (vbnet) [Seleccionar]
ipv4Stats = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces.First.GetIPv4Statistics

Pero supongo que es lo mismo.


En cuanto al código que me das, me da error en la lína 14.

Código (vbnet) [Seleccionar]
Dim ipv4Stats As IPv4InterfaceStatistics = GetEthernetAdapters.First.GetIPv4Statistics

Señala a GetIpv4Statistics y dice "La secuencia no contiene elementos"

Intentaré averiguar el índice de la red activa.


Sl2