Página 1 de 1

[Resuelto]ListBox DropDown en Control de tabla

Publicado: Lun Nov 11, 2019 4:25 pm
por Longi
Buenas!

En https://forum.openoffice.org/es/forum/v ... 31&t=14367 pregunté cómo hacer que un listbox (o combobox) se desplegase al aplicar una macro (concretamente al recibir el foco).

El resultado fue este:

Código: Seleccionar todo

sub Drop_down_Listbox
    oController = thiscomponent.CurrentController
    oComboBox = thisComponent.drawpage.forms.getbyname("MainForm").getbyname("Gestion").GetByName("Tipo_Documento")
    oComboBoxControl = oController.getControl(oComboBox)  
    oComboBoxControl.AccessibleContext.doAccessibleAction(0)'drops it down
end sub
Funciona muy bien. Ahora mi atasco es cuando trabajo con un control de tablas y quiero aplicarlo a un listbox que hay en su interior. No consigo adaptar el código. Supongo que el elemento oController hace referencia al control de tablas (que es la casa de otros controles, entre ellos el listbox). No puedo (no sé) descender un nivel para que sea operativo en el interior del control de tablas.
Supongo que es una cosa mínima, pero le estoy dando vueltas y no lo he logrado por el momento. Tan solo he llegado a fijar el foco en la columna, pero no desplegar el listbox.
Si después de fijar el foco aplicamos 'Alt+Flechaabajo' conseguimos el desplegado. Eso es lo que querría simular con código.
Si alguien me echa una mano sería de agradecer.

Gracias y un saludo! ;)

Re: ListBox DropDown en Control de tabla

Publicado: Lun Nov 11, 2019 6:38 pm
por Longi
Buenas de nuevo!

Código: Seleccionar todo

    if CT.GEtByName("Area").BoundField.GetString="" Then

	oTableControl=ThisComponent.getCurrentController.getcontrol(CT)                         ' Nos hacemos con el modelo del control de tablas
    oTableControl.setFocus                                                                  ' Ponemos el foco en el control de tabla
    oTableControl.setCurrentColumnPosition(2)                                               ' Pone el foco en la columna Referencia
    Wait 100
    set oWSObj1 = CreateObject("WScript.Shell")                                                  ' Creamos el objeto
    oWSObj1.SendKeys ("%{down}")                                                                   ' Como que aplicamos una combinación de teclas Alt+DropDown
Con WScrip.Shell funciona, y me puede servir, pero si alguien conoce un método más elegante (vamos, propio de la suite, y que valga también para linux) estaría bien.

Gracias y otro saludo! ;)

De momento lo dejo abierto por si a alguien se le ocurre otra solución.

Re: ListBox DropDown en Control de tabla

Publicado: Mar Nov 12, 2019 7:05 pm
por mauricio
¿A que evento asignas la macro?

Re: ListBox DropDown en Control de tabla

Publicado: Mar Nov 12, 2019 7:33 pm
por mauricio
Si usas un ListBox directamente en un formulario, el mismo tiene la Interfaz XAccessibleAction [1], si usas el mismo control dentro de una tabla, no tiene esta interfaz, por lo que, como ya lo notaste, no puede usar el método "doAccessibleAction". Me temo que tendrás que usar el método que has descrito en tu segundo mensaje.

Ahora, ¿tienes algún control anidado?, ¿por que usas un doble getByName?

Código: Seleccionar todo

    oComboBox = thisComponent.drawpage.forms.getbyname("MainForm").getbyname("Gestion").GetByName("Tipo_Documento")
En vez de:

Código: Seleccionar todo

oComboBox = thisComponent.drawpage.forms.getbyname("MainForm").getByName("lst_country")
En mi experiencia, manejar los eventos de foco, debe ser sin modificar el foco, si no, corres el riesgo de entrar en un ciclo infinito, que es lo que obtengo, tanto con tu código, como con el siguiente que hace lo mismo:

Código: Seleccionar todo

Sub country_in_focus(event)
	obj = event.Source
	obj.AccessibleContext.doAccessibleAction(0)
End Sub
Cuando intento salir del control con tab, vuelve a mostrar el listado, tengo que usar Shift+Tab para poder dejar el control.

Saludos

[1]: https://api.libreoffice.org/docs/idl/re ... ction.html

Re: ListBox DropDown en Control de tabla

Publicado: Mié Nov 13, 2019 12:11 am
por Longi
Buenas!

Gracias por aclararme lo que me temía, que no tiene solución.
El código que usa dos veces getbyname era de otro ejemplo en el que tenía un combobox dentro de un subformulario, pero que no es el caso del actual hilo.
En este caso tengo el listbox en el interior de un control de tablas.
Lo estoy utilizando en 'Tras el cambio de registro de datos' del formulario que incluye el listbox, no sé si me van a funcionar simepre, pero de momento aguanta sin esos ciclos infinitos en los que tengo 'demasiada' experiencia por chapuzas (como puedes comprobar).
Gracias de nuevo y lo marco como resuelto.

Otro saludo! ;)