Nello specifico vorrei far avanzare la textbox al controllo successivo
Ma non va bene... io non voglio dare il focus ad un altro controllo, voglio solo uscire da questo passando attraverso il suo evento _LostFocus
Non capisco se vuoi dare il focus ad un altro controllo oppure no.
Comunque :
PUBLIC SUB TextBox1_KeyPress()
IF Key.Code = Key.Return THEN
TextBox2.SetFocus
TextBox1_LostFocus()
ENDIF
END
PUBLIC SUB TextBox1_LostFocus()
Label1.Text = "Eseguito textbox1_lostfocus"
END
se non vuoi che il focus vada su textbox2 tralasci la riga textbox2.setfocus. Il focus deve andare per forza da qualche parte.
Ho notato anche io che tab utilizza un suo metodo (in base alla creazione) per memorizzarsi il suo index, non so se si può modificare da codice.
Per il tuo problema è semplice intercetti l'evento KeyPress e ci metti un select per passare i focus
Esempio: primo select intercetta i tasti invio, return e freccia giu e sposta in basso il focus, il secondo select intercetta freccia su e sposta in alto il focus.
A dimenticavo tutti i controlli fanno parte di un gruppo (texA) e a ogni controllo ho messo un numero nel tag, nel gruppo ci puoi mettere anche controlli diversi (label, text, button ecc..)
In alternativa se non vuoi creare ne gruppo ne tag intercetti l'evento Keypress di ogni singolo controllo e fai dare il focus a quello successivo
PUBLIC SUB TexA_KeyPress()
SELECT Key.code
CASE Key.Enter, Key.Return, Key.down
SELECT (LAST.tag)
CASE 2
TextBox3.SetFocus
CASE 3
TextBox4.SetFocus
CASE 4
TextBox5.SetFocus
CASE 5
TextBox9.SetFocus
CASE 9
TextBox10.SetFocus
CASE 10
TextBox11.SetFocus
CASE 11
TextBox12.SetFocus
CASE 12
TextBox13.SetFocus
CASE 13
TextBox14.SetFocus
CASE 14
TextBox15.SetFocus
CASE 15
TextBox26.SetFocus
CASE 16
TextBox17.SetFocus
CASE 17
TextBox18.SetFocus
CASE 18
TextBox19.SetFocus
CASE 19
TextBox20.SetFocus
CASE 20
TextBox21.SetFocus
CASE 21
TextBox22.SetFocus
CASE 22
TextBox23.SetFocus
CASE 23
TextBox24.SetFocus
CASE 24
TextArea1.SetFocus
CASE 25
TextArea1.SetFocus
CASE 26
TextBox16.SetFocus
END SELECT
CASE Key.up
SELECT (LAST.tag)
CASE 3
TextBox1.SetFocus
CASE 4
TextBox3.SetFocus
CASE 5
TextBox4.SetFocus
CASE 9
TextBox5.SetFocus
CASE 10
TextBox9.SetFocus
CASE 11
TextBox10.SetFocus
CASE 12
TextBox11.SetFocus
CASE 13
TextBox12.SetFocus
CASE 14
TextBox13.SetFocus
CASE 15
TextBox14.SetFocus
CASE 16
TextBox26.SetFocus
CASE 17
TextBox16.SetFocus
CASE 18
TextBox17.SetFocus
CASE 19
TextBox18.SetFocus
CASE 20
TextBox19.SetFocus
CASE 21
TextBox20.SetFocus
CASE 22
TextBox21.SetFocus
CASE 23
TextBox22.SetFocus
CASE 24
TextBox23.SetFocus
'CASE 25
'TextBox24.SetFocus
CASE 26
TextBox15.SetFocus
END SELECT
END SELECT
END
Siccome non sono riuscito a trovare un qualcosa per scombinare da codice questo benedetto ordine dei controlli in un form, ho fatto una piccola classe statica che da la possibilità appunto di riordinare a piacimento il focus degli oggetti da codice...
La classe si chiama Sequence ed e' una classe di tipo statica.
Si utilizza in questo modo:
Nella Sub _new, o nell'evento Form_Open:
Sequence[ME].Move(ControlName As String, Optional Previous As String)
Il controllo precedente,se non viene dichiarato, fa passare l'oggetto alla prima posizione.
Es. (compreso nei sorgenti):
With Sequence[Me]
.Move(Me.SpinBox1.Name)
.Move(Me.TextBox1.Name, Me.SpinBox1.Name)
.Move(Me.Button2.Name, Me.TextBox1.Name)
.Move(Me.Button1.Name, Me.Button2.Name)
.Move(Me.TextBox2.Name, Me.Button1.Name)
End With
naturalmente non si e' obbligati a rifare completamente la gerarchia, ma si puo' solamente spostare quello che serve ;)
Ho aggiunto anche qualche altra diavoleria per gestire la classe:
Sequence[Me].AddIgnoreClass(ClassName As String)
Questa sub serve a escludere dalla gerarchia tutti gli oggetti che fanno parte di una medesima classe genitore. Di default (come in Gambas d'altronde) ho gia escluso Label, TextLabel e tutti i tipi di contenitori.
Sequence[Me].AddKey(Key As Integer, Optional Back As Boolean)
Questo metodo serve ad aggiungere Key.code che fanno spostare il focus degli oggetti. L'opzione Back settata a True fe retrocedere il Focus (vedi BackTab)
Property Enabled As Boolean
Settata di default a True. Se False abilita la gerarchia originale del Form.
Spero che a qualcuno possa servire ;)
Non so se odiarti o adorarti... ;D
Sono stato tutta la sera a scrivere una SUB demente da richiamare ad esempio agli eventi _Keypress... e quando la stavo per postare ho letto il tuo intervento!
Sei eccezionale! Me la scarico subito... e la provo immediatamente! :2birre:
PS: giusto per la cronaca... questa era la Sub che avevo scritto applicabile a "gruppi" di controlli... :-[
Public Sub myfocus(tasto As Integer, objPrev As Control, objNow As Control, objNext As Control)
If Last.name = objNow.name Then
Select Case tasto
Case Key.Return, Key.Down, Key.Enter, Key.Tab
Stop Event
Try objNext.SetFocus
Try objNext.SelectAll
Case Key.BackTab, Key.Up
Stop Event
Try objPrev.SetFocus
Try objPrev.SelectAll
End Select
Endif
Catch
Message("Si è verificato un errore nella pressione del tasto!")
End
PPS: le due ore le ho impiegate a capire se potevo addirittura ;D creare una stringa con i nomi in sequenza dei controlli... e poi far fare tutto alla SUB.
Mi sono arenato sul passaggio da nome_controllo As stringa --> nome_controllo As Control. ???
PPPS: cmq alla fine mi sono anche reso conto che la cosa sarebbe stata applicabile ai controlli txt, ma le Searchbox ho visto che sono restie all'evento _Keypress (sui tasti: Key.Return, Key.Enter, Key.Up, Key.Down, ecc.), e si bloccava la sequenza. :-\
Ok ho sconvolto tutto, perchè mi dava problemi con oggetti composti da piu' controlli...
Il problema e' che adesso si e' obbligati a passare tutti i controlli presenti nel form, pena l'esclusione dal SetFocus.
With Sequence[ME].Order
.Add(Me.Button1)
.Add(Me.Button2)
.Add(Me.TreeView)
End With
Sequence[Me].Enabled = True
Praticamente gli passo un Array di oggetti e 'attivo' l'ordine con la proprietà Enabled = True
Mi andava in errore alla riga 70 (quando dal primo tornavo sull'ultimo)...
Avevi scritto: $Order.Max.SetFocus()
L'ho corretto così: $Order[$Order.Max].SetFocus()
Mi sembra già ottimo! Solo che non funziona con le searchbox...
PS: ho scritto una piccola Sub, di nome SequenzaFocus, che setta Sequence.
In pratica anziché scrivere il WITH... .Add(...), .Add(...)... --> ho messo così nel _new(): SequenzaFocus(True, FAccnew, "txtCognome,txtNome,txtSex,txtGG")
E la funzione è questa:
Public Sub SequenzaFocus(funzionante As Boolean, finestra As Window, sequenza As String)
Dim obj As String[]
Dim i As Integer
obj = Split(sequenza, ";, ")
For i = 0 To obj.Max
Object.SetProperty(Sequence[finestra], "Order.Add", finestra.obj[i])
Next
End
Il programma non va in errore, ma diventa ...grigio. E devo interrompere l'esecuzione.