[Risolto] Gestione eventi a livello di applicazione

Creare una macro - Scrivere uno script - Usare le API
Rispondi
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

[Risolto] Gestione eventi a livello di applicazione

Messaggio da marinoernestoch »

Buon giorno.
Sto incamminandomi nel mondo "Eventi" e ho buttato giù qualche istruzione:

Codice: Seleziona tutto

Sub NuovoDocumento()
    const evento as string =  "Evento nuovo documento "
    on error goto errore
	ctr = ctr +1
	MsgBox evento & "di " & fdocumento & format(ctr,"(#0)")
	on error goto 0
	exit sub
errore:
    MsgBox error$ & chr(13) & evento
    resume next
    on error goto 0
End Sub
Sub DocumentoCreato()
    const evento as string =  "Evento documento creato "
    ctr = ctr +1
	MsgBox evento & "di " & fdocumento & format(ctr,"(#0)")
	on error goto 0
	exit sub
errore:
    MsgBox error$ & chr(13) & evento
    resume next
    on error goto 0
 End Sub

Sub ApriDocumento()
    const evento as string =  "Evento Apri documento "
    ctr = ctr +1
	MsgBox evento & "di " & fdocumento & format(ctr,"(#0)")
	on error goto 0
	exit sub
errore:
    MsgBox error$ & chr(13) & evento
    resume next
    on error goto 0
End Sub

Function fDocumento() As String
Dim oDocumento As Object
oDocumento = StarDesktop.CurrentComponent
	If oDocumento.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
		fDocumento = "Calc"
	ElseIf oDocumento.supportsService("com.sun.star.text.TextDocument") Then
		fDocumento = "Writer"
	ElseIf oDocumento.supportsService("com.sun.star.presentation.PresentationDocument") Then
		fDocumento = "Impress"
	ElseIf oDocumento.supportsService("com.sun.star.drawing.DrawingDocument") Then
		fDocumento = "Draw"
	ElseIf oDocumento.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") Then
		fDocumento = "Base"
	ElseIf oDocumento.supportsService("com.sun.star.formula.FormulaProperties") Then
		fDocumento = "Math"
	ElseIf oDocumento.supportsService("com.sun.star.script.BasicIDE") Then
	    fDocumento = "Sviluppo IDE"
	Else
		fDocumento = "Sconosciuto"
	End If
	fDocumento = fDocumento & Space(1)
End Function
Queste sub sono definite a livello di applicazione (LibreOffice).
Il titoli delle sub sono autodescrittivi. Ho abbinato le sub ai relativi eventi.
Se attivo LibreOffice e poi apro un qualsiasi file le sub sono richiamate correttamente (X lo meno la "ApriDocumento").
Se attivo Calc o Writer direttamente le applicazioni vanno in crash.
Ho disattivato gli eventi "Nuovo documento" e "Documento creato", lasciando solo il "Apri documento" e non ho problemi ne partendo da LibreOffice ne dalle singole applicazioni.
Ho ripetuto le stesse istruzioni in ambiente OpenOffice e, anche con la gestione dei tre eventi, aprendo direttamente Calc non ho problemi.
Qualcuno ha esperienze in merito? Ringrazio anticipatamente.
Ultima modifica di marinoernestoch il giovedì 12 settembre 2024, 21:29, modificato 1 volta in totale.
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
nickGiard
Messaggi: 84
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Gestione eventi a livello di applicazione

Messaggio da nickGiard »

Ciao marinoernestoch,
il mondo Eventi è molto interessante da esplorare, io uso spesso l'evento Doppio Click che rende l'ambiente molto dinamico.
Permettimi una osservazione di merito, quando io cerco di esplorare nuove caratteristiche cerco di fare dei test il più semplice possibile e che riguardi solo l'argomento di studio.
Guardando il tuo codice vedo dichiarate costanti (?) che si concatenano con testo derivato da una funzione e poi con aggiunta di format, su una variabile ctr che si suppone numerica solo perchè il basic la individua tale grazie ad una somma, e che forse è globale...
Non parliamo della gestione degli errori, sempre un pò complicata, e che non vedo ben chiara.
Ti consiglio di usare questo codice base (ed analogamente per gli altri casi) che non crea nessun crash, dove potrai esaminare il parametro oEvt che ti darà molte informazioni, posizionando un punto di interruzione del debug alla fine del codice.

Sub NuovoDocumento(Optional oEvt)
MsgBox "NuovoDocumento"
End Sub

Potrai successivamente aggiungere gradualmente ulteriori funzioni, così troverai il punto di errore.
Un saluto
Ultima modifica di nickGiard il domenica 8 settembre 2024, 21:23, modificato 1 volta in totale.
Nicola con LibreOffice 7.1 (x64) su Windows 11
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

Re: Gestione eventi a livello di applicazione

Messaggio da marinoernestoch »

Grazie nikGiard dell'interesse. Come giustamente suggerisci, le prime sub di eventi sono state scritte in maniera elementare e funzionavano x la creazione e l'apertura di doc. Davano (e danno) errore quando attivo la specifica applicazione (quindi non c'è ancora attivo nessun doc). E' stato gioco forza inserire una routine di gestione degli errori, nella speranza di intercettarli, cosi' da capire dove sbaglio.
Anche quando creo un nuovo doc usando le barre comando le sub si attivano. Quindi, anche se apparentemente complesse, le sub sono esatte, solo che il sistema va in crash se attivo un singolo componente (Calc o writer). Ho accantonato x il momento gli eventi, perchè sto facendo altro, ma appena mi libero li riprendo in mano e, a naso, vedrò di lavorare sulla gestione errori, perchè penso che sia lì la questione.
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
nickGiard
Messaggi: 84
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Gestione eventi a livello di applicazione

Messaggio da nickGiard »

Ciao marinoernestoch, mi permetto di osservare che la gestione degli errori dovrebbe essere organizzata avendo già visione delle possibili eccezioni, piuttosto che subita in attesa che avvenga per un qualunque motivo e poi riavviando il codice con resume next che darà sicuramente ancora errore.
Quando riprenderai l'argomento esamina a fondo il parametro oEvt che ti darà molte informazioni, tra cui direttamente il documento che ha attivato l'evento stesso, ossia avrai con certezza l'oggetto da analizzare.
P.S. "le sub sono esatte, solo che il sistema va in crash se attivo un singolo componente (Calc o writer)" se succede questo forse le sub NON sono esatte.
Buon proseguimento
Nicola con LibreOffice 7.1 (x64) su Windows 11
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

Re: Gestione eventi a livello di applicazione

Messaggio da marinoernestoch »

Buona sera.
Proseguendo nelle prove di un 'accenno' di trattamento degli eventi ho leggermente modificato le istruzioni.
Di significativo:
ho messo il parametro di interfaccia con l'evento;
il contatore messo x capire la sequenza è stato definito Global (pensavo che definendolo all'inizio ed all'esterno delle sub fosse visibile a tutte);
la gestione degli errori è stata inserita nella funzione di test del tipo di applicazione;
Ho installato la versione 24.2.5.2.

Ora le sub sono eseguite senza problemi nel 90% dei casi. Ogni tanto (non sono riuscito a capire ne come ne quando) il sistema da errore, che però è intercettato dal On Error che emette il relativo messaggio, senza andare in crash come prima.
Per ora mi sta bene così: un passo per volta.
Devo però dire di aver trovato molta difficoltà nel ricercare documentazione che 'vada al nocciolo' del problema (senz'altro per mia ignoranza), a motivo della quale, aprirò un nuovo thread.
Ecco il codice:

Codice: Seleziona tutto

global ctr As integer
Sub NuovoDocumento(Optional oEVT)
    ctr = ctr +1
	MsgBox oevt.eventname & " di " & fdocumento(oevt.eventname) & format(ctr,"(#0)")
End Sub

Sub DocumentoCreato(Optional oEVT)
   ctr = ctr +1
	MsgBox oevt.eventname & " di " & fdocumento(oevt.eventname) & format(ctr,"(#0)")
 End Sub

Sub ApriDocumento(Optional oEVT)
    ctr = ctr +1
	MsgBox oevt.eventname & " di " & fdocumento(oevt.eventname) & format(ctr,"(#0)")
End Sub

Sub ChiudiDocumento(Optional oEVT)
    ctr = ctr +1
	MsgBox oevt.eventname & " di " & fdocumento(oevt.eventname) & format(ctr,"(#0)")
End Sub

Function fDocumento(ByRef evento as string) As String
 Dim oDocumento As Object
on error goto errore
'oDocumento = StarDesktop.CurrentComponent
oDocumento =  ThisComponent    

	If oDocumento.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
		fDocumento = "Calc"
	ElseIf oDocumento.supportsService("com.sun.star.text.TextDocument") Then
		fDocumento = "Writer"
	ElseIf oDocumento.supportsService("com.sun.star.presentation.PresentationDocument") Then
		fDocumento = "Impress"
	ElseIf oDocumento.supportsService("com.sun.star.drawing.DrawingDocument") Then
		fDocumento = "Draw"
	ElseIf oDocumento.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") Then
		fDocumento = "Base"
	ElseIf oDocumento.supportsService("com.sun.star.formula.FormulaProperties") Then
		fDocumento = "Math"
	ElseIf oDocumento.supportsService("com.sun.star.script.BasicIDE") Then
	    fDocumento = "Sviluppo IDE"
	Else
		fDocumento = "Sconosciuto"
	End If
	fDocumento = fDocumento & Space(1)
	on error goto 0
	exit function
errore:
    MsgBox error$ & chr(13) & "sull'evento " & evento
    resume next
    on error goto 0

End Function
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
Rispondi