PDA

View Full Version : [VB6] Iterazione di una sub


GogetaSSJ
07-06-2004, 15:18
Salve ragazzi, sto creando un programmino che, dato un file di testo, va a cercare una stringa che gli fornisco, seleziona l'intera riga (composta da 62 caratteri) la copia negli appunti e via dicendo....

Tutto questo con la pressione di un command button. Ad ogni sua pressione va a trovare la stringa successiva e fa le elaborazioni. Quando non trova più corrispondenze esce una message box. Fin qui credo che sia tutto normale.

Ho provato a fare un'iterazione ma succede un macello, se ne va in infinite loop mostrandomi la msgbox. Dove sbaglio? Eccovi la codifica


Private Sub cmdFindNext_Click()
txtfile.SelStart = txtfile.SelStart + 2
If InStr(txtfile.SelStart, txtfile, find) <> 0 Then
txtfile.SelStart = InStr(txtfile.SelStart, txtfile, find) - 1
txtfile.SelLength = 62
Clipboard.SetText txtfile.SelText
txtpulito.Text = txtpulito.Text + Clipboard.GetText + Chr(13) + Chr(10)
Else
MsgBox "non trovato"
End If
End Sub


Se la codifica ha errori o può essere ottimizzata, fatemi sapere ovviamente ;)

GogetaSSJ
10-06-2004, 10:57
Up

bizzu
10-06-2004, 11:24
La codifica dovrebbe andare bene, ma dov'è il loop? Io vedo solo un if...

matpez
10-06-2004, 11:26
Come mai non fai una cosa in automatico, cioè che prende il file e fa tutto da solo, invece di premere tante volte sul bottone?

GogetaSSJ
10-06-2004, 12:48
Appunto, era quello che volevo sapere.... come faccio?
C'è qualcosa che non va in quella codifica, me lo ripete all'infinito, se invece faccio tramite pulsante posso regolare manualmente l'elaborazione.

matpez
10-06-2004, 12:55
Bhe è fattibile un po' meglio :)

Anzi sarebbe da rifare da capo.

Ma senti, come fai a sapere che ci sono 62 caratteri per riga?

GogetaSSJ
10-06-2004, 14:27
In pratica ho creato questo programma perchè io gli do in pasto un file di testo e lui mi deve trovare e tagliare delle url che sono da 62 chr ciascuno.

Volevo che lui si posizionasse all'inizio di un link e poi selezionare tutto fino alla fine del cursore, ma non so come fare.

Insomma forse ho creato una mega schifezza fatta in casa, avete suggerimenti? :D (forse è meglio riscrivere da 0 il programma, seguendo un'altra logica)

bizzu
10-06-2004, 14:55
Io sto facendo una cosa simile in ASP (quindi VBScript).
Praticamente, dopo aver aperto il file, devi cercare con InStr la stringa che compare prima dell'url che vuoi salvare (in modo da avere un riferimento a dove inizia la stringa). Fai lo stesso per la fine della stringa. Per estrarre la stringa che ti serve, poi, devi usare la funzione Mid, che riceverà come parametri il file di testo, l'inizio della stringa e la lunghezza (cioè fine-inizio). A questo punto usarla/metterla dove ti pare...
Per non avere un ciclo infinito, metti un if dopo che cerchi l'inizio della stringa, che controlli se instr ritorna 0: in caso affermativo devi uscire dal ciclo.
Spero di esserti stato utile... :)

matpez
10-06-2004, 15:22
Quello che ha detto bizzu va bene, però io lavorerei una riga alla volta (nel file)!




Dim sLine as string
dim nFreeFile as integer


nFreeFile =freefile

Open app.path & "\prova.txt" For Input As #nFreeFile
Do While Not EOF(nFreeFile)
Line Input #nFreeFile, sLine
'QUI FAI I TUOI CONTROLLI
Loop
Close #nFreeFile

GogetaSSJ
10-06-2004, 15:42
Uhmmm ora provo a fare come mi ha suggerito matpez, sperando di riuscire nel mio intento.
Comunque il testo che precede l'url è sempre diverso, per adesso mi sto arrangiando ricercando la stringa "http" e poi selezionare l'intera riga tramite selstart (le 62 righe).

Grazie a tutti per le dritte, se avete altri suggerimenti fatevi sotto :D
Vi faccio sapere ;)

matpez
10-06-2004, 15:53
Altri no, vediamos e hai capito e riesce a mettere tutto in sesto quello che ti abbiamo detto :p :oink:

GogetaSSJ
11-06-2004, 17:43
Ci sono riuscito finalmente , sopratutto grazie all'aiuto "logico" di matpez, infatti leggendo una riga alla volta è molto più semplice effettuare le elaborazioni.

Andiamo avanti ora :D
Ora in una textbox mi risultano tutte le varie URL estrapolate dal file di testo. Come faccio ad aprire il browser e bypassargli una serie di combinazioni di tasti?
Uso mozilla firefox ed in pratica vorrei che ad ogni url fosse assegnato un tab del browser.

In definitiva il programma deve fare questo (partendo dal primo link ed arrivando all'ultimo):

1 - Aprire un nuovo tab con CTRL T

2 - Incollare il link.

Conoscete le istruzioni che mi servono? Grazie ancora per il prezioso aiuto che mi state dando ;)

matpez
11-06-2004, 18:38
Lanci mozzilla con il comando Shell , dopo di che usi il comando SendKeys per mandare tasti al browser.

Non ti ho aiutato molto, se no te lo faccio io, ti ho dato il suggerimento buono ... in questo campo è bello realizzarsi con le proprie mani :)

PS: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsmthsendkeys.asp

Della17
11-06-2004, 18:39
Originariamente inviato da GogetaSSJ
Ci sono riuscito finalmente , sopratutto grazie all'aiuto "logico" di matpez, infatti leggendo una riga alla volta è molto più semplice effettuare le elaborazioni.

Andiamo avanti ora :D
Ora in una textbox mi risultano tutte le varie URL estrapolate dal file di testo. Come faccio ad aprire il browser e bypassargli una serie di combinazioni di tasti?
Uso mozilla firefox ed in pratica vorrei che ad ogni url fosse assegnato un tab del browser.

In definitiva il programma deve fare questo (partendo dal primo link ed arrivando all'ultimo):

1 - Aprire un nuovo tab con CTRL T

2 - Incollare il link.

Conoscete le istruzioni che mi servono? Grazie ancora per il prezioso aiuto che mi state dando ;)

posso farti una domanda?
immagino tu abbia creato questo programma per ogni volta nn aprire sempre le stesse pagine?
almeno dal tuo post mi sembra di capire che sia così ;) :D

tutto ciò per dirti che se è quella l'esigenza c'è un extension apposta :)

se invece no,puoi usare il comando postato da mat sopra per lanciare il browser e guardare nella doc se c'è un comando per lanciare firefox con direttamente aperta una pagina...
so che cmq puoi aprirlo con una url sola
lanciandolo cosi:
firefox.exe www.tuosito.com
però nn saprei come fare aprire + tabs ;)

GogetaSSJ
11-06-2004, 18:50
Si esatto... in pratica mi arrivano sempre link diversi, i quali devo aprirli nel browser.

Ho creato il programma per estrapolarli e metterli pronti per essere lanciati in firefox.

matpez ora provo a guardare il link che mi hai dato, grazie ;)

Della17
11-06-2004, 18:51
Originariamente inviato da GogetaSSJ
Si esatto... in pratica mi arrivano sempre link diversi, i quali devo aprirli nel browser.

Ho creato il programma per estrapolarli e metterli pronti per essere lanciati in firefox.

matpez ora provo a guardare il link che mi hai dato, grazie ;)

guarda sopra ...appena modificato ;) :)

GogetaSSJ
11-06-2004, 19:19
Si avevo letto, comunque qui serve un programma scritto appositamente, le extension non mi sono di aiuto.
Ora devo imparare a "giocare" con il sendkey proposto nella msdn, vi faccio sapere cosa combino :D

GogetaSSJ
11-06-2004, 22:11
Ho iniziato ad abbozzare un pò di codifica, eccola qui:

Private Sub cmdlink_Click()
Shell ("d:\programmi\mozilla firefox\firefox.exe")
AppActivate "Mozilla Firefox"
For I = 1 To 4 ' Per aprire 4 Tabs
SendKeys "^(t)", True 'Invia la sequenza di tasti CTRL T per aprire i tabs
Next I '
End Sub

1° Problema: Per aprire il browser ci mette un 3 o 4 secondi, per cui il programma non lo trova e quindi va in errore. Per risolvere temporanamente ho disattivato l'esecuzione di Shell e avvio il programma manualmente;

