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 - Eleкtro

#3731
Ten en cuenta, que una cosa son los campos (o lógica) del control, y luego, la UI. Ya te has dado cuenta por ti mismo de que la barra de progeso que llega a 100, puesto que el campo ProgressBar.Value así lo indica, pero si la UI se tuviera que actualizar/dibujar con la misma constancia, entonces la UI se volvería muy deficiente y propensa a constantes congelamientos, aparte, los efectos visuales de degradados y destellos y demás florituras, como el efecto de relleno 3D de una progressbar, requieren más trabajo/tiempo de ejecución.

Viendo el código fuente online, el método Increment o PerformStep lo único que hacen es llamar a la función Win32 SendMessage para enviar el mensaje que actualiza la posición, a la cola de mensajes del control, y este mensaje se procesará cuando se desocupe el resto de mensajes que están siendo procesados constantemente por el control, suele ser algo "instantaneo", pero no tiene por que serlo, igual que el redibujado del control para mostrar esos cambios, tampoco tiene que ser instantaneo, sino cuando sucede "algo" que llame al invocador de ese evento para dispararlo.

Código (csharp) [Seleccionar]
private void UpdatePos() {
   if (IsHandleCreated) SendMessage(NativeMethods.PBM_SETPOS, value, 0);
}



En resumen, que es lo más normal del mundo, aunque para entenderlo mejor habría que conocer el código fuente de la función SendMessage para ver como funciona, y sobre todo entender a fondo como funciona la cola de mensajes para ventanas Win32, cosa que yo no se a ciencia cierta, lo que si se es que si dejas el tiempo necesario para que se procese el mensaje y se pueda actualizar la UI (unos ms), entonces puedes comprobar como si que se completa la barra de progreso hasta el final:

Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Friend WithEvents Timer1 As New System.Windows.Forms.Timer With {.Interval = 20}

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Me.ProgressBar1.Step = 1
       Me.Timer1.Start()

   End Sub

   Private Sub IncreaseProgressBar(ByVal sender As Object, ByVal e As EventArgs) _
   Handles Timer1.Tick

       Me.ProgressBar1.PerformStep()

       If (Me.ProgressBar1.Value = Me.ProgressBar1.Maximum) Then
           Me.Timer1.Stop()
           MsgBox("done") ' unos ms despues de saltar el msgbox verás como se completa la barra.
           MyBase.Close()
       End If

   End Sub

End Class


Saludos.
#3732
Bueno Luis... ya que necesitas ayuda con esos códigos que tienes mezclados a tu manera, que le vamos a hacer.

Teniendo un ListBox con los sigueintes items:
Citar1, 2, 3
3, 2, 1
1, 3, 2
2, 1, 3
4, 5, 6
7, 8, 9



El supuesto resultado que creo que esperas obtener es el siguiente:
Citar1, 2, 3
4, 5, 6
7, 8, 9



(Más te vale que sea así, por que no hay quien sea capaz de entender en que sentido son "iguales" :¬¬)

Pues, entonces, una forma sencillita de hacerlo seria implementando tu propio comparer para evaluar duplicados:
Código (vbnet) [Seleccionar]
   Public NotInheritable Class CombinationComparer : Implements IEqualityComparer(Of String)

       Public Shadows Function Equals(ByVal x As String, ByVal y As String) As Boolean _
       Implements IEqualityComparer(Of String).Equals

           ' (temporalmente) Ordeno de forma ascendente los números de una cadena de texto delimitada por comas;
           '
           ' e.g.:
           ' Una cadena de texto como "3, 1, 2" (con, o sin espacios en blanco),
           ' se transformaría en "1,2,3" (sin espacios en blanco).

           x = String.Join(",", From value As String In x.Split({","c, " "c}, StringSplitOptions.RemoveEmptyEntries)
                                Order By value Ascending)

           y = String.Join(",", From value As String In y.Split({","c, " "c}, StringSplitOptions.RemoveEmptyEntries)
                                Order By value Ascending)

           #If DEBUG Then
                       Console.WriteLine(String.Format("x:{0}", x))
                       Console.WriteLine(String.Format("y:{0}", y))
                       Console.WriteLine()
           #End If

           Return (x = y)

       End Function

       Public Shadows Function GetHashCode(ByVal obj As String) As Integer _
       Implements IEqualityComparer(Of String).GetHashCode

           Return MyBase.GetHashCode()

       End Function

   End Class


