Shell   08-01-2023, 13:38
#1
Buenas!.

Este control tiene un menú flotante (aunque creo que se le llama de otra forma) cuando hacemos clic derecho sobre el.
Tenemos tres opciones. Eliminar color, eliminar colores, ordenar colores de forma descendente.

[Imagen: Y8iNSHf.png]

En el botón Mostrar Colores me muestra en consola el valor en decimal de cada color que se encuentra en la lista del ColorPalette.
Pero no entiendo el orden. ¿ Cómo se supone que ordena el array de colores ?.

Código:
Public Sub btnaddColor_Click()

  ColorPalette1.Add(ColorChooser1.Value)

End

Public Sub btnMostrarColores_Click()

  For j As Integer = 0 To ColorPalette1.Colors.Max
    Print ColorPalette1.Colors[j]
  Next

End

Public Sub Form_Open()

  Dim icolores As Integer[] = Settings["Colores"]

  ColorPalette1.Colors = If(IsNull(icolores), [&HFF0000, &H00FF00, &H0000FF], icolores)

End


Public Sub Form_Close()

  Settings["Colores"] = ColorPalette1.Colors

End


Esta es la lista que me crea a la salida por la consola:
 
Cita:16711834
16711935
10551551
255
39679
65535
65421
65280
11009792
16776960
16760832
16746240
16734464
16711680


Ya veo, ordena, pero no es un orden natural. Pues es como lo hace por defecto.
Un array de enteros solo se puede ordenar ascendente o descendente, no es como el de cadenas que tiene método de comparación.
Aun así los números no tienen un orden muy adecuado. Parecen más cadenas que números

Creando otro formulario en el mismo ejemplo, los números se mostraron así:

[Imagen: ToRa4bT.png]

Código:
Const NUMMAXIMOS As Integer = 10

Private numeros As New Integer[]
Private numerosca As New Integer[]
Private numeroscd As New Integer[]

Public Sub Form_Open()

  Randomize

  Me.Title = "Orden Ascendente y Descendente"
  For j As Integer = 0 To NUMMAXIMOS - 1
    numeros.Add(Rand(1, 10 ^ 8))
  Next

  numerosca = numeros.Copy().Sort(gb.Ascent)
  numeroscd = numeros.Copy().Sort(gb.Descent)

  With tblNumeros
    .AutoResize = True
    .Header = GridView.Both
    .Columns.Count = 3
    .Rows.Count = NUMMAXIMOS
    .Font = Font["Noto Mono, 11"]
    .Columns[0].Title = "Números"
    .Columns[0].Expand = True
    .Columns[0].Alignment = Align.Center
    .Columns[1].Title = "Ascendente"
    .Columns[1].Expand = True
    .Columns[1].Alignment = Align.Center
    .Columns[2].Title = "Descendente"
    .Columns[2].Expand = True
    .Columns[2].Alignment = Align.Center
  End With

End


Public Sub tblNumeros_Data(Row As Integer, Column As Integer)

  tblNumeros[Row, 0].Alignment = Align.Center
  tblNumeros[Row, 0].Text = numeros[Row]

  tblNumeros[Row, 1].Alignment = Align.Right
  tblNumeros[Row, 1].Text = numerosca[Row]

  tblNumeros[Row, 2].Alignment = Align.Right
  tblNumeros[Row, 2].Text = numeroscd[Row]

End

Public Sub btnSalir_Click()

  Me.Close

End


Saludos
Archivos adjuntos
.gz
EjemploControlesColoresEnGambas-0.0.1.tar.gz (Tamaño: 12.57 KB Descargas: 1)
Última modificación: 08-01-2023, 13:47 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Grandamakulo   08-01-2023, 19:50
#2
Creo que los ordena por luminosidad. Si extraes las propiedades de cada color, esto es, R, G, B, H, S, V, podrás ver por cuál de ellas los ordena. Si es lo que pienso, claro. A ver si tengo un rato y lo hago yo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Shell   09-01-2023, 01:07
#3
(08-01-2023, 19:50)Grandamakulo escribió: Creo que los ordena por luminosidad. Si extraes las propiedades de cada color, esto es, R, G, B, H, S, V, podrás ver por cuál de ellas los ordena.

Probablemente, pero no lo he comprobado lo suficiente.  Como es algo propio del control no resulta fácil a la primera.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   09-01-2023, 15:42
#4
La creación de los menus de la clase ColorPalette:

Código:
Public Sub View_Menu()

  If $bReadOnly Then Return

  If $iLastIndex < 0 Or If $iLastIndex >= $aColors.Count Then Return

  If Not mnuPopup Then

    mnuPopup = New Menu(Me.Window, True)

    mnuRemove = New Menu(mnuPopup) As "mnuRemove"
    mnuRemove.Text = ("Remove color")
    mnuRemove.Picture = Picture["icon:/small/delete"]

    mnuRemoveAll = New Menu(mnuPopup) As "mnuRemoveAll"
    mnuRemoveAll.Text = ("Remove all colors")
    mnuRemoveAll.Picture = Picture["icon:/small/clear"]

    mnuSort = New Menu(mnuPopup) As "mnuSort"
    mnuSort.Text = ("Sort colors")
    mnuSort.Picture = Picture["icon:/small/sort-ascent"]

  Endif

  mnuPopup.Popup

End

Y el evento Click del mnuSort.

Código:
Public Sub mnuSort_Click()

  Dim aSort As New String[]
  Dim iColor As Integer
  Dim sColor As String

  If $aColors.Count <= 1 Then Return

  For Each iColor In $aColors
    With Color[iColor]
      aSort.Add(Format(.Alpha, "000") & Format(.Hue, "000") & Format(.Saturation, "000") & Format(.Value, "000") & ":" & CStr(iColor))
    End With
  Next

  aSort.Sort(gb.Descent)
  $aColors.Clear
  For Each sColor In aSort
    $aColors.Add(CInt(Mid$(sColor, InStr(sColor, ":") + 1)))
  Next

  UpdateColors

End

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.