[Risolto] Assegnare Macro con Macro

Creare una macro - Scrivere uno script - Usare le API
Rispondi
fizapol
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 12:37

[Risolto] Assegnare Macro con Macro

Messaggio da fizapol »

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, 18:46, modificato 1 volta in totale.
OpenOffice4 .0 su Windows 8
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggio da unlucky83 »

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?
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggio da unlucky83 »

Prendendo spunto da queste guide:
https://wiki.openoffice.org/wiki/Docume ... /Listeners
https://wiki.openoffice.org/wiki/Docume ... ent_Events
credo che la strada sia quella di creare un ascoltatore per ciascun evento, cioè una cosa del genere:

Codice: Seleziona tutto

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

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

http://www.openoffice.org/api/docs/common/ref/com/sun/star/document/Events.html
Se qualcuno ha idee migliori o suggerimenti si faccia vivo ;)
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggio da unlucky83 »

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

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/comm ... ckBox.html

Da qui, sono giunto a
http://www.openoffice.org/api/docs/comm ... tener.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/Crea ... Runtime/it
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
fizapol
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 12:37

Re: Assegnare Macro con Macro

Messaggio da fizapol »

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
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggio da unlucky83 »

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:
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Assegnare Macro con Macro

Messaggio da unlucky83 »

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

Sub CheckBoxListener_disposing( o as object ) 
end sub
Questo credo sia tutto sugli eventi dei checkbox delle finestre di dialogo :ouch:
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
fizapol
Messaggi: 5
Iscritto il: venerdì 8 novembre 2013, 12:37

Re: Assegnare Macro con Macro

Messaggio da fizapol »

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:
http://ooo-forums.apache.org/it/forum/v ... 65f#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, 12:37

Re: [Risolto] Assegnare Macro con Macro

Messaggio da fizapol »

Salve a tutti,

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

https://forum.openoffice.org/en/forum/v ... p?t=27424#

Di seguito il codice

Codice: Seleziona tutto

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
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8785
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: [Risolto] Assegnare Macro con Macro

Messaggio da charlie »

Ciao, grazie di aver condiviso con noi la soluzione.
charlie
macOS 14.3 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: [Risolto] Assegnare Macro con Macro

Messaggio da unlucky83 »

Mi unisco a charlie nel ringraziarti.
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Rispondi