2° Problema: Se imposto 1 to 4 nel ciclo, mi apre 4 tabs (ovvio). Se metto 1 to 5 mi apre 6 tabs, perchè??? :eek:
Comunque è variabile, a volte me ne apre 5 :eek:

A voi la parola :D ;)

Della17
12-06-2004, 00:44
Originariamente inviato da GogetaSSJ
Si avevo letto, comunque qui serve un programma scritto appositamente, le extension non mi sono di aiuto.
Ora devo imparare a "giocare" con il sendkey proposto nella msdn, vi faccio sapere cosa combino :D


se usi session saver...da qualke parte le scriverà le ultime pagine...magari trovando il file puoi andare a modificare come hai bisogno...ma sinceramente nn mi sembra una buona idea :D

GogetaSSJ
13-06-2004, 23:37
Nessuno ha un'idea su come fare?

efreeti
14-06-2004, 14:55
Per il problema 1 prova ad utilizzare un trucchetto del genere:



Private Sub cmdlink_Click()
Dim a As Variant

a=Shell ("d:\programmi\mozilla firefox\firefox.exe")
AppActivate a

For I = 1 To 4 ' Per aprire 4 Tabs
SendKeys "^(t)", True 'Invia la sequenza di tasti CTRL T per aprire i tabs
Next I '

End Sub



in questo anche se non vedi la finestra del browser il compilatore sa il suo trehadID e lo attiva non appena lo mostra.

Per il secondo problema non ne ho idea, ho provato anche io ma non ho cavato un ragno dal buco.... penso sia un tuo errore, nel caso di 1 to 5 a me da 5 risposte, mai 6

ricontrolla il codice

Efreeti:D

GogetaSSJ
14-06-2004, 15:03
Si quella prova l'ho fatta, ma siccome ci mette un pò di tempo ad attivarsi, lui non trova l'ID mi sembra, infatto ho optato per l'altra soluzione...

Per il secondo problema mi sa che è riconducibile al primo, perchè forse, essendo già attiva l'istanza, si crea macelli con le tab (non so se mi spiego)
Vabbè ora devo finire di fare la tesina per la maturità, dopo la partita dell'italia mi rimetto sul codice del programmino :D

GogetaSSJ
16-06-2004, 18:00
Se faccio come mi hai suggerito tu (avevo già provato mi sembra) mi apre firefox ma restituendomi questo errore:

http://gogeta.interfree.it/Hwupgrade/errore.jpg

Cosa faccio? Mi manca questo passo importante, se no non posso continuare a sviluppare il programma :(

matpez
16-06-2004, 20:36
Prova a dichiarare a di tipo Long

Poi controlla se a dopo che passa dalla shell assume un valore numerico!

GogetaSSJ
16-06-2004, 20:43
Ho appena provato, A assume sempre una valore numerico di 4 cifre, ma mi da sempre errore :(
Perché? Non capisco :(

matpez
16-06-2004, 20:47
Prima prova così: a=Shell ("Path Applicazione",vbMaximizedFocus)

se non funzion ancora prova af aggiungere questo: AppActivate a, True

GogetaSSJ
16-06-2004, 22:00
Sempre solito errore, sia che lo imposti a True sia con False :(

Altri suggerimenti?

The DeViL's
17-06-2004, 00:16
scusa ma se ci mette 3 o 4 secondi per aprire xche nn ritardi con una sleep?

cionci
17-06-2004, 08:39
Il ritardo non è quantificabile, quindi una sleep non basta...

Usa l'API FindWindow per trovare la finestra... Se non la trovi addormentati per un secondo...e rirpova...

efreeti
17-06-2004, 09:03
non ti è mai venuta in mente la gestione degli errori?????
prova in questo modo:

Dim a as Long
a=Shell("d:\programmi\mozilla firefox\firefox.exe",vbNormalFocus)
On Error GoTo ero
'iniz: decommenta questo se sotto decommenti il goto
AppActivate a
.....codice che volevi eseguire dopo

Exit Sub
ero:
If Err.Number=5 Then 'errore che ti viene fuori
Err.Clear
Resume Next ' oppure prova con un GoTo iniz vedi sopra
Else
MsgBox("Si è verificato un errore:" & VbCrLf & Err.Description,vbCritical+vbOkOnly,"Titolo Errore : " & Err.Number)
End If


Penso che così dovresti risolvere il problema
Ciauz ^_^
Efreeti

GogetaSSJ
17-06-2004, 15:06
Originariamente inviato da efreeti
non ti è mai venuta in mente la gestione degli errori?????
prova in questo modo:


Penso che così dovresti risolvere il problema
Ciauz ^_^
Efreeti

Sono un novellino, solo poche volte sono ricorso alla gestione degli errori, sono ancora troppo poco pratico.
Se copio ed incollo quello che mi hai suggerito mi dice che l'etichetta ero non è definita.... :eek:

GogetaSSJ
17-06-2004, 15:09
Originariamente inviato da cionci
Il ritardo non è quantificabile, quindi una sleep non basta...

Usa l'API FindWindow per trovare la finestra... Se non la trovi addormentati per un secondo...e rirpova...

Come si usa Sleep? Nella Msdn non la trovo :confused:

The DeViL's
17-06-2004, 19:27
Originariamente inviato da GogetaSSJ
Come si usa Sleep? Nella Msdn non la trovo :confused:

scrivi fuori dal form cosi:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

e poi dove vuoi addormentare scrivi:

sleep 1000 per sesmpio ferma per 1 sec


ciao

GogetaSSJ
17-06-2004, 20:47
Ecco la Sleep funziona... ma c'è qualcosa che non va nell'appactivate, dopo 4 secondi (ho impostato sleep a 4000) mi restituisce il solito errore :muro: :muro:

GogetaSSJ
17-06-2004, 20:56
Ho scoperto quanto segue:

1 - Se è già aperta un'istanza di firefox, mi restituisce l'errore (ecco xkè me lo da sempre). Questo come si risolve?

2 - Se clicco sul pulsante che mi fa avvenire tutto quel ciclo, il browser si impone già come programma attivo e quindi l'appactivate non funge e tutto il resto... se seleziono il programma che ho scritto (o un'altra finestra) continua il ciclo e mi va ad aprire i tabs correttamente.

Ammazza quanti problemi che da un programmino così scemo.... :muro:
Help me!! :cry:

GogetaSSJ
17-06-2004, 21:08
Il primo problema l'ho risolto, eliminando l'appactivate e quindi avvio solo il shell :D

Una grande mano me la da lo sleep, lo imposto a 3 secondi e sono sicuro.
Come per magia il problema delle istanze è pure sparito, sempre per colpa dell'appactivate. Son contento :D :D

Be ora sono proprio apposto, posso continuare tranquillamente (spero) la creazione del software. Al prossimo problema :D

Grazie a tutti!!!!!!!!

The DeViL's
18-06-2004, 00:28
visto? avevo ragione a dirti di usare la sleep!!!... e tutti che dicevano di no!!! (che soddisfazione:D )

GogetaSSJ
18-06-2004, 00:35
Non sembra ma ci sto ancora impazzendo dietro :D
Questa volta però c'entrano gli array. Mi sono girato mezza internet ma non ho trovato quello che cerco.

In pratica, tramite un ciclo, mi voglio memorizzare i vari link che ricavo in un array... il quale richiamerò dopo per incollare i vari indirizzi nel browser.
Ma come cavolo si fa?? Di certo devo creare un array dinamico, per cui uso la funzione Redim, ma non ci ho capito tanto...

Se vado a verificare, vado a riempire un solo elemento del vettore, non riesco a farlo incrementare. Mi da per buono solo Vettore(0), gli altri non esistono mai e trovo sempre l'ultimo elemento.
Ecco la codifica presente nel ciclo:

ReDim Preserve Vettore(V)
Vettore(V) = sline
L = L + 1
V = L

La variabile L mi serve per contare quanti tabs devo aprire nel browser, V ovviamente sarà uguale ad L perchè il numero di tabs corrispondono ai link da incollare.

Dove sbaglio?

cionci
18-06-2004, 02:13
Originariamente inviato da GogetaSSJ
Una grande mano me la da lo sleep, lo imposto a 3 secondi e sono sicuro.
Come per magia il problema delle istanze è pure sparito, sempre per colpa dell'appactivate. Son contento :D :D
Sicuro no...metti che ti si avvi il browser su una macchina lenta... In tal caso 3 secondi potrebbero none ssere sufficienti... Devi usare l'API FindWindow, e se non trovi la finestra aperta vai in Sleep per un secondo...

GogetaSSJ
18-06-2004, 11:02
Per quanto riguarda la faccenda del vettore, ci sono riuscito.
Come faccio ad usare le API? Ne ho sentito parlare molte volte ma non so usarle, mi puoi spiegare meglio come fare?

Grazie

cionci
18-06-2004, 11:08
www.allapi.net e scarica ApiGuide ;)

GogetaSSJ
18-06-2004, 11:11
Grazie, vediamo cosa riesco a combinare ;)

GogetaSSJ
26-06-2004, 23:30
Eccomi qui, dopo quasi 10 giorni di lavoro e di studio (sopratutto sul mondo delle API) ho ancora bisogno di voi :D

Ho la necessità di leggere dal registro di sistema se è presente una determinata chiave e quindi effettuare delle scelte.
Ho visto che ci sono le API RegOpenKey, RegQueryValueEx ecc.. che fanno al mio caso, ma non le so usare a dovere.

Chi mi aiuta?
In pratica devo andare a controllare nel registro di sistema se è installato mozilla firefox e, se si, recuperare la path dove è installato.
Documentandomi sono arrivato alla conclusione che devo fare un check del valore che si trova qui:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\

Il valore deve essere "firefox.exe". Se è presente deve recuperare la chiave "Path"

Come faccio?
Grazie!!!

cionci
27-06-2004, 17:17
Hai guardato su APIGuide ?

GogetaSSJ
27-06-2004, 17:34
Si si, infatti quelle api le ho prese da li, ma si vede che non le so usare nel modo adeguato :(

cionci
27-06-2004, 17:45
Non ti basta questo codice ?

'This program needs 3 buttons
Const REG_SZ = 1 ' Unicode nul terminated string
Const REG_BINARY = 3 ' Free form binary
Const HKEY_CURRENT_USER = &H80000001
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long
'retrieve nformation about the key
lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
If lResult = 0 Then
If lValueType = REG_SZ Then
'Create a buffer
strBuf = String(lDataBufSize, Chr$(0))
'retrieve the key's content
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
If lResult = 0 Then
'Remove the unnecessary chr$(0)'s
RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
End If
ElseIf lValueType = REG_BINARY Then
Dim strData As Integer
'retrieve the key's value
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = strData
End If
End If
End If
End Function
Function GetString(hKey As Long, strPath As String, strValue As String)
Dim Ret
'Open the key
RegOpenKey hKey, strPath, Ret
'Get the key's content
GetString = RegQueryStringValue(Ret, strValue)
'Close the key
RegCloseKey Ret
End Function

stringa = GetString(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\","Path")

Aspetta che ti cerco il valore della costante HKEY_LOCAL_MACHINE...

cionci
27-06-2004, 17:46
Const HKEY_LOCAL_MACHINE = &H80000002

GogetaSSJ
27-06-2004, 19:00
Mi sa che provai... ma tutte quelle api basta copiarle ed incollarle così come sono?
Poi basta una semplice assegnazione per risolvere?

GogetaSSJ
18-07-2004, 12:32
Rieccomi più dubbioso che mai :D
Ora ho la necessita di aprire in modo consecutivo tutti i file presenti in una cartella.
L'idea è questa: in una cartella ci sono 4 o 5 email esportate da outlook; il programma deve aprire la prima, analizzarla, elaborarla e poi passare al file successivo, ripetendo il ciclo fino all'ultimo file.

La fase di elaborazione è già codificata, quindi vorrei sapere come mettere in pratica la prima parte dell'idea. Suggerimenti?

Grazie ancora ;)

cionci
18-07-2004, 19:07
Cerca l'API FindFirst

GogetaSSJ
18-07-2004, 19:39
Ho trovato una piccola codifica già fatta in rete ed ho risolto il problema, comunque vedrò anche questa api, grazie!!

cionci
19-07-2004, 00:04
Dovresti togliere l'immagine in firma... E' sopra la dimensione massima... Grazie ;)

GogetaSSJ
19-07-2004, 00:29
Si scusami, sono al di fuori del regolamento :(
L'ho messa senza pensarci 2 volte perchè sopratutto qui (http://forum.hwupgrade.it/forumdisplay.php?s=&forumid=10) siamo in parecchi ad usarla... sicuro non si possa mettere?