Grandamakulo   19-03-2025, 22:13
#1
Bueno, compañeros, gracias a las inestimables enseñanzas del Magister Draconis Venator, @Shordi, me he atrevido a montar mi primer control. Por supuesto, soy yo. No podía hacer uno sencillito, no: empezar por lo fácil es de pobres.
En fin, se trata de un gestor de doble lista, sobre el que se puede crear y eliminar elementos, pasar elementos de una lista a otra, ordenar cada lista según varios criterios y obtener un «Text» utilizable como , por ejemplo, editor en un Tableview. ¿Que para qué vale? Pues... seleccionar instrumentos para adecuar una plantilla de orquesta, banda o cámara; para seleccionar una lista de personajes para un capítulo de una novela de todos los existentes; para gestionar las plantas que se llevan del semillero al huerto; objetos del espacio profundo a observar una noche por un astrónomo... Ahí queda eso.

[Imagen: EoZayVwl.png]
[Imagen: 3LZFYCZl.png]

Aún le quedan flecos como:
¿Cómo narices se levanta un evento «Cambiar» similar al «Change» desde el formulario cada vez que se pulsa un grupo de botones?
¿Y cómo se crea un evento «Enter» similar al de Texbox?
¿Cómo releñes se puede usar una propiedad de la clase en el formulario?
Estas tres preguntas, creo, se contestan probablemente planteando de otra manera el código del control, esto es, llevando a la clase la gestión de algunos elementos del formulario.

En fin, se admiten comentarios, consejos y críticas destructivas.
Archivos adjuntos
.gz
DobleLista_02.tar.gz (Tamaño: 31.89 KB Descargas: 1)
Última modificación: 26-03-2025, 20:46 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Shordi   20-03-2025, 13:42
#2
Mira a ver si así te vale.
El evento Enter es un evento de ratón, así que supongo que te refieres al evento keypress con la tecla Enter... si no es así, dímelo y te lo apaño.

Saludos
Archivos adjuntos
.gz
DobleLista-0.1.tar.gz (Tamaño: 10.29 KB Descargas: 2)
Última modificación: 20-03-2025, 13:43 por Shordi.

No podemos regresar
Grandamakulo   20-03-2025, 14:07
#3
Creo que sí,  me lo estoy estudiando, jajaja Tongue Big Grin
¡¡Muchas gracias!!

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Shell   21-03-2025, 12:32
#4
Es muy universal este control. En su día yo pasaba fotos de modelos de una lista a otra. Blush

[Imagen: 9gJtQ2Vl.png]

Pero usaba ListView. Tiene más cosas que un Listbox y puedes añadir imágenes.
Por otra parte usaba Drag Drop y además seleccionaba varias imágenes y pasarlas
de un lado a otro. Eso lo puedes hacer en un ListBox. Si te interesa imágenes ya sabes, ListView.

Saludos
Última modificación: 21-03-2025, 12:32 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Grandamakulo   24-03-2025, 22:11
#5
¡Mucahs gracias, @Shell!

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Grandamakulo   24-03-2025, 23:33
#6
¡Mucahs gracias, @Shell!

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Grandamakulo   25-03-2025, 18:06
#7
Bueno, @Shordi, las dos primeras dudas, aclaradas y funcionando perfectamente. En cuanto a la tercera, a ver si me sé explicar y no soy tan farragoso como siempre.
¿Cómo releñes se puede usar una propiedad de la clase en el formulario?
Defino una propiedad llamada ListaSel, que es un Boolean y que vale False —por defecto— para seleccionar la lsoListaUno y True para seleccionar la lsoListaDos. En el código del formulario del control —doblelista es la clase y fdoblelista el formulario— necesito emplear esa propiedad para seleccionar sobre qué lista se realizan determinadas acciones. Por ejemplo, para añadir un texto en la lista seleccionada pulsando sobre el botón «Añadir» en el evento:
Código:
Public Sub tobAnadir_Click() 
  Dim sDonde As String      ' Nombre de la lista donde se va a añadir'
  Dim sQue As String        ' Texto del ítem a añadir'
  Dim asPaso As String[]    ' Matriz de cadenas para trabajar'
   If ListaSel = No Then
     asPaso = lsoDos.List
     sDonde = frmDos.Text
     Else
     asPaso = lsoUno.List
     sDonde = frmUno.Text
   Endif
