Newsgroup: it.comp.lang.visual-basic
Titolo: ?Muoversi tra i controlli

Volevo sapere se nelle applicazioni che fate, date all'utente la possibilità
di spostare il focus tra i controlli solo con il tasto TAB, oppure anche con
il tasto INVIO come si faceva con DOS.
Carmelo

 ha scritto nel messaggio
news:DS1Md.12064$lB4.3...@twister1.libero.it...

Secondo me la cosa migliore sarebbe di far spostare il focus solo con il TAB
visto che in windows si usa cosi ; purtroppo pero' molti utenti , magari
quelli un po piu "anziani" ,usano INVIO e non c'e' verso di fargli cambiare
idea.
Io faccio cosi: Faccio usare il TAB , se mi chiedono di poter usare INVIO ,
ci metto una "sovrattassa". ;-)
Ciao.


Solo se dimostrano che tutti gli altri programmi (nativi per Windows) che 
hanno installati si comportano allo stesso modo... finora non e' mai stato 
necessario implementare la funzione :-)
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 


YES!...ma dipende dalla applicazione!
perchè spesso si deve considerare che la vecchia interfaccia a caratteri è
ancora la più valida per massicce introduzioni di dati!
spesso non solo l'enter ma anche f1 f2 f3 etc etc
perchè tutti potranno dir tutto...ma spesso si sottovoluta cosa fa una
tastiera nelle mani di una segretaria o impiegata esperta!
Logicamente devi dare modo di usarla la tastiera!
Private Sub txtRiga3_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
    SendKeys "{Tab}", True
End If
End Sub
etc etc
i
-- 
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici


Perchč KeyUp e non KeyPress?
Carmelo

 Carmelo
sigh...ti fa fatica premere F1???
se premi F1 leggi tra le altre cose in KeyPress
"....
Utilizzare le routine di eventi KeyDown e KeyUp per gestire le sequenze di
tasti non riconosciute da KeyPress, come ad esempio itasti funzione, itasti
di modifica, i tasti di spostamento e qualsiasi combinazione di questi tasti
con modificatori di tastiera. A differenza degli eventi KeyDown e KeyUp,
KeyPress non indica lo stato fisico della tastiera, ma passa un carattere.
KeyPress interpreta un carattere maiuscolo e il corrispondente carattere
minuscolo come due codici distinti, ovvero come due caratteri diversi. Gli
eventi KeyDown e KeyUp, invece, interpretano i caratteri maiuscoli e
minuscoli in base a due argomenti, ovvero l'argomento keycode che indica il
tasto fisico e restituisce quindi "A" maiuscolo e "a" minuscolo come lo
stesso tasto, e l'argomento shift che indica lo stato di shift+tasto e
restituisce quindi "A" maiuscolo o "a" minuscolo.
....
"
ti basta come risposta?
-- 
--
Il Wodkino Nazionale č a : 
www.martek.it


 End Sub
scusa wodka, ma esiste solo questo metodo con SendKeys?
Io ho circa 90 controlli su un form, e non sono in un array perché il
committente mi ha chiesto la funzione Invio=>spostamento quando la form era
già stata realizzata (giuro che per i prossimi programmi faccio tutte
matrici di controlli).
Ho provato con:
Private Sub Form_KeyDown(KeyCode As Integer)
    If KeyCode = vbKeyReturn Then KeyCode = vbKeyTab
End Sub
ma naturalmente non funziona (non so però perché).
Esiste un modo senza implementare 90 volte "Private Sub txtXXX_KeyUp(KeyCode
As Integer)...."?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 As Integer)...."?
Beh, quello che potete fare nella gestione dell'evento è:
1) Cercare in quale posizione è Form.ActiveControl nella collezione 
Form.Controls, in modo da conoscere l'indice nella collezione Controls 
in cui si trova il controllo attuale;
2) Da questa posizione in poi, scorrere indietro fino a trovare un 
TextBox, per esempio, in questo modo:
'Mettiamo che posizione contenga la posizione trovata nel punto 1
do while posizione>0
	posizione=posizione-1
	if typeof Form.Controls(posizione) is TextBox
		'Ok, ho trovato il textbox successivo a quello attuale
	end if
loop
Tenendo in considerazione che posizione non può essere negativo e che 
quindi, una volta arrivato a 0 debba ricominciare da Form.Controls.count.
Se avete ancora difficoltà, fatemi sapere.
-- 
Ciao,
	Fabrizio
