[RESUELTO] Problema para cerrar un dialogo

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
yamita
Mensajes: 40
Registrado: Lun Feb 03, 2014 4:22 am

[RESUELTO] Problema para cerrar un dialogo

Mensaje por yamita »

Miren estas son las macros en las que he estado trabajando , ya casi funcionan, todavia no se como hacer para que me deje seleccionar uno de todos los botones de opción (solo deja escoger el primero), para probarlo tienen que abrir varios documentos de en odt¿Cómo puedo resolver esto?. Creen un dialogo con 3 botones, aceptar, cancelar y buscar, a este ultimo le asocian la macro AbrirOtroDoc para el evento de raton soltado, y la macro CerrarDialogo para el evento botón presionado. Cuando presionan buscar el proceso lo hace a medias, o sea que no me deja cerrar el dialogo , lo intente de varias formas, incluyendo esta que les muestro con el método Endexecute() pero no funciona, quizas es que estoy haciendo algo mal :ucrazy: .¿Alguna sugerencia?.... ESpero que si... Gracias de todos modos

Código: Seleccionar todo

sub VerDocEnParalelo
Dim DocSeleccionado As Object
Dim docActual As Object
Dim xArgs()
Dim botonPres As Boolean
'Aqui estoy cogiendo el documento actual, desde donde llamo la macro
 docActual= ThisComponent.CurrentController.Frame.ContainerWindow
'docActual.setfocus()
 botonPres = MostrarDocEnDialogo 
 If botonPres = 0 Then
 exit sub
 end if
'docActual.setFocus()
'DocSeleccionado.setFocus()
'docActual.setFocus()
'le digo al documento que se maximice
docActual.IsMaximized = false
'Me devuelve la posicion del documento actual
Tamanno = docActual.GetPosSize
' le digo a la var que coja el ancho y lo modifique a la mitad
Tamanno.Width = (Tamanno.Width/2)
'le digo a la cordenada x del marco que sea en la mitad(del medio hacia la derecha)
Tamanno.X = Tamanno.Width 
' le digo a la cordenada y que se mantenga en cero
Tamanno.Y = 0
'le digo al marco que se pueda modificar
docActual.FloatingMode = False
Tamanno.Width = Tamanno.Width '+120

'GlobalScope.BasicLibraries.loadLibrary("XrayTool")
'xray docActual
'Modifico el marco con los datos anteriores
docActual.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height,15)

' ahora empiezo a trabajar con el segundo documento

'GlobalScope.BasicLibraries.loadLibrary("XrayTool")
'xray DocSeleccionado

end sub



Function MostrarDocEnDialogo As Variant
'-----------------------------------------------------------------------------------------
' devuelve una matriz con el titulo de todos los documentos abiertos
  Dim NombresDoc() As String
  Dim cadena AS String
  Dim DocEnum As Object
  Dim cont As Integer
  Dim DocActual as Object
  Dim Abiertos As Object
  Dim oDocumentos As Object
  Dim oDocumento As Object
  Dim oVentana As Object
  Dim oEnumeraDocumentos As Object
  Dim Doc2 As Object
  Dim ocmdBoton aS Object
  Dim ruta As Variant
 'Aqui guardo los doc abiertos en el momento
  Abiertos = StarDesktop.getComponents()
  
  
'Enumero los doc para acceder a cada uno de ellos
  DocEnum = Abiertos.CreateEnumeration()
  	'GlobalScope.BasicLibraries.loadLibrary("XrayTool")
    'xray DocEnum
 'ciclo para recoger cada documento abierto
  Do While DocEnum.hasMoreElements()
    DocActual = DocEnum.NextElement()
    Redim Preserve NombresDoc(cont)
    NombresDoc(cont) = DocActual.Title
    'incremento el contador
    cont = cont + 1
    'Guardo el titulo del doc actual
    cadena = cadena + DocActual.Title + "      "
   ' msgbox oDoc.Title
  Loop
 ' msgbox cadena
DialogLibraries.LoadLibrary( "Standard" ) 
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.DialogoTesis ) 
oDialog1.Title = "Escoja el documento que desea abrir"
oModel = oDialog1.Model
ocmdBoton =oDialog1.getControl("CommandButton3")
'ocmdBoton.Model.
    With ocmdBoton.Model
		.PushButtonType = 0	'Tipo de botón 2 = Buscar
		'.ImageURL = ConvertToUrl("/home/yamita/Escritorio/lupa1.png")
		'.PushButtonType = 
	End With
