PDA

View Full Version : [VB6] Funzione Salva Annidata?


Jamester
03-04-2010, 11:52
Allora il seguente codice funziona pero' io vorrei mettere l'ultima parte (che ho evidenziato in rosso) in un altra procedura richiamata all'interno della stessa form (quindi mi andrebbe anche bene una private sub) dato che la parte rossa deve essere eseguita identica da altri processi. Ho cercato di metterla in un altra procedura sia private su public nello stesso forum oppure in un file .BAS ma mi da bad file name:

Public Sub ScriviFile(strfile As String)

' *** DIAGNOSTICA 2***
'MsgBox ("Sequenza scrittura file del clicksaver in corso...")
' *** DIAGNOSTICA 2 FINE***

Dim a As String
a = "AODIR::" & San_Opzioni.Combo1.Text & ""
Dim lFile As Long
lFile = FreeFile
'San2.Combo1.BackColor = &H8000000F
'Apertura File
Open strfile For Output As #lFile
'Open strfile For Append Shared As #lFile

MsgBox ("Apertura File Clicksaver")
Print #lFile, "::Config::"
Print #lFile, a
Print #lFile, "WINDOWX::346"
Print #lFile, "WINDOWY::209"
Print #lFile, "WINDOWWIDTH::351"
Print #lFile, "STARTMINIMIZED::0"
Print #lFile, "WATCHMSGBOX::1"
Print #lFile, "BUYINGAGENTSHOWHELP::0"
Print #lFile, "SOUNDS::1"
Print #lFile, "EXPAND::0"
Print #lFile, "MOUSEMOVE::1"
Print #lFile, "LOG::0"
Print #lFile, "ALERTITEM::1"
Print #lFile, "ALERTLOC::0"
Print #lFile, "ALERTTYPE::0"
Print #lFile, "BUYINGAGENTMAXTRIES::200"
Print #lFile, "BUYINGAGENTHIDE::0"
Print #lFile, "MISHTYPES::31"
Print #lFile, "HIGHLIGHTOPTS::7"
Print #lFile, "SLIDER_EASY_HARD::50"
Print #lFile, "SLIDER_GOOD_BAD::50"
Print #lFile, "SLIDER_ORDER_CHAOS::50"
Print #lFile, "SLIDER_OPEN_HIDDEN::50"
Print #lFile, "SLIDER_PHYS_MYST::50"
Print #lFile, "SLIDER_HEADON_STEALTH::50"
Print #lFile, "SLIDER_MONEY_XP::50"
Print #lFile, "BUYMOD::5"
Print #lFile, "ITEMVALUE::0::0::0::0"
Print #lFile, "BATRACKAOFOCUS::0"
Print #lFile, "ROLLRETRY::0"
Print #lFile, "IGNOREMR::0"
Print #lFile, "ALLSAMELOC::0"
Print #lFile, "USERLEVEL::1"
Print #lFile, "BUYLIST::0"
Print #lFile, "::ItemWatch::"
Close #lFile

If Clicksaver_Global.Nanot1.Value = 1 Then

Absorption_Nt
Open strfile For Append Shared As #lFile
If San2.Check1 = 1 Then
Else
If San2.Text1(0).Text = "-" Then
Else
Print #lFile, San2.Text1(0).Text
End If
End If
If San2.Check2 = 1 Then
Else
If San2.Text2(0).Text = "-" Then
Else
Print #lFile, San2.Text2(0).Text
End If
End If
If San2.Check3 = 1 Then
Else
If San2.Text3(0).Text = "-" Then
Else
Print #lFile, San2.Text3(0).Text
End If
End If
If San2.Check4 = 1 Then
Else
If San2.Text4(0).Text = "-" Then
Else
Print #lFile, San2.Text4(0).Text
End If
End If
If San2.Check5 = 1 Then
Else
If San2.Text5(0).Text = "-" Then
Else
Print #lFile, San2.Text5(0).Text
End If
End If
If San2.Check6 = 1 Then
Else
If San2.Text6(0).Text = "-" Then
Else
Print #lFile, San2.Text6(0).Text
End If
End If
If San2.Check7 = 1 Then
Else
If San2.Text7(0).Text = "-" Then
Else
Print #lFile, San2.Text7(0).Text
End If
End If
If San2.Check8 = 1 Then
Else
If San2.Text8(0).Text = "-" Then
Else
Print #lFile, San2.Text8(0).Text
End If
End If
If San2.Check9 = 1 Then
Else
If San2.Text9(0).Text = "-" Then
Else
Print #lFile, San2.Text9(0).Text
End If
End If
If San2.Check10 = 1 Then
Else
If San2.Text10(0).Text = "-" Then
Else
Print #lFile, San2.Text10(0).Text
End If
End If
If San2.Check11 = 1 Then
Else
If San2.Text11(0).Text = "-" Then
Else
Print #lFile, San2.Text11(0).Text
End If
End If
If San2.Check12 = 1 Then
Else
If San2.Text12(0).Text = "-" Then
Else
Print #lFile, San2.Text12(0).Text
End If
End If
If San2.Check13 = 1 Then
Else
If San2.Text13(0).Text = "-" Then
Else
Print #lFile, San2.Text13(0).Text
End If
End If
Print #lFile, "::LocWatch::"
Print #lFile, "::End::"
Close #lFile
Call MsgBox("Configurazione del CLICKSAVER salvata ", vbOKOnly + vbInformation + vbApplicationModal + vbDefaultButton1, "Baldios's NanoToon Reminder 5.0")