===  
http://www.negusweb.it
  ===

 loop
l'idea è buona. Se riesco a identificare il punto di partenza, la provo.
Come mai vai all'indietro?


 ha scritto nel messaggio
news:151Z37Z70Z25Y1...@usenet.libero.it...


> e se ti crei una classe e la agganci ai text control non č + semplice?
non sono sicuro di aver capito. Potresti essere piů preciso? (Con comodo,
perchč ora vado a nanna e vedrň la risposta domattina)
Comunque i controlli su cui devo agire non sono soltanto Text, ma anche
OptionButtons (array contenuto in un frame), Combobox, Listbox,
CommandButtons, PictureBox, SSTabs, Sliders e Scrollbars, anche se per
adesso mi basta capire il concetto sulle textbox.


 l'indice?
Proprio la settimana scorsa avevo il tuo stesso problema, con una
ventina di form in cui dovevo scorrere tra un textbox ed il successivo
(o precedente) tramite tasti freccia su e giu.
Allora ho pensato bene di generalizzarlo nel modo descritto nel
messaggio procedente. Per completezza ti posto la routine, che basta
copiare ed incollare  nel form per vederla funzionare.
----------------------------------------------------------------------
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim k As Long
    Dim incremento As Integer  'Serve per sapere se vado avanti o
indietro
    'Freccia su
    If KeyCode = 38 Then incremento = 1
    'Freccia giu
    If KeyCode = 40 Then incremento = -1
    'Invio
    If KeyCode = 13 Then incremento = -1
    'Cerca il controllo attivo
    k = 0
    Do While Not (Me.Controls(k) Is Me.ActiveControl)
        k = k + 1
    Loop
    k = k + incremento
    If (k > Me.Controls.Count - 1) Then k = 0
    If (k < 0) Then k = Me.Controls.Count - 1
    Do While Not (TypeOf Me.Controls(k) Is TextBox)
        k = k + incremento
        If (k >= Me.Controls.Count - 1) Then k = 0
        If (k < 0) Then k = Me.Controls.Count - 1
    Loop
    Call Me.Controls(k).SetFocus
End Sub
------------------------------------------------------------------
Fammi sapere,
    Fabrizio

 Call Me.Controls(k).SetFocus
Dunque, il problema è che sembra che i controlli siano stati aggiunti alla
collection Controls secondo un loro ordine, per cui lo spostamento segue un
ordine particolare.
Invece ho trovato la soluzione di muovermi secondo il valore di TabIndex. In
questo modo però alcuni controlli (es. le Label) non posoono ricevere il
focus per cui ho aggiunto un gestore di errori.
Inoltre io utilizzo un controllo SSTab, che sebbene abbia quattro linguette,
ha sempre la stessa proprietà TabIndex, per cui ho dovuto gestire a parte i
controlli inclusi in ogni singolo tab. Ne è venuta fuori una routine
mastodontica e altamente personalizzata.
Forse forse il metodo con SendKeys era più semplice...
Ciao


 mastodontica e altamente personalizzata.
Cioè vorresti spostarti anche sulle linguette successive, dopo aver
raggiunto, per esempio, l'ultimo controllo di una linguetta ?

 raggiunto, per esempio, l'ultimo controllo di una linguetta ?
si, esatto. L'ho fatto, ma il problema è che il codice non è molto
riutilizzabile perchè devo inserire come costanti i valori di TabIndex dei
controlli di ogni linguetta.
If ActiveControl = SSTab Then
    If SSTab.Tab = 0 Then vai dal 4 al 16
    Elseif Tab = 1, vai dal 17 al 35....
Nelle altre form posso soltanto riutilizzare il concetto, ma devo codificare
ancora a mano i valori di TabIndex, anzi lo devo fare anche in questa form
se aggiungo o tolgo un controllo, e questo non è un buon esempio di
programmazione.
Avevo chiesto aiuto anche in un forum in inglese, se vuoi vedere la routine
postata (senza le personalizzazioni per gestire il controllo SSTab) il link
è
http://www.andreavb.com/forum/viewtopic_5537.html
Se poi vuoi che ti posti la routine completa basta chiedere, ma ti ripeto
che per riutilizzarla va personalizzata.
Ciao e grazie ancora.