Y lo emplearías de la siguiente manera:
Código (vbnet) [Seleccionar]
Dim items As String() = Me.ListBox1.Items.Cast(Of String)().ToArray()
items = items.Distinct(New CombinationComparer).ToArray()

With Me.ListBox1
   .SuspendLayout()
   .Items.Clear()
   .Items.AddRange(items)
   .ResumeLayout()
End With

( importante: no olvides de usar la extensión ".ToArray()" como en el ejemplo, para crear una copia de la colección de items del ListBox )

PD:
Si no es ese el resultado que esperas obtener, no te preocupes, te lo he puesto bien facilito al menos el 50% de la tarea, solo tienes que cojer el comparer de ejemplo y realizar las adaptaciones necesarias en la implementación del métobo base IEqualityComparer(Of String).Equals, en la variable "X" e "Y".

Saludos
#3733
El mal llamado "Estilo Elektro" se denomina LINQ-to-Objects, es algo más expensivo que un FOR, pero más legible y manejable que un FOR.

Si le ofrezco soluciones basadas en LINQ, es por que supuestamente Luis en su día se puso a practicar con los 101 ejemplos de LINQ oficiales de la galería de código de Microsoft, por lo que está más acostumbrado a este estilo de sintaxis, lo cual, en mi opinión, le resultará de mucha utilidad, puesto que, lo bueno de LINQ, es su versatilidad con esa cantidad de útiles keywords disponibles para realizar típicas operaciones que nos tomarían más tiempo de escritura al traducirlas a un búcle For Range o For Each.

Saludos.
#3734
Lo estás haciendo todo al revés Luis, primero estás obteniendo una coleccion con sub-colecciones por elementos ( IEnumerable(Of IEnumerable(Of Integer)) ), luego, por cada sub-colección, unes todos los sub-elementos en un string con String.Join(), luego, ese string, el cual contiene la representación de cada sub-colección con saltos de linea, lo partes por un salto de linea ( colección.Split({Environment.NewLine}) ) para obtener de nuevo una colección que insertar en el listbox... y ahora, quieres volver a convertir los elementos del Listbox en un array de enteros para eliminar duplicados.

No se si me he equivocado en algún paso del procedimiento, por que ya solo de pensarlo es un completo lio lo que estás haciendo, tanta conversión de array a string, y viceversa, DEJA DE HACER ESO.

Si quieres eliminar duplicados, entonces hazlo en el momento en el que construyes la colección de combinaciones, NO despues de haberla transformado en no se cuantos tipos de objetos ya :¬¬.

Mi consejo:
Intenta hacer un buen planteamiento de la lógica antes de escribir ningún código, por que luego acabarás con necesidades como esta, me refiero a tener que hacer algo en un paso del proceso en el que ya deberias haberlo hecho... no se si me explico.
Create un Type que herede de una colección genérica, llamemoslo CombinationCollection, y úsalo parra almacenar las combinaciones.
Para representar los valores o combinaciones, en un string, podrías utilizar un proveedor de formato personalizado, es decir, una class que implemente la interface IFormatProvider y ICustomFormatter (el cual usarias como formato personalizado en el método  String.Format()). O simplemente suplantar el método ToString en tu type personalizado.

Es mucho trabajo, como para mostrarte ejemplos de todo, pero en MSDN los puedes encontrar.

Saludos!
#3735
¡¡ NUEVA VERSIÓN v1.5 YA DISPONIBLE !!

Cambios importantes:

  • Se ha reducido la cantidad de ensamblados a 9, unificando varios de ellos.
  • Se ha añadido un nuevo ensamblado, Elektro.Core.dll, por el motivo anterior.
  • Se ha añadido un nuevo ensamblado, Elektro.Application.ThirdParty.dll, con casi una infinidad de utilidades para librerías de terceros, wrappers de aplicaciones command-line, extensiones para frameworks de terceros como Telerik, etc.
  • Se han añadido al rededor de +100 nuevas extensiones de método en total.
  • Se han añadido muchas más utlidades en general, métodos, funciones, types, interfaces, etc.

Cambios no tan importantes:

  • Pequeñas optimizaciones, refactorizaciones, correcciones, y demás.




La lista actual de librerías de terceros referenciadas para desarrollar los miembros del Namespace Elektro.Application.ThirdParty, es la siguiente:

CitarABC OCR .NET
AForge
Alvas Audio
Android Lib
Aspose
CodeScales
DiffLib
dnlib
DotNetBar
DotNetZip
EASendMail
FreeImage
FtpClient
GeckoFX
HTMLAgilityPack
IconLib
ImageDraw
Nasosoft Transform
NAudio
NCalc
NDde
SautinSoft
Scintilla.Net
SevenZipsharp
SubtitleWorkshop
TagLib Sharp
Telerik
VistaCoreAudioApi
XnaFan ImageComparison