End If
End Sub

Jamester
03-04-2010, 21:44
..UP

icecube_HU
05-04-2010, 08:58
Allora il seguente codice funziona pero' io vorrei mettere l'ultima parte (che ho evidenziato in rosso) in un altra procedura richiamata all'interno della stessa form (quindi mi andrebbe anche bene una private sub) dato che la parte rossa deve essere eseguita identica da altri processi. Ho cercato di metterla in un altra procedura sia private su public nello stesso forum oppure in un file .BAS ma mi da bad file name:
Ciao !

...ma tu cosa hai provato a fare ?

A definire una nuova routine, e semplicemente incollato il codice in rosso all'interno ?

Se e' cosi', all'interno di questa nuova routine semplicemente NON e' definita la variabile lFile: devi ripetere la dichiarazione e l'assegnazione a FreeFile. (in questo caso appare evidente che tu NON usi la direttiva Option Explicit :cry: , altrimenti avresti avuto la segnalazione che quella variabile non era definita, ed avresti capito subito qual'era il problema...)

N.B.: ovviamente nell'intestazione della routine devi passare anche il nome del file come parametro...

In definitiva:

Private Sub Scrivi2(strfile As String)
Dim lFile As Long
lFile = FreeFile
..........(codice rosso)..........
End Sub


Ciao !


P.S.: non entro nel merito di quell'orrida sequela di If..., oltretutto non postati col tag giusto, quindi perdendo l'indentazione e la possibilita' di...capirci qualcosa !!!

Jamester
05-04-2010, 18:02
patch/file access error

Jamester
05-04-2010, 18:06
Private Sub Clicksaver_Export(strfile As String)
Dim lFile As Long
lFile = FreeFile
Open strfile For Append Shared As #lFile
...
Close #lFile

Mi dice ARGUMENT NOT OPTIONAL quando vado a richiamare la procedura Clicksaver_Export

icecube_HU
05-04-2010, 18:31
patch/file access error
questo non l'ho mai sentito....
Mi dice ARGUMENT NOT OPTIONAL quando vado a richiamare la procedura Clicksaver_Export

Quando esce un errore, dovresti riportare anche la riga su cui si verifica quell'errore...

Comunque, ARGUMENT NOT OPTIONAL vuol dire che NON hai passato un argomento obbligatorio.
Quindi Clicksaver_Export va' invocata ripetendo il NOME del file da salvare/appendere, mi pareva ovvio data la definizione della routine...

Toglimi una curiosita': stai scrivendo tu il programma, o stai facendo un copia/incolla di routine di cui non conosci bene il significato ??

Jamester
05-04-2010, 18:34
Si sto scrivendo io il tutto in base a quello che mi serve. Ho fatto come mi hai detto tu: ho fatto una nuova procedura nella stessa form e poi da un altra parte chiama 2 procedure una dietro l'altra e l'errore lo da alla riga quando va a richiamare la procedura nuova che mi hai suggerito tu

icecube_HU
05-04-2010, 18:40
Si sto scrivendo io il tutto in base a quello che mi serve. Ho fatto come mi hai detto tu: ho fatto una nuova procedura nella stessa form e poi da un altra parte chiama 2 procedure una dietro l'altra e l'errore lo da alla riga quando va a richiamare la procedura nuova che mi hai suggerito tu
Ok, devi passare alla routine il nome del file, come dicevo nel post precedente.

P.S.: hai capito dove era l'errore ?
Che mi dici dell'Option Explicit (menu Tools/Options, spunta Require Variable Declaration) ? Ne hai mai sentito parlare ? E' molto utile, e ti evita di impazzire col debug...