Dim y(15) as integer
for j = 0 to 15
   y(j) = 12 * (j + 1)
next j
For i = 0 to UBOUND(NombresDoc)
   oBoton = oModel.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
   oBoton.Height = 50
   oBoton.Width = 80
   oBoton.Label = NombresDoc(i)
   oBoton.PositionX = 10 + 90 * int(i/10)
   oBoton.PositionY = y(i MOD 10)
   oModel.insertByName(NombresDoc(i), oBoton)
next i

Res=oDialog1.execute()
odialog1.dispose()
  Select Case Res
		Case 0 
		        oDialog1.dispose()
		        MostrarDocEnDialogo = Res
		        exit Function
		Case 1 
		 		 'Msgbox "funciona"

             Controls = oModel.getControlModels
             for i = 0 to UBOUND(Controls)
                  control = Controls(i)
                  if control.supportsService("com.sun.star.awt.UnoControlRadioButtonModel") then
                     if control.State = 1 then
         	            oDocumentos = StarDesktop.getComponents()
	'Enumero cada uno
	                    oEnumeraDocumentos = oDocumentos.createEnumeration()
	'hasMoreElements devuelve verdadero (True) mientras haya elementos
	                    Do While oEnumeraDocumentos.hasMoreElements()
		'me muevo para el otro elemento y lo asigno
		                    oDocumento = oEnumeraDocumentos.nextElement()
		'Cojo la ventana
		                     if control.label = oDocumento.Title then
		                         oVentana = oDocumento.CurrentController.Frame.ContainerWindow
		                         oVentana.IsMaximized = False
' cojo la posicion del doc con cordenadas y todo 
                                 Tamanno =oVentana.GetPosSize
                                 Tamanno.Width = (Tamanno.Width / 2)
                                 Tamanno.Height = Tamanno.Height 
'pongo el doc en la cordenada 0;0 a la izquierda
                                 Tamanno.X = 0
                                 Tamanno.Y = 0
                                 oVentana.FloatingMode =True
'modifico el doc
                                 oVentana.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height, 15)
		                         exit Do
	
		'Le eenvio el foco pa activarla
		'oVentana.setFocus()	         
                             end if
                         loop
       
                         exit for
                       end if
                       
                   end if
      
               next i
               'case else
                         'sRuta=Res
                    '	oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
                    	'if oDoc.supportsService("com.sun.star.text.TextDocument") then
		                       'oDoc2= oDoc.CurrentController.Frame.ContainerWindow
		                      ' oDoc2.IsMaximized = False
' cojo la posicion del doc con cordenadas y todo 
                              ' Tamanno =oDoc2.GetPosSize
                               'Tamanno.Width = (Tamanno.Width / 2)
                               'Tamanno.Height = Tamanno.Height 
'pongo el doc en la cordenada 0;0 a la izquierda
                              ' Tamanno.X = 0
                              ' Tamanno.Y = 0
                              ' oDoc2.FloatingMode =True
'modifico el doc
                               'oDoc2.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height, 15)
                     ' end if
                   
                    
                    
                               
End Select
   
    MostrarDocEnDialogo = Res
   
 
End Function
   
sub AbrirOtroDoc 
   Dim oDlgAbrirArchivo as Object
   Dim mArchivo() As String
   Dim mOpciones()
   Dim sRuta As String
   Dim oDoc As Object
   Dim oDoc2 As Object
  	'Creo el servicio necesario
	oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
	' el titulo del cuadro de dialogo
	oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
	'Con el método .Execute() pa mostrar el cuadro de dialogo
	'Si el usuario presiona Abrir el método devuelve 1 (True)
	'Si presiona Cancelar devuelve 0
	If oDlgAbrirArchivo.Execute() Then
	   
	' solo se puede seleccionar un archivo
		'pero devuelve una matriz de todos modos con la ruta completa
		'del archivo en formato URL
		mArchivo() = oDlgAbrirArchivo.getFiles()
		'El primer elemento de la matriz es el archivo seleccionado
		sRuta = mArchivo(0)
		'AbrirOtroDoc=sRuta
		'lo abro
		
		oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
		oDoc2= oDoc.CurrentController.Frame.ContainerWindow
		oDoc2.IsMaximized = False
' cojo la posicion del doc con cordenadas y todo 
                                 Tamanno =oDoc2.GetPosSize
                                 Tamanno.Width = (Tamanno.Width / 2)
                                 Tamanno.Height = Tamanno.Height 
'pongo el doc en la cordenada 0;0 a la izquierda
                                 Tamanno.X = 0
                                 Tamanno.Y = 0
                                 oDoc2.FloatingMode =True
'modifico el doc
                                 oDoc2.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height, 15)
	Else
		'Si el usr presiona Cancelar
		MsgBox "Proceso cancelado"
	End If

 end sub
 
 Sub CerrarDialogo
    DialogLibraries.LoadLibrary( "Standard" )
	oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("DialogoTesis") )
	oDialogo.endExecute()
End Sub
Última edición por fornelasa el Lun May 05, 2014 8:55 pm, editado 3 veces en total.
Razón: Colocar [RESUELTO] correctamente.
LibreOffice 4.2 Nova
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Problema para cerrar un dialogo

Mensaje por fornelasa »

Suponiendo que todo funcionara bien, si asignas la macro "CerrarDialogo" al evento "botón presionado" entonces el dialogo en cuestión se cerrará y nunca podrás llegar al evento "ratón soltado".

Ahora sin suponer y hablando de lo que tienes: ¿deseas que el dialogo al recibir el evento "ratón soltado" haga su proceso normal y ademas al final del proceso también cierre el dialogo? o ¿deseas tener el control del dialogo y decidir tú el momento en que el dialogo se cerrara?

Primer caso:
Agrega esta linea sólita al inicio del modulo, al inicio del modulo no al inicio de ninguna macro.

Código: Seleccionar todo

Dim oDialog1 As Object 
Modifica la macro "CerrarDialogo" para que quede así y asignala al evento "Ratón fuera" (obvio debemos borrar al evento "botón presionado")

Código: Seleccionar todo

Sub CerrarDialogo
    oDialog1.endExecute()   
End Sub
Segundo caso:
No necesitamos la macro "CerrarDialogo" ni el evento "Ratón fuera" ya que con solo pulsar el tachecito del propio Dialogo este se cerrará.

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
yamita
Mensajes: 40
Registrado: Lun Feb 03, 2014 4:22 am

Re: Problema para cerrar un dialogo

Mensaje por yamita »

Perfecto, utilice la primera opción, y funciona a la perfección, junto a unos arrglitos más, ¿ y la parte de que solo me permite marcar el primer botón de opciones?, o sea que ya hice que me mostrara todos los docummentos abierttos, para escoger uno pero solo puedo marcar el primero, es como si me desabilitara el resto de los botones de opción, pero en ninguna parte del código le digo que haga eso. Gracias
Pongo el código para si alguien lo necesita luego

Código: Seleccionar todo

Dim oDialog1 As Object
Dim val As Integer

sub VerDocEnParalelo
Dim DocSeleccionado As Object
Dim docActual As Object
Dim xArgs()
Dim botonPres As Boolean
val=0
'Aqui estoy cogiendo el documento actual, desde donde llamo la macro
 docActual= ThisComponent.CurrentController.Frame.ContainerWindow
'docActual.setfocus()
 botonPres = MostrarDocEnDialogo 
 If botonPres = 0 and val =0 Then
 exit sub
 end if

'le digo al documento que se maximice
docActual.IsMaximized = false
'Me devuelve la posicion del documento actual
Tamanno = docActual.GetPosSize
' le digo a la var que coja el ancho y lo modifique a la mitad
Tamanno.Width = (Tamanno.Width/2)
'le digo a la cordenada x del marco que sea en la mitad(del medio hacia la derecha)
Tamanno.X = Tamanno.Width 
' le digo a la cordenada y que se mantenga en cero
Tamanno.Y = 0
'le digo al marco que se pueda modificar
docActual.FloatingMode = False
Tamanno.Width = Tamanno.Width '+120

'GlobalScope.BasicLibraries.loadLibrary("XrayTool")
'xray docActual
'Modifico el marco con los datos anteriores
docActual.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height,15)

' ahora empiezo a trabajar con el segundo documento

'GlobalScope.BasicLibraries.loadLibrary("XrayTool")
'xray DocSeleccionado
'end if 
end sub



Function MostrarDocEnDialogo As integer
'-----------------------------------------------------------------------------------------
' devuelve una matriz con el titulo de todos los documentos abiertos
  Dim NombresDoc() As String
  Dim cadena AS String
  Dim DocEnum As Object
  Dim cont As Integer
  Dim DocActual as Object
  Dim Abiertos As Object
  Dim oDocumentos As Object
  Dim oDocumento As Object
  Dim oVentana As Object
  Dim oEnumeraDocumentos As Object
  Dim Doc2 As Object
  Dim ocmdBoton aS Object
  Dim ruta As Variant
  Dim contadorNoMarcados as integer
  Dim contadorRadios as integer
  contadorNoMarcados=0
  contadorRadios=0
 'Aqui guardo los doc abiertos en el momento
  Abiertos = StarDesktop.getComponents()
  
  
'Enumero los doc para acceder a cada uno de ellos
  DocEnum = Abiertos.CreateEnumeration()
  	'GlobalScope.BasicLibraries.loadLibrary("XrayTool")
    'xray DocEnum
 'ciclo para recoger cada documento abierto
  Do While DocEnum.hasMoreElements()
    DocActual = DocEnum.NextElement()
    Redim Preserve NombresDoc(cont)
    NombresDoc(cont) = DocActual.Title
    'incremento el contador
    cont = cont + 1
    'Guardo el titulo del doc actual
    cadena = cadena + DocActual.Title + "      "
   ' msgbox oDoc.Title
  Loop
 ' msgbox cadena
DialogLibraries.LoadLibrary( "Standard" ) 
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.DialogoTesis ) 
oDialog1.Title = "Escoja el documento que desea abrir"
oModel = oDialog1.Model
ocmdBoton =oDialog1.getControl("CommandButton3")
'............................................................
' esto es para k pinche el aceptar solo si hay botones en 1
'boton=oDialog1.getControl( "CommandButton1")
'boton.Model.Enabled= false
'................................................................
'ocmdBoton.Model.
    With ocmdBoton.Model
		.PushButtonType = 0	'Tipo de botón 2 = Buscar
		'.ImageURL = ConvertToUrl("/home/yamita/Escritorio/lupa1.png")
		'.PushButtonType = 
	End With
Dim y(15) as integer
for j = 0 to 15
   y(j) = 12 * (j + 1)
next j
For i = 0 to UBOUND(NombresDoc)
   oBoton = oModel.createInstance("com.sun.star.awt.UnoControlRadioButtonModel")
   oBoton.Height = 50
   oBoton.Width = 80
   oBoton.Label = NombresDoc(i)
   oBoton.PositionX = 10 + 90 * int(i/10)
   oBoton.PositionY = y(i MOD 10)
   oModel.insertByName(NombresDoc(i), oBoton)
  
next i

res = oDialog1.execute()
'odialog1.dispose()
   select case res
       case 0 
	 
		   
		        MostrarDocEnDialogo = res
		        exit Function
		
	   case 1  
		 		 'Msgbox "funciona"

             Controls = oModel.getControlModels
             for i = 0 to UBOUND(Controls)
                  control = Controls(i)
                  if control.supportsService("com.sun.star.awt.UnoControlRadioButtonModel") then
                  contadorRadios=contadorRadios+1
                      if control.State = 0 then
                      contadorNoMarcados=contador+1
                      end if
                     if control.State = 1 then
                    
                        oDocumentos = StarDesktop.getComponents()
	'Enumero cada uno
	                    oEnumeraDocumentos = oDocumentos.createEnumeration()
	'hasMoreElements devuelve verdadero (True) mientras haya elementos
	                     Do While oEnumeraDocumentos.hasMoreElements()
		'me muevo para el otro elemento y lo asigno
		                    oDocumento = oEnumeraDocumentos.nextElement()
		'Cojo la ventana
		                     if control.label = oDocumento.Title then
		                         oVentana = oDocumento.CurrentController.Frame.ContainerWindow
		                         oVentana.IsMaximized = False
' cojo la posicion del doc con cordenadas y todo 
                                 Tamanno =oVentana.GetPosSize
                                 Tamanno.Width = (Tamanno.Width / 2)
                                 Tamanno.Height = Tamanno.Height 
'pongo el doc en la cordenada 0;0 a la izquierda
                                 Tamanno.X = 0
                                 Tamanno.Y = 0
                                 oVentana.FloatingMode =True
'modifico el doc
                                 oVentana.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height, 15)
		                         exit Do
	
		'Le eenvio el foco pa activarla
		'oVentana.setFocus()	         
                             end if
                         loop
       
                         exit for
                       end if
                       
                   end if
      
               next i
   end select
MostrarDocEnDialogo = res
End Function
  
sub AbrirOtroDoc as boolean
   Dim oDlgAbrirArchivo as Object
   Dim mArchivo() As String
   Dim mOpciones()
   Dim sRuta As String
   Dim oDoc As Object
   Dim oDoc2 As Object
  	'Creo el servicio necesario
	oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
	' el titulo del cuadro de dialogo
	oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
	'Con el método .Execute() pa mostrar el cuadro de dialogo
	'Si el usuario presiona Abrir el método devuelve 1 (True)
	'Si presiona Cancelar devuelve 0
	If oDlgAbrirArchivo.Execute() Then
  	  Redim Preserve val
  	  val=2
	   
	' solo se puede seleccionar un archivo
		'pero devuelve una matriz de todos modos con la ruta completa
		'del archivo en formato URL
		mArchivo() = oDlgAbrirArchivo.getFiles()
		'El primer elemento de la matriz es el archivo seleccionado
		sRuta = mArchivo(0)
		'AbrirOtroDoc=sRuta
		'lo abro
		oDialog1.endExecute()
		oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
		oDoc2= oDoc.CurrentController.Frame.ContainerWindow
		oDoc2.IsMaximized = False
' cojo la posicion del doc con cordenadas y todo 
                                 Tamanno =oDoc2.GetPosSize
                                 Tamanno.Width = (Tamanno.Width / 2)
                                 Tamanno.Height = Tamanno.Height 
'pongo el doc en la cordenada 0;0 a la izquierda
                                 Tamanno.X = 0
                                 Tamanno.Y = 0
                                 oDoc2.FloatingMode =True
'modifico el doc
                                 oDoc2.SetPosSize( Tamanno.X, Tamanno.Y, Tamanno.Width, Tamanno.Height, 15)
	Else
		'Si el usr presiona Cancelar
			MsgBox "Proceso cancelado"
				
	End If
	
	
 end sub
Última edición por mauricio el Vie May 02, 2014 9:22 pm, editado 1 vez en total.
Razón: Usar etiquetas CODE
LibreOffice 4.2 Nova
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Problema para cerrar un dialogo

Mensaje por mauricio »

Por favor, usa las etiquetas CODE para una mejor lectura del código...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
yamita
Mensajes: 40
Registrado: Lun Feb 03, 2014 4:22 am

Re: Problema para cerrar un dialogo

Mensaje por yamita »

Diculpe por el reguero en el código, cuales son las etiquetas CODE?? Gracias
LibreOffice 4.2 Nova
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Problema para cerrar un dialogo

Mensaje por SLV-es »

Hola

Se ha agregado un nuevo apartado a la guía de supervivencia, para ayudar a los usuarios a conocer el modo de utilizar las etiquetas

Código: Seleccionar todo


Consulta [b][rel=viewtopic.php?f=3&t=795&p=41325#p41325]este hilo[/rel][/b]

Saludos
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Problema para cerrar un dialogo

Mensaje por fornelasa »

¿ y la parte de que solo me permite marcar el primer botón de opciones?,
Yo lo haría así:
A) Manualmente en el cuadro de dialogo "oDialog1" crearía y acomodaría por ejemplo 10 OptionButtons con la propiedad "nombre" como "Button1", "Button2", "Button3", "Button4", "ButtonN" con la propiedad "Visible" = Si
B) En mi macro crearía un bucle For para asignar a los 10 botones la propiedad Visible = False

Código: Seleccionar todo

For c = 1 To 10
oDialog1.GetControl("Button" & c).Visible = False
Next
C) Modificaría la macro que tu hiciste por la siguiente:

Código: Seleccionar todo

For i = 0 to UBOUND(NombresDoc)
   Boton = oDialog1.GetControl("Button" & i + 1)
   Boton.Visible = True
   Boton.Label = NombresDoc(i)   
next i
Ejecuto el dialogo y listo:

Código: Seleccionar todo

oDialog1.execute()
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
yamita
Mensajes: 40
Registrado: Lun Feb 03, 2014 4:22 am

Re: Problema para cerrar un dialogo

Mensaje por yamita »

:bravo: Super, ya lo hice y me funciona bien, muchisimas gracias, ahora voy a continuar con lo que les comente de la barra de scroll. :bravo:
LibreOffice 4.2 Nova
Responder