Notas:
- Obviamente no es necesario compilar ni usar el ensamblado Elektro.Application.ThirdParty si uno no quiere.
- Las dependencias no van incluidas en el código fuente por motivos éticos... (en algunas de ellas, es ilegal, como las de Telerik).

Saludos!
#3736
De todas formas, tengo una sorpresita para ti.

Ayer te mencioné lo del desarrollo de la función de permutaciones (ya no se si quieres combinaciones o permutaciones, pero esto viene al caso igualmente),
al final he acabado haciendo un puerto para Vb.Net de la librería Combinatronics, la cual tiene un código fuente que es una delicia:

Aun no he terminado de finalizar el código fuente, pero igualmente puedes usar ese en C#. Solo tienes que descargarlo desde GitHub y compilarlo en Visual Studio, se generará una librería "Combinatronics.dll", referencias esa dll en tu proyecto de Vb.Net, y listo.

Modo de empleo:
Código (vbnet) [Seleccionar]
Dim permutations As New Permutations(Of Integer)({3, 1, 10}, MetaCollectionType.WithoutRepetition)

MsgBox(String.Format("Permutaciones: {0}", permutations.Count))

For Each permutation As List(Of Integer) In permutations
   Console.WriteLine(String.Join(", ", permutation))
Next permutation


PD: Si esto no resuelve los problemas con combinaciones/permutaciones ...yo no se que más puedes necesitar ya xD.

Saludos!
#3737
20, 24, 34
20, 34, 24
34, 24, 20


Yo no veo ninguna repetición, tecnicamente son combinaciones distintas.

Muestra la lista completa del resultado que obtienes, y la lista completa del resultado que esperas obtener, sino esto no hay quien lo entienda ya!.
#3738
No te preocupes, AndAlso y OrElse son unos keyword sencillos de recordar, pero claro hay que acostumbrarse y practicar para que se quede todo bien memorizado, ahora que sabes como hacerlo seguro que te será mas facil en el futuro

saludos!
#3739
Cita de: luis456 en 22 Marzo 2016, 17:05 PM
lo que me gustaría saber es como mostrar en ves de value1 y value 2, poner dentro de la misma rutina un tercer valor value3

o sea mostrar "  value1 , value2 y value3

¿Te refieres a hacer esto?:

Código (vbnet) [Seleccionar]
       Dim intCol As IEnumerable(Of Integer) = {1, 3, 4, 5, 8, 13, 24, 35, 44, 49, 55, 77, 88}

       Dim pairsCol As IEnumerable(Of String) =
            From value1 As Integer In intCol
            From value2 As Integer In intCol
            Select String.Join(Environment.NewLine, (
                               From value3 As Integer In intCol
                               Where (value1 <> value2) AndAlso
                                     (value1 <> value3) AndAlso
                                     (value2 <> value3)
                               Select String.Format("{0:00}, {1:00}, {2:00}",
                                                    value1, value2, value3)))

       For Each pairs As String In pairsCol
           Console.WriteLine(pairs)
           Console.WriteLine("------")
           MessageBox.Show(pairs)

       Next


01, 03, 04
01, 03, 05
01, 03, 08
01, 03, 13
01, 03, 24
01, 03, 35
01, 03, 44
01, 03, 49
01, 03, 55
01, 03, 77
01, 03, 88


PD: En el ejemplo de @Lekim lo harías añadiendo otro For para tener una nueva iteración con una nueva variable y utilizarla, esto es más o menos lo mismo, la cuestión es añadir.

Saludos
#3740
Cita de: luis456 en 22 Marzo 2016, 16:42 PM
:o :o :o :o :o :o :o tengo para meses jejjeje

luis

Me he dado cuenta que la función actual que tengo para realizar permutaciones no sirve para tu propósito, puesto que es para caracteres (me refiero, a strings de 1 caracter), y tu quieres hacer permutaciones de los elementos de un array (números de más de 1 dígito), así que ahora mismo no puedo enseñarte nada, por que me llevará su tiempo idear el nuevo algoritmo, lo siento, pero me pondré a ello, por que sería una función muy útil para tenerla siempre a mano.

De todas formas aquí te la dejo para que le heches un vistazo si quieres:
https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/v1.2/Elektro.Cryptography/Tools/CryptoUtil_Permutations.vb

Saludos