Pannello di Controllo Moderatore ]

[Risolto] Assegnare Macro con Macro

Creare una macro - Scrivere uno script - Usare le API

[Risolto] Assegnare Macro con Macro

Messaggioda fizapol » venerdì 8 novembre 2013, 14:49

Tanto per cominciare (è il mio primo 'post' ...) un Saluto a tutto il Forum e a tutta la Comunità!

Sarei molto felice se qualcuno mi aiutasse a trovare il modo di modificare "globalmente" l'assegnazione della stessa Macro a 15 Caselle di Controllo (da "CC_1" a "CC_15") in un Formulario di Calc (all'Evento "Stato Modificato"), senza cioè dover ripetere per 15 volte da desktop la trafila Proprietà>Eventi>Azione>Selettore>Libreria>Modulo>Macro ... :(

Il tutto potrebbe presentarsi così:

Sub RE_ASS
Dim oFormulario As Object
Dim obj As Object
Dim co1 As Integer
Dim sCC_N As String

oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName("Formulario")

For co1 = 1 To 15
sCC_N = "CC_" & co1
obj = oFormulario.getByName(sCC_N)

' Codice che reindirizzi l'assegnazione per l'evento "Stato Modificato"
' da Standard.OPZ_CC.OPZ_CC (document, Basic)
' a LamLib.B_Run.OPZ_CC (document, Basic)

Next co1

End Sub


... ma nemmeno nelle "Bibbie" di Andrew D. Pitonyak e di Mauricio Baeza Servin ho trovato qualcosa che potesse rimpiazzare le righe sotto apice...

Grazie ...
Ultima modifica di fizapol il lunedì 11 novembre 2013, 19:46, modificato 1 volta in totale.
OpenOffice4 .0 su Windows 8
fizapol
 
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 13:37

Re: Assegnare Macro con Macro

Messaggioda unlucky83 » sabato 9 novembre 2013, 22:55

seguirò questa discussione con molta attenzione, perchè durante lo sviluppo di un progetto che adopera numerose macro ho il vizio di iniziare a scriverle tutte all'interno di un modulo e/o con nomi bizzarri, poi quando inizio a rinominare le singole macro e ordinarle in moduli, sistematicamente mi sale lo sconforto perchè devo riassegnare le macro agli eventi.
Al momento ho fatto una finestra di dialogo multi-step, per esempio, con numerosi checkbox per pagina,ciascuno dei quali ha assosciato la stessa identica macro e anch'io mi chiedo...c'è un modo per implementare un algoritmo che agevoli l'assegnazione della macro rinominata all'evento?
LibO5.1.6.2-Ubuntu 16.04.2 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio
Avatar utente
unlucky83
Volontario
Volontario
 
Messaggi: 1756
Iscritto il: lunedì 7 gennaio 2013, 2:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggioda unlucky83 » domenica 10 novembre 2013, 0:23

Prendendo spunto da queste guide:
https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Basic/Listeners
https://wiki.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Document_Events
credo che la strada sia quella di creare un ascoltatore per ciascun evento, cioè una cosa del genere:
Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub RegisterListener

    oListener = CreateUnoListener( "DocumentListener_","com.sun.star.document.XEventListener" )

    ThisComponent.com_sun_star_document_XEventBroadcaster_addEventListener( oListener )

  End Sub

  Sub DocumentListener_notifyEvent( o as object )

    IF o.EventName = "OnPrepareUnload" THEN
          print o.Source.URL
    ENDIF

  end sub

  Sub DocumentListener_disposing()
  End Sub


se per controlli differenti devi associare macro differenti allo stesso tipo di evento, allora l'ascoltatore deve distinguere il campo di controllo, quindi devi usare una cosa del tipo:
Codice: Seleziona tutto   Espandi visualeStringi visuale
o.Source.Model.Name

per risalire al campo di controllo che ha "attivato" l'evento

Sono sicuro al 99% che la strada sia questa, peccato che ho trovato solo il servizio degli eventi del documento
Codice: Seleziona tutto   Espandi visualeStringi visuale
http://www.openoffice.org/api/docs/common/ref/com/sun/star/document/Events.html


Se qualcuno ha idee migliori o suggerimenti si faccia vivo ;)
LibO5.1.6.2-Ubuntu 16.04.2 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio
Avatar utente
unlucky83
Volontario
Volontario
 
Messaggi: 1756
Iscritto il: lunedì 7 gennaio 2013, 2:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggioda unlucky83 » domenica 10 novembre 2013, 2:33

Ho trovato la soluzione al mio problema.La riporto e poi allego i collegamenti alle pagine web che mi hanno permesso di arrivarci:
Codice: Seleziona tutto   Espandi visualeStringi visuale
sub registracheckbox
x=oDlg1.getControls()                                'oDlg1 è la finestra di dialogo
for iCntrl = LBound(x) To UBound(x)            ' FOR SUGLI ELEMENTI DELLA FINESTRA DI DIALOGO
  oCntrl = x(iCntrl)
  if instr(oCntrl.Model.Name,"CheckBox")<>0 then     'di tutti gli elementi mi interessano i CheckBox**
       addCBListener(oCntrl)
  end if
next
end sub

Public Function addCBListener (oCB as Object)
     oListener = CreateUnoListener( "CheckBoxListener_","com.sun.star.awt.XItemListener" )
     oCB.addItemListener( oListener )
End Function

Sub CheckBoxListener_itemStateChanged( o as object )
  msgbox o.Source.Model.Name
'in questo punto con un select case possiamo far eseguire operazioni diverse ai checkbox
end sub


La pagina che mi ha fatto superare l'ostacolo è:
http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/XCheckBox.html

Da qui, sono giunto a
http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/XItemListener.html

Quindi per altri elementi di controllo si può seguire una procedura del tutto simile e il gioco è fatto


p.s.
fino ad oggi non ho mai capito come funzionasse il CreateUnoListener, quest'altra pagina invece me lo ha fatto capire:
https://help.libreoffice.org/Basic/CreateUnoListener_Function_Runtime/it
LibO5.1.6.2-Ubuntu 16.04.2 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio
Avatar utente
unlucky83
Volontario
Volontario
 
Messaggi: 1756
Iscritto il: lunedì 7 gennaio 2013, 2:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggioda fizapol » domenica 10 novembre 2013, 13:06

Mi pare che unlucky83 abbia svolto un OTTIMO Lavoro!!!
(... oltretutto in orari in cui chi scrive "se la dorme" ed altri si "fulminano" nelle discoteche!...)

Cerco di fare un riepilogo per (soprattutto mia) chiarezza:

Dal momento che, per quanto riguarda gli eventi, "...OpenOffice.org Basic does not support the concept of object implementation...", cioè una via diretta per accedere agli eventi associati ad un particolare oggetto, è necessario predisporre, con la funzione a livello di RunTime CreateUnoListener delle apposite "sentinelle" (Listeners) che, una volta associate al Tipo di oggetto add[Tipo]Listener (...ma di questo non sono sicuro...) intercettino l'evento per poi ricondurlo all'oggetto specifico [Oggetto].Source.Model.Name che lo ha generato. Una volta "smascherato il responsabile" sarà agevole impostare le opportune istruzioni condizionali con relative chiamate di Routine.

Sperando di non aver detto troppe "scemenze", ringrazio unlucky83 e mi ripropongo di intervenire nuovamente dopo aver approfondito l'argomento (... in particolare dopo aver verificato se tale via prevalga sull'assegnazione fatta a livello di Desktop o viceversa...)

Grazie ed un Saluto a Tutti!
OpenOffice4 .0 su Windows 8
fizapol
 
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 13:37

Re: Assegnare Macro con Macro

Messaggioda unlucky83 » domenica 10 novembre 2013, 15:32

Grazie per l'aggettivo ottimo ;)
Se per te vale come soluzione la mia proposta, metti "Risolto" nel titolo del messaggio con cui hai aperto questa discussione, grazie
Saluti a te fizapol

p.s.
hai fatto bene a sintetizzare il tutto :super:
LibO5.1.6.2-Ubuntu 16.04.2 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio
Avatar utente
unlucky83
Volontario
Volontario
 
Messaggi: 1756
Iscritto il: lunedì 7 gennaio 2013, 2:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggioda unlucky83 » lunedì 11 novembre 2013, 2:48

riprovando le mie macro mi sono accorto di una errore:
alla chiusura della macro principale,ovvero quella che apre e chiude il dialogo, si apre in automatico l'editor delle macro, ma sulla libreria "Tutto" di Openoffice.
Ho risolto aggiungendo la seguente macro al modulo:
Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub CheckBoxListener_disposing( o as object )
end sub

Questo credo sia tutto sugli eventi dei checkbox delle finestre di dialogo :ouch:
LibO5.1.6.2-Ubuntu 16.04.2 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio
Avatar utente
unlucky83
Volontario
Volontario
 
Messaggi: 1756
Iscritto il: lunedì 7 gennaio 2013, 2:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggioda fizapol » lunedì 11 novembre 2013, 19:45

Per mia sfortuna il metodo proposto da unlucky83 (per quanto brillante ed istruttivo) non è risultato applicabile al mio caso, in quanto i CheckBox dei Formulari non supportano l'interfaccia com.sun.star.awt.XCheckBox ...
Tuttavia, come spesso ho sperimentato in questi ultimi due mesi in cui mi sono esercitato in OOBasic, ci sono vie "traverse" per arrivare alla soluzione ...
In particolare ho sfruttato il fatto che le CC_ da 1 a 15 erano già collegate a Ranghi "monocella" nominati OC_ da 1 a 15 ...
Adattando quanto trovato in:
viewtopic.php?f=26&t=3532&sid=03584965c940b2831516a223d27bf65f#p16414

Sub OC_LISTENER
Dim oSheet As Object
Dim oCell As Object
Dim iCo As Integer
Dim sCC_N As String
oSheet = ThisComponent.getSheets().getByIndex(4)
For iCo = 1 To 15
sCC_N = "OC_" & iCo
oCell = oSheet.getCellRangeByName(sCC_N)
oListener = CreateUnoListener("OCN_", "com.sun.star.chart.XChartDataChangeEventListener")
oCell.addChartDataChangeEventListener(oListener)
Next iCo
End Sub

Sub OCN_chartDataChanged
Call OPZ_CC
End Sub


Considerando poi che sia i ranghi di celle sia le specifiche del loro collegamento ai controlli, se non presenti, sono facilmente impostabili massivamente nel Runtime, direi che il problema può dirsi Risolto

Di nuovo Grazie e Saluti
OpenOffice4 .0 su Windows 8
fizapol
 
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 13:37

Re: [Risolto] Assegnare Macro con Macro

Messaggioda fizapol » giovedì 8 febbraio 2018, 17:56

Salve a tutti,

Riprendo questa discussione dopo molto tempo poiché ho trovato la soluzione che inizialmente cercavo in

https://forum.openoffice.org/en/forum/viewtopic.php?t=27424#

Di seguito il codice

Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub CreateButton
  oDoc = ThisComponent
  oSheet = oDoc.Sheets.getByIndex(1)
  oDrawPage = oSheet.DrawPage  'Was oDrawPage = oDoc.getDrawPage()

  sScriptURL = "vnd.sun.star.script:Standard.Module1.ButtonPushEvent?language=Basic&location=document" 'Was location=application
  oButtonModel = AddNewButton("Button_1", "Button_1", oDoc, oDrawPage)
  oForm = oDrawPage.getForms().getByIndex(0)
  ' find index inside the form container
  nIndex = GetIndex(oButtonModel, oForm)
  AssignAction(nIndex, sScriptURL, oForm)
End Sub

' assign sScriptURL event as css.awt.XActionListener::actionPerformed.
' event is assigned to the control described by the nIndex in the oForm container
Sub AssignAction(nIndex As Integer, sScriptURL As String, oForm As Object)
  aEvent = CreateUnoStruct("com.sun.star.script.ScriptEventDescriptor")
  With aEvent
    .AddListenerParam = ""
    .EventMethod = "actionPerformed"
    .ListenerType = "XActionListener"
    .ScriptCode = sScriptURL
    .ScriptType = "Script"
  End With

  oForm.registerScriptEvent(nIndex, aEvent)
End Sub


Function AddNewButton(sName As String, sLabel As String, oDoc As Object, oDrawPage As Object) As Object
  oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")

  aPoint = CreateUnoStruct("com.sun.star.awt.Point")
  aSize = CreateUnoStruct("com.sun.star.awt.Size")
  aPoint.X = 1000
  aPoint.Y = 1000
  aSize.Width = 3000
  aSize.Height = 1000
  oControlShape.setPosition(aPoint)
  oControlShape.setSize(aSize)

  oButtonModel = CreateUnoService("com.sun.star.form.component.CommandButton")
  oButtonModel.Name = sName
  oButtonModel.Label = sLabel

  oControlShape.setControl(oButtonModel)
  oDrawPage.add(oControlShape)

  AddNewButton = oButtonModel
End Function


Function GetIndex(oControl As Object, oForm As Object) As Integer
  Dim nIndex As Integer
  nIndex = -1
  For i = 0 To oForm.getCount() - 1 step 1
    If EqualUnoObjects(oControl, oForm.getByIndex(i)) Then
      nIndex = i
      Exit For
    End If
  Next
  GetIndex = nIndex
End Function


Sub ButtonPushEvent(ev as com.sun.star.awt.ActionEvent)
  Print "HERE"
  'msgbox ev.Source.Model.Name
End Sub


Questa volta l'ho utilizzato in fase di inserimento automatizzato di pulsanti in una procedura che avevo già sviluppato (e quindi con poche modifiche, estrapolando i brani di codice, senza tutte le chiamate) ma credo che possa funzionare egregiamente anche su controlli esistenti.
OpenOffice4 .0 su Windows 8
fizapol
 
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 13:37

Re: [Risolto] Assegnare Macro con Macro

Messaggioda charlie » giovedì 8 febbraio 2018, 18:38

Ciao, grazie di aver condiviso con noi la soluzione.
charlie
macOS 10.12 Sierra: Open Office 4.1.5 - LibreOffice 5.4.3.2
Windows 7 pro (VirtualBox): Open Office 4.1.5 - LibreOffice 5.4.4.2
Ubuntu 17.04 LTE (VirtualBox): LibreOffice 5.1.6.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
 
Messaggi: 5031
Iscritto il: mercoledì 19 dicembre 2012, 11:50

Re: [Risolto] Assegnare Macro con Macro

Messaggioda unlucky83 » giovedì 8 febbraio 2018, 19:59

Mi unisco a charlie nel ringraziarti.
LibO5.1.6.2-Ubuntu 16.04.2 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio
Avatar utente
unlucky83
Volontario
Volontario
 
Messaggi: 1756
Iscritto il: lunedì 7 gennaio 2013, 2:23
Località: Latina


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti