Intanto che penso a qualcosa di alternativo, ti allego il file di Golia che mi sono permesso di cambiare, magari ti può servire da spunto.
Il tuo codice può contenere il problema paventato da kicco (" tutto funziona a patto che la tabella non si allunghi e diventi scorrevole con i cursori laterali. A quel punto la corrispondenza va persa."), qualora la tabella interna della TableView nel tuo programma venga as assumere una dimensione (data dalla somma delle altezze di tutte le righe presenti) superiore all'oggetto TableView (determinando così la comparsa dei cursori laterali e la capacità di scorrere in alto ed in basso).
La TableView, come anche la GridWView, possiede come proprio oggetto Children una ScrollArea, la quale consente - muovendo i cursori laterali in basso ed in alto - di poter osservare tutta la TableView, qualora la somma delle altezze delle righe in essa presenti superi l'altezza della TableView medesima.
Se si presenta questa circostanza anche con il tuo codice, la corrispondenza del Button con una determinata cella si perde facendo scivolare con i cursori laterali la ScrollArea della TableView in basso o in alto.
Ad ogni modo si dovrà utilizzare proprio l'oggetto figlio della TableView, ossia la ScrollArea, come base sulla quale porre eventuali oggetti (come appunto i Button), avendo cura di ancorarli saldamente per evitare la perdita di corrispondenza con lo scorrere in alto ed in basso della ScrollArea.
Propongo questo codice:
Private bt As Button
Private sa As ScrollArea
Public Sub Form_Open()
Dim b As Byte
Dim obs As Observer
With TableView1
.Columns.Count = 4
' Volutamente creiamo una "TableView" la cui altezza sia minore della somma delle altezze delle righe in essa contenute:'
.Rows.Count = 30
End With
sa = TableView1.Children[0]
obs = New Observer(sa) As "Scrollo"
' Creiamo due Button da porre nella "TextView":'
For b = 1 To 2
With bt = New Button(sa) As "Tasto"
.X = 0
.Y = TableView1.Rows[b].Y
.W = 40
.H = TableView1.Rows.H
.Name = CStr(b)
.Text = CStr(b)
End With
Next
End
Public Sub Tasto_Click()
Print "E' stato premuto il tasto: "; Last.Name
End
Public Sub Scrollo_Scroll()
Dim ob As Object
Dim b As Byte
For Each ob In sa.Children
Inc b
' Le risorse, che ci servono, sono le proprietà ".ScrollY" e ".ScrollX" della "ScrollArea" '
ob.Y = TableView1.Rows[b].Y - sa.ScrollY
ob.X = TableView1.Columns[0].X - sa.ScrollX
Next
End
...attualmente non so come creare l'effetto del passaggio degli oggetti al di sotto della riga dell'header della TableView.
Nel frattempo possiamo ricreare più o meno un effetto "sparizione/apparizione" degli oggetti, quando si trovano nei pressi dell'header con un codice che va a modificare, come segue, l'ultima routine del codice che hai allegto:
Private c As Short ' Va aggiunta questa variabile Globale ! '
.......
.......
Public Sub Scrollo_Scroll()
Dim ob As Object
Dim b As Byte
c += sa.ScrollY
For Each ob In sa.Children
Inc b
ob.Visible = True
If ob.Y < TableView1.Rows[1].Y - (ob.H / (TableView1.Rows[1].Y * 0.3)) Then ob.Visible = False
ob.Y = TableView1.Rows[b].Y - sa.ScrollY
ob.X = TableView1.Columns[4].X - sa.ScrollX + 40
Next
' Forse questo passaggio si può semplificare un po'..... :-D
If sa.Children[0].Y < (TableView1.Rows[1].Y - (sa.Children[0].H * 0.3)) Then sa.Children[0].Visible = False
If (sa.Children[0].Y > (TableView1.Rows[1].Y - (sa.Children[0].H * 0.3))) And (sa.Children[1].Y >= TableView1.Rows[1].H) Then sa.Children[0].Visible = True
End
Vuoi dire che se hai 10000 righe inserisci 10000 pulsanti
Sììììììììììì, un mare di pulsanti che salgono e scendono dalle onde! :P
No Gianluigi, lo so che giocando coi database sei abituato a maneggiare tanti e tanti record.
Io nella lista ho al massimo massimo 50 righe. Nella realtà di norma non sono che una decina, e come piegavo sono relativa ognuna ad una apparecchiatura che interrogo via USB e raccolgo i messaggi di risposta che aggiorno in ogni riga (relativa ad una apparecchiatura). IL pulsante mi serve per aprire una TextAea nella quale riporto gli ultimi 5 record che mi servono per capire, se c'è stato un problema pregresso senza andare ad analizzare il log generale, che ha tutte le informazioni, ma che vanno spulciate con pazienza. Così invece capisco al volo se nel corso di una giornata il messaggio di malfunzionamento è già arrivato.
La frequenza dei messaggi di malfunzionamento puo essere anche di 4 ore, giusto per intenderci.
:ciao: :ciao: :ciao:
:ok: Finalmente, buon ultimo, ho capito anch'io :P
...attualmente non so come creare l'effetto del passaggio degli oggetti al di sotto della riga dell'header della TableView.
Nel frattempo possiamo ricreare più o meno un effetto "sparizione/apparizione" degli oggetti, quando si trovano nei pressi dell'header con un codice che va a modificare, come segue, l'ultima routine:
Private c As Short ' Va aggiunta questa variabile Globale ! '
.......
.......
Public Sub Scrollo_Scroll()
Dim ob As Object
Dim b As Byte
c += sa.ScrollY
For Each ob In sa.Children
Inc b
ob.Visible = True
If ob.Y < TableView1.Rows[1].Y - (ob.H / (TableView1.Rows[1].Y * 0.3)) Then ob.Visible = False
ob.Y = TableView1.Rows[b].Y - sa.ScrollY
ob.X = TableView1.Columns[4].X - sa.ScrollX + 40
Next
' Forse questo passaggio si può semplificare un po'..... :-D
If sa.Children[0].Y < (TableView1.Rows[1].Y - (sa.Children[0].H * 0.3)) Then sa.Children[0].Visible = False
If (sa.Children[0].Y > (TableView1.Rows[1].Y - (sa.Children[0].H * 0.3))) And (sa.Children[1].Y >= TableView1.Rows[1].H) Then sa.Children[0].Visible = True
End
Purtroppo non ho ancora approfondito, ma ti comunico che io di questo codice potrei farne a meno che funziona lo stesso.
' Forse questo passaggio si può semplificare un po'..... :-D
If sa.Children[0].Y < (TableView1.Rows[1].Y - (sa.Children[0].H * 0.3)) Then sa.Children[0].Visible = False
If (sa.Children[0].Y > (TableView1.Rows[1].Y - (sa.Children[0].H * 0.3))) And (sa.Children[1].Y >= TableView1.Rows[1].H) Then sa.Children[0].Visible = True
:ciao: :ciao: :ciao:
Bastava mettere prima un normale Stop Event:
Public Sub TableView_KeyPress()
' Per impedire a questi eventi di scatenare il '
' click quando passano alla riga successiva. '
Select Case Key.Code
Case Key.Right, Key.Return, Key.Enter
If TableView1.Column = 3 Then
$bNoEvent = True
Endif
' Lo so che il tab è usato dalle form per passare da un controllo ad un altro'
' Ma volevo vedere se riuscivo a catturarlo solo per la TableView.'
Case Key.Tab
Stop Event
Desktop.SendKeys("\n") ' <-----Ora con stop event funziona'
End Select
End
:ciao: :ciao:
PS Ho aggiornato il post precedente e l'allegato, ora, quanto detto poi, sembra un discorso surreale ;D
Siccome sto per andare a dormire, vi aggiorno su un piccolo passetto in avanti, ma solo per quanto riguarda ButtonDraw:
Public Sub TableView_KeyPress()
' Per impedire a questi eventi di scatenare il
' click quando passano alla riga successiva.
Select Case Key.Code
Case Key.Right, Key.Return, Key.Enter
If TableView1.Column = 3 Then
$bNoEvent = True
Endif
' Serve per spostarsi con Tab.
Case Key.Tab
If Application.ActiveControl = TextBox1 Then
If TableView1.Row = -1 Then
Desktop.SendKeys("\t")
Return
Endif
If TableView1.Row = TableView1.Rows.Count - 1 And TableView1.Column = TableView1.Columns.Count - 2 Then
Desktop.SendKeys("\t")
Else
Stop Event
Desktop.SendKeys("\n")
Endif
Endif
End Select
End
con questo codice alla fine dei tab interni tabulando ancora si da il focus ai button
Buonanotte :sleepy:
Aggiorno alla terza versione (http://www.gambas-it.org/smf/index.php?topic=4921.msg39146#msg39146), adesso non scatena l'evento click neanche a ritroso col tasto Left.
Ho inserito una combo per una lista di colonna e il tab la attraversa normalmente.
Purtroppo per quanto riguarda BackTab niente da fare almeno con questa impostazione. :'(
Ho provato sia in TableView_KeyPress che con TextBox1_KeyPres ma non sono riuscito a nulla.
Se provate ad aggiungere questo codice vedrete che con qualcosa scritto nelle textbox si evidenzierà il testo.
Questo sta ad indicare che lo Stop Event coinvolge solo il tab e non shift, infatti è lo stesso comportamento che avremmo usando i tasti Shift + Left.
Public Sub TextBox1_KeyPress()
If Key.Code = Key.BackTab Then
Stop Event
'If Key.Shift Then Stop Event
If TableView1.Column = 0 And TableView1.Row = 0 Then
Else
'Print "LEFT"
Desktop.SendKeys("[Left]")
Endif
Endif
End
:ciao: :ciao: :ciao:
Ciao Golia,
prima cosa complimenti per la soluzione anche se purtroppo non si adatta a mio ButtonDraw. :'(
A proposito, perché non hai fatto un esempio con button qui, visto il titolo, e uno con check la? :P
A me la tabulazione rimane confinata all'interno della tableview, non c'è il sistema di farla uscire in modo da ottenere il comportamento atteso da chi non usa il mouse?
Ti suggerisco questo cambiamento che oltre a tutto fa uscire il BackTab dalla tableview e sposta il focus sul pulsante (se non vuoi uscire dai confini della tableview basta rispostare Stop Event prima di If):
Case Key.BackTab
If TableView1.row = 0 And TableView1.Column = 0 Then
Return
Endif
Stop Event
Select Case TableView1.Column
Case 0
TableView1.MoveTo(TableView1.Row - 1, TableView1.Columns.Max)
Case 4
'$bNoEvent = True ' Qui non serve
TableView1.MoveTo(TableView1.Row, TableView1.Column - 2)
Case Else
TableView1.MoveTo(TableView1.Row, TableView1.Column - 1)
End Select
TableView1.Edit
:ciao: :ciao: :ciao:
PS Non ho risposto prima perché oggi da noi, paurosa tromba d'aria che ci ha tenuti oltre che in apprensione anche senza energia elettrica e naturalmente il portatile era quasi scarico. ;D
Perché non hai messo il codice fra cancelletti? Voi anziani dovete dare l'esempio :violent: