Avatar billede Pantzer Praktikant
05. september 2013 - 09:23 Der er 8 kommentarer og
1 løsning

Find navn på et felt ved hjælp af TabIndex

Jeg er ude efter et stykke kode som kan give mig navnet på det næste felt i en formular ved hjælp af nuværende tabindex.

Bruger koden "Screen.ActiveControl.TabIndex" men jeg vil gerne have navnet på det næste konkrolelement. Er der nogen der evt. har en nem måde at finde det på?

Idéen var at man først fandt indekstallet +1 og derved kunne finde navnet

har f.eks
Tab 0 = Afdeling
Tab 1 = Team
Tab 2 = Kontaktperson

Når Screen.ActiveControl.TabIndex = 1 skal den returnere strengeværdien "Kontaktperson" (ikke værdien af feltet med feltnavnet).

Public Sub NextTab()
    Dim varTab As Integer

    varTab = Screen.ActiveControl.TabIndex

    Screen.ActiveControl.Controls(varTab + 1).name
    'Denne giver dog ikke det ønskede resultat
End Sub
Avatar billede fdata Forsker
05. september 2013 - 21:58 #1
Hm. Det lader til at man skal gå via Properties:

Sub Test_NextTab()
  Debug.Print NextTab
End Sub

Function NextTab() As String
  Dim varTab As Integer
  Dim Ctl As Control
  Dim Prp As Property
 
  varTab = Screen.ActiveControl.TabIndex
 
  NextTab = "?"
  For Each Ctl In Screen.ActiveForm.Controls
    For Each Prp In Ctl.Properties
      If Prp.Name = "TabIndex" Then
        If Prp.Value = (varTab + 1) Then NextTab = Ctl.Name
      End If
    Next Prp
  Next Ctl
End Function
Avatar billede MSchlamovitz Mester
05. september 2013 - 23:25 #2
eller denne løsning: (den løber ikke alle properties igennem)
skift debug.print ud med en variabel.
(controltype 100 og 101 har ikke tabindex)


Sub NavnPåNæsteControl()
Dim D As Integer, E As Integer, K As Integer

  K = Me.ActiveControl.TabIndex

  For E = 0 To Me.Controls.Count - 1
      If Me.Controls(E).ControlType > 101 Then
        D = Me.Controls(E).TabIndex
        If D = K + 1 Then
            Debug.Print Me.Controls(E).TabIndex & ": " & Me.Controls(E).Name
            Exit For
        End If
      End If
  Next E
 
End Sub
Avatar billede Pantzer Praktikant
06. september 2013 - 12:15 #3
@ MSchlamovitz
Har forsøgt mig med noget i den stil. Udfordringen er dog, at jeg ikke kan bruge Me. i en public function i særskilt modul.

@fdata
Din løsning virker efter hensigten. Udfordringen er dog, at jeg skal bruge srengværdien sammen med .Enabled property.

Kort fortalt, skal det bruges til, at 'næste' felt bliver valgbart, når der er udfyldt en værdi i det eksisterende felt og i stedet for at lave en:

Private Sub Afdeling_AfterUpdate()
    If Nz(Me.Afdeling, "") <> "" Then
        Me.Team.Enabled = True
    Else
        Me.Team.Enabled = False
    End If
End Sub

for alle tabs, ville jeg bare gerne have en funktion, der kunne klare det for dem alle sammen på en gang.

For at bruge dit eksempel så skal bruge noget ligende nedenstående i den kaldte procedure.

Sub Test_NextTab()
        Dim thisTab As String
   
    thisTab = Screen.ActiveControl.name
   
    If Nz(thisTab, "") <> "" Then
        NextTab.Enabled = True
    Else
        NextTab.Enabled = False
    End If
End Sub
Avatar billede fdata Forsker
06. september 2013 - 12:59 #4
He he. Du bad jo bare om navnet på næste felt; men ok.

I alle felternes AfterUpdate lægger du (i stedet for [Hændelsesprocedure]) et kald af en funktion, der ligger i formularens kode, f.eks. "=ÅbnNæsteFelt()"

Function ÅbnNæsteFelt()
  NextTab
End Function

NextTab skal så rettes til:

Sub NextTab()
  Dim varTab As Integer
  Dim Ctl As Control
  Dim Prp As Property
 
  If IsNull(Screen.ActiveControl.Value) Then Exit Sub
 
  varTab = Screen.ActiveControl.TabIndex
 
  For Each Ctl In Screen.ActiveForm.Controls
    For Each Prp In Ctl.Properties
      If Prp.Name = "TabIndex" Then
        If Prp.Value = (varTab + 1) Then Ctl.Enabled = True
      End If
    Next Prp
  Next Ctl
End Sub
Avatar billede Pantzer Praktikant
06. september 2013 - 14:12 #5
Jeg tester det først på mandag, men kan din kode også tage højde for, at værdien også kan ændres til "False"? Eller kan jeg bare smide If Nz(nameTab, "") <> "" Then ind så koden kommer til at se sådan ud:

Sub NextTab()
  Dim varTab As Integer
  Dim nameTab As string
  Dim Ctl As Control
  Dim Prp As Property
 
  If IsNull(Screen.ActiveControl.Value) Then Exit Sub

  nameTab = Screen.ActiveControl.name
  varTab = Screen.ActiveControl.TabIndex
 
  For Each Ctl In Screen.ActiveForm.Controls
      For Each Prp In Ctl.Properties
          If Prp.Name = "TabIndex" Then
              If Prp.Value = (varTab + 1) Then 'Ctl.Enabled = True
                  If Nz(nameTab, "") <> "" Then
                      Ctl.Enabled = True
                  Else
                      Ctl.Enabled = False
                  End If
              End If

          End If
      Next Prp
  Next Ctl
End Sub
Avatar billede fdata Forsker
06. september 2013 - 15:36 #6
Det er jo lidt svært at følge med, når du hele tiden ændrer formuleringerne ;O)

Du skrev: "... 'næste' felt bliver valgbart, når der er udfyldt en værdi i det eksisterende felt ...". Mit svar er baseret på dette.

Men jeg fornemmer, at du er helt på hjemmebane og sagtens selv kan tilrette funktionen.
Avatar billede fdata Forsker
06. september 2013 - 15:42 #7
PS:
Nu kender jeg jo ikke din opgave; men jeg ser lille udfordring i din seneste kommentar.

Eksempel:
- brugeren udfylder de første 3 felter
- herefter går han tilbage og sletter indholdet i felt 2
- nu er felt 3 udfyldt; men disabled, og kan ikke rettes før der er skrevet et eller andet i felt 2

Det kan måske forvirre, at man skal udfylde et felt for at rette et andet.

Måske en lille warning (når felt 2 slettes) kunne hjælpe brugeren på rette vej?

Bare en lille, venlig strøtanke.
Avatar billede Pantzer Praktikant
06. september 2013 - 15:48 #8
Ja, det er også tarveligt at holde hen på den måde. ;)

Jeg takker for dit svar, der er helt sikkert noget jeg kan arbejde videre med.
Havde godt tænkt tanten omkring rettelser i tidligere felter og hvad der skulle ske derefter, men tak for kommentaren og her er dine mere end velfortjente point! :)
Avatar billede fdata Forsker
06. september 2013 - 16:10 #9
Jamen, selv tak for de pæne ord og point  ;O)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester