Pagina 1 di 1

[risolto] Problemi con parametri

Inviato: venerdì 8 luglio 2011, 0:10
da nickopenoffice
Salve a tutti,
ho da poco intrapreso la programmazione per cercare di dare un piccolo contributo al miglioramento di opeoffice.
Ho creato delle macro in basic per cominciare a familiarizzare con il linguaggio.
Il mio problema e' nel passaggio di parametri in una procedura/funzione, alle volte funziona alle volte non; non capisco.
posto una semplice macro :




Dim Doc,Sheet As Object
Dim inputs As String
Dim stringa,stringa1,stringa2 As String
Dim Trovato As Boolean

Doc = ThisComponent
Sheet = Doc.Sheets(0)

Cell = Sheet.getCellByPosition(3, 3)
inputs=cell.string

scorpora(inputs,stringa,stringa1,stringa2,trovato)

Doc = ThisComponent
Sheet = Doc.Sheets(0)


Cell = Sheet.getCellByPosition(0, 0)
Cell.String =stringa

Cell = Sheet.getCellByPosition(0, 1)
Cell.String =stringa1

Cell = Sheet.getCellByPosition(0, 2)
Cell.String =stringa2

Cell = Sheet.getCellByPosition(0, 3)
Cell.String =trovato



End Sub



Sub scorpora(ByVal funz As String, str As String, str1 As String, str2 As String, trov As Boolean)
Dim flag,flag1 As String
Dim posiz,conta,inizio As Integer


flag = funz

flag1=mid(flag,2,2)

if (flag1="ma" ) or (flag1="ma") then
trov=true
posiz=4
flag1=mid(flag,posiz,1)
Do While flag1<>":"
posiz=posiz+1
flag1=mid(flag,posiz,1)
Loop
string=mid(flag,4,posiz-4)


conta=0
posiz=posiz+1
inizio=posiz
flag1=mid(flag,posiz,1)
Do While flag1<>":"
posiz=posiz+1
conta=conta+1
flag1=mid(flag,posiz,1)
Loop
string1=mid(flag,inizio,conta)


conta=0
posiz=posiz+1
inizio=posiz
flag1=mid(flag,posiz,1)
Do While flag1<>":"
posiz=posiz+1
conta=conta+1
flag1=mid(flag,posiz,1)
Loop
string2=mid(flag,inizio,conta)

Else
trov=false
End If

End Sub





la subroutine funziona correttamente come voglio io(gia' testata).
Pero' quando si ritorna dalla subroutine le stringhe(str,str1,str2) sono vuote.
Dopo tante prove ha funzionato una volta soltanto,poi non ha più funzionato.
Utilizzo la versione OOo 3.3,
secondo voi dove sbaglio?


Grazie per l'attenzione.

Re: Problemi con parametri

Inviato: lunedì 11 luglio 2011, 9:42
da Gumo
devi togliere il BY VAL

Codice: Seleziona tutto

Sub scorpora(Funz As String, str As String, str1 As String, str2 As String, trov As Boolean)
La dichiarazione BY VAL dovrebbe valere solo per il parametro a cui è associata, ma nelle prove che ho fatto vale anche per gli altri.
per cui invalida il passaggio delle variabili tra le routine.

(Io non lo uso mai, non ne vedo l'utilità)

ciao
g

Re: Problemi con parametri

Inviato: lunedì 11 luglio 2011, 15:36
da FncZ4pp4
nickopenoffice ha scritto:Salve a tutti,
ho da poco intrapreso la programmazione per cercare di dare un piccolo contributo al miglioramento di opeoffice.
Ho creato delle macro in basic per cominciare a familiarizzare con il linguaggio.
Il mio problema e' nel passaggio di parametri in una procedura/funzione, alle volte funziona alle volte non; non capisco.
posto una semplice macro :




Dim Doc,Sheet As Object
Dim inputs As String
Dim stringa,stringa1,stringa2 As String
Dim Trovato As Boolean

Doc = ThisComponent
Sheet = Doc.Sheets(0)

Cell = Sheet.getCellByPosition(3, 3)
inputs=cell.string

scorpora(inputs,stringa,stringa1,stringa2,trovato)

Doc = ThisComponent
Sheet = Doc.Sheets(0)


Cell = Sheet.getCellByPosition(0, 0)
Cell.String =stringa

Cell = Sheet.getCellByPosition(0, 1)
Cell.String =stringa1

Cell = Sheet.getCellByPosition(0, 2)
Cell.String =stringa2

Cell = Sheet.getCellByPosition(0, 3)
Cell.String =trovato



End Sub



Sub scorpora(ByVal funz As String, str As String, str1 As String, str2 As String, trov As Boolean)
Dim flag,flag1 As String
Dim posiz,conta,inizio As Integer


flag = funz

flag1=mid(flag,2,2)

if (flag1="ma" ) or (flag1="ma") then
trov=true
posiz=4
flag1=mid(flag,posiz,1)
Do While flag1<>":"
posiz=posiz+1
flag1=mid(flag,posiz,1)
Loop
string=mid(flag,4,posiz-4)


conta=0
posiz=posiz+1
inizio=posiz
flag1=mid(flag,posiz,1)
Do While flag1<>":"
posiz=posiz+1
conta=conta+1
flag1=mid(flag,posiz,1)
Loop
string1=mid(flag,inizio,conta)


conta=0
posiz=posiz+1
inizio=posiz
flag1=mid(flag,posiz,1)
Do While flag1<>":"
posiz=posiz+1
conta=conta+1
flag1=mid(flag,posiz,1)
Loop
string2=mid(flag,inizio,conta)

Else
trov=false
End If

End Sub





la subroutine funziona correttamente come voglio io(gia' testata).
Pero' quando si ritorna dalla subroutine le stringhe(str,str1,str2) sono vuote.
Dopo tante prove ha funzionato una volta soltanto,poi non ha più funzionato.
Utilizzo la versione OOo 3.3,
secondo voi dove sbaglio?


Grazie per l'attenzione.
Per usare delle variabili in diverse procedure la devi definire come "pubblica" nell'intestazione, prima di tutte le procedure Sub. in pratica devono essere dichiarate nel modulo e non nella SubRoutine. Ti faccio un semplice esempio:

Codice: Seleziona tutto

Dim A As Integer REM Questa variabile è pubblica
Sub Numero1
 Numero2
 Numero3
Print A
End Sub
 
Sub Numero2
 A = A + 2
End Sub

Sub Numero3
 A = A * 5
End Sub 
Come puoi vedere eseguendo questo script alla chiamata della Sub Numero2 addizziono lo stesso valore di A che è 0 con 2, Poi con la chiamata della Sub Numero3 Moltiplico per 5 lo stesso valore di A che ora è 2, e da come risultato 10, se io avessi dichiarato A all'interno della Sub Numero1 ogni volta che uscivo da tale SubRoutine per entrare su un altra la variabile A si azzera e si azzera anche quando torna sulla Sub Numero1, per cui il risultato sarebbe stato sempre 0.

Oppure puoi dichiarare delle variabili Globali che rimangono in memoria anche dopo la fine dell'esecuzione della macro, la puoi dichiarare anche dentro una SubRoutine con l'istruzione Global MiaVariabile As Integer

Se ti servono altre info contattaci su questa discussione. :)

Re: Problemi con parametri

Inviato: domenica 17 luglio 2011, 12:03
da nickopenoffice
Salve,
ho tolto byval ma continuo ad avere sempre problemi di passaggio parametri;
non capisco le ultime due variabili vengono passate correttamente, mentre quelle centrali no.
Che senso ha?

Re: Problemi con parametri

Inviato: venerdì 22 luglio 2011, 21:03
da nickopenoffice
Ho risolto. Ho dicharato la variabile incriminata come global prima del main.
Adesso, funziona. non mi era mai accaduto,strano....
i misteri dell'informatica......