Jamester
05-04-2010, 18:49
Ho messo pure sta spunta ma continua a darmi i due errori poco prima a seconda di cosa scrivo. Devo rassegnarmi a scrivere tt il papiello rosso di continuo? Non capisco che devo fare :(

Jamester
05-04-2010, 19:06
La parte rossa a momento viene ripetuta ogni volta quindi a lavoro finito quella parte rossa si ripetera' almeno 400 volte allungando a dismisura il codice del programma.

Quindi vorrei sapere sta benedetta procedura come va scritta ?

La procedura chiamata prima di questa nuova rossa che nn so scrivere e' questa:

Public Sub EnS_Health_Buffs()

Azzeramento_Sezione_Database

If esiste = Dir(App.Path & "\Settings\Soldier\Enforcer and Soldier Health Buffs Setup.atb") Then
Open App.Path & "\Settings\Soldier\Enforcer and Soldier Health Buffs Setup.atb" For Output As #1
Creazione_Vuoto_San2
Open App.Path & "\Database\Soldier\EnS Health Buffs.atb" For Input As 1
Caricamento_Database_2
Open App.Path & "\Settings\Soldier\Enforcer and Soldier Health Buffs Setup.atb" For Input As 1
Caricamento_Settaggi_2
Else
Open App.Path & "\Database\Soldier\EnS Health Buffs.atb" For Input As 1
Caricamento_Database_2
Open App.Path & "\Settings\Soldier\Enforcer and Soldier Health Buffs Setup.atb" For Input As 1
Caricamento_Settaggi_2
End If

End Sub


E risiede in un modulo .BAS ed è li che volevo mettere anche la seconda. Avevo pensato di scrivere anche la seconda in stile di questa qui ma è come se non accettasse 2 procedure scritte in posizioni diverse. Quindi che dovrei fare?

Quindi sarebbe:

EnS_Health_Buffs
PROCEDURA ROSSA

icecube_HU
06-04-2010, 19:09
Stai facendo una confusione incredibile, parli di una cosa, poi di un'altra, non si capisce COME chiami 'sta benedetta procedura che non ti funziona...

Non mi e' possibile seguirti in tutto questo casino... dici "cosa devo fare ?"... ma ti rendi conto che io NON SO' neppure cosa stai facendo e di cosa stai parlando ? ... posso provare a darti una mano in un problema specifico, ma non posso aiutarti a fare un programma "taglia e cuci" come quello che stai rattoppando...:D

"è come se non accettasse 2 procedure scritte in posizioni diverse" :eek:
...se hanno lo stesso nome, vorrei ben vedere !!! :muro:

MarcoGG
07-04-2010, 13:27
Allora il seguente codice funziona pero' io vorrei mettere l'ultima parte (che ho evidenziato in rosso) in un altra procedura richiamata all'interno della stessa form (quindi mi andrebbe anche bene una private sub) dato che la parte rossa deve essere eseguita identica da altri processi. Ho cercato di metterla in un altra procedura sia private su public nello stesso forum oppure in un file .BAS ma mi da bad file name:

Non per fare critiche ma quel codice è messo giù maluccio.
Prova a descrivere semplicemente l'operazione che vuoi eseguire.

In generale, se vuoi spezzare una Private Sub ( che sta ad esempio sotto una Form ), la parte "rossa" andrebbe messa Public in un Modulo, facendo però attenzione che se ci sono variabili locali esterne, anch'esse andranno rese globali, ossia Public in un Modulo. Se quel codice funziona, e sono rispettate queste regole, deve funzionare anche una volta che è stato spezzato.
Ciò di cui ci si deve preoccupare è il discorso logico. Se la parte "rossa" viene eseguita dall'esterno dell'oggetto ( Form ) in cui risiede la parte "nera", è ovvio che la mancata esecuzione di quest'ultima porterà ad errori.

Jamester
08-04-2010, 09:29
Non per fare critiche ma quel codice è messo giù maluccio.
Prova a descrivere semplicemente l'operazione che vuoi eseguire.

In generale, se vuoi spezzare una Private Sub ( che sta ad esempio sotto una Form ), la parte "rossa" andrebbe messa Public in un Modulo, facendo però attenzione che se ci sono variabili locali esterne, anch'esse andranno rese globali, ossia Public in un Modulo. Se quel codice funziona, e sono rispettate queste regole, deve funzionare anche una volta che è stato spezzato.
Ciò di cui ci si deve preoccupare è il discorso logico. Se la parte "rossa" viene eseguita dall'esterno dell'oggetto ( Form ) in cui risiede la parte "nera", è ovvio che la mancata esecuzione di quest'ultima porterà ad errori.

Hmmm anche le variabili...ora provo e vi faccio sapere.

Jamester
08-04-2010, 09:38
No asp. Il codice che ho postato e' tutto segna PUBLIC quindi nn funziona. Ho messo la parte rossa in un .bas public e nn va, ho messo la parte rossa in un altro procedura nello stesso form e nn va lo stesso. Suggerimenti?

MarcoGG
08-04-2010, 11:26
No asp. Il codice che ho postato e' tutto segna PUBLIC quindi nn funziona. Ho messo la parte rossa in un .bas public e nn va, ho messo la parte rossa in un altro procedura nello stesso form e nn va lo stesso. Suggerimenti?

Non chiedermi di interpretare/replicare/testare quel codice perchè la risposta è NO. :D
Posso solo darti consigli in generale.
Vedo troppe cose che mi fanno pensare che sia stato buttato giù frettolosamente, o che contenga dei copia/incolla "acritici"...
Mi basta leggere una cosa come :
Dim a As String
a = "AODIR::" & San_Opzioni.Combo1.Text & ""
per capire che chi lo ha scritto, lo ha fatto senza molto buon senso.
Che senso può avere mai concatenare una stringa vuota in quel modo ?
Che senso ha quella sequela confusa di If-Else, quando nella condizione 'Vero' non si esegue niente ? E usare una Select Case ?
Inoltre non è chiaro COSA vuoi fare, nè COME. L'unica scelta saggia è buttare giù tutto : fatti un'analisi precisa e chiara del problema che vuoi risolvere, e ricomincia da capo.