[...]

Aquí he puesto ListaSel tal cual, pero me dice que no está definida; si escribo doblelista.ListaSel, tampoco —amén de que se me hace extrañísimo—. ¿Cómo la «llamo o la «invoco» —¡¡¡ListaSel!!!, si estás ahí, manifiéstate, jajaja—?
Bueno, y por supuestísimo, muchas gracias.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Shordi   25-03-2025, 20:05
#8
En este tipo de controles puedes considerar que el formulario es la verdadera clase, en tanto que la clase exportada es el "interfaz" para manejarlo. Así, la propiedad no ha de ser definida en la clase, sino en el formulario y manejada desde la clase. En el ejemplo que te adjunto verás que en la clase tienes:
Código:
'En la declaración '
Property ListaSel As Boolean 
...
...
' y al final del archivo '

Private Function ListaSel_Read() As Boolean

  Return $fdoblelista.listasel

End

Private Sub ListaSel_Write(Value As Boolean)

  $fdoblelista.ListaSel = Value

End

Por el otro lado en el formulario tienes
Código:
'En la declaración'
Property listasel As Boolean
Private $listasel As Boolean = False
...
...
'Y más abajo '

Private Function listasel_Read() As Boolean

  Return $listasel

End

Private Sub listasel_Write(Value As Boolean)

  $listasel = Value
  If Value Then
    lsoUno.SetFocus
  Else
    lsoDos.SetFocus
  Endif

End

En el formulario fTest he usado un ToggleButton para cambiar de una a otra. El aspecto es este:

[Imagen: 86egiOSl.png]

He de decir que no me gusta la lógica del boolean para la propiedad. Me parece mucho más coherente y nemotécnico si le asignas un valor numérico de 1 por defecto y de 2 al cambiar. También lo llamaría ListaActiva en lugar de ListaSel.

Y por último y sólo por curiosidad: ¿Por qué colocas las listas dentro de dos frames si luego no les pones título (que es para lo que sirven las frames)?

Saludos
Archivos adjuntos
.gz
DobleLista-0.2.tar.gz (Tamaño: 10.71 KB Descargas: 1)
Última modificación: 25-03-2025, 20:06 por Shordi.

No podemos regresar
Grandamakulo   25-03-2025, 21:26
#9
Tomo nota de todo y a currar.
En cuanto a la pregunta, precisamente dos de las propiedades del control son los títulos de las listas. De esta manera se pueden cambiar desde el código:
Código:
> Property TituloUno As String    ' Título o nombre de la primera lista.' <
> Property TituloDos As String    ' Título o nombre de la segunda lista.' <
  Property ListaUno As String[]  ' Contenido de la primera lista.'
  Property ListaDos As String[]  ' Contenido de la segunda lista.'
  Property ListaSel As Boolean    ' <p><b>False:</b> por defecto, las acciones se realizan sobre la segunda lista. <p><b>True</b>: las acciones se realizan sobre la primera lista.<p>Estas acciones son <b>«Añadir»</b> o <b>«Eliminar»</b> elementos y también activar el contenido de la propiedad <b>«Text»</b>.'
  Property Text As String        ' Devuelve una sola cadena alfanumérica con el contenido de la lista seleccionada por <b>«ListaSel»</b> como la suma de todos los elementos separados por un salto de línea. Ideal para pasar datos al editor de un Tableview, por ejemplo.'
¡Muchas gracias!
Última modificación: 25-03-2025, 21:28 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Grandamakulo   26-03-2025, 20:41
#10
Vale, código actualizado con todas las indicaciones de @Shordi.
Creo que podría hacer un control similar con ListView, tal como indica @Shell, pero lo dejo para más delante  Angel Big Grin
En fin, gracias a ambos.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.