knoppen sorteren als andere knoppen niet zichtbaar zijn.

Status
Niet open voor verdere reacties.

klablabla

Gebruiker
Lid geworden
28 apr 2008
Berichten
116
Wij hebben een menu, voordat we naar het menu gaan loggen ze in.
Nu kijkt het menu welke rechten de persoon heeft die inlogd. (in een tabel)

Wat er nu gebeurd is dat er totaal 30 knoppen zijn.
Als ze geen rechten hebben tot bepaalde knoppen zet ik deze op "visible = false".

Er vallen dus gaten in het menu. graag zou ik deze netjes onder elkaar zetten. Voor elke gebruiker appart.

Nu kan ik voor elke mogelijkheid van zichtbare knoppen de left en top bepalen per knop. Maar dan wordt de code super lang.

Iemand ideeen om de knoppen netjes onder elkaar te krijgen?
 
Als je de knoppen dynamisch wilt plaatsen, kun je met variabelen en constanten werken, en de knoppen een identieke naam+volgnummer geven. Je hebt al een routine/functie waarmee je de knoppen zichtbaar of onzichtbaar maakt, en die kun je prima gebruiken voor de plaatsing. Je geeft geen voorbeeldbestandje, dus je zult zelf e.e.a. moeten uitwerken, maar het idee is deze:
Maak een lus die door alle knoppen met de vastgelegde naam loopt. Zo'n naam bestaat dan uit een voorvoegsel en een nummer. Iets als:

Code:
Sub testje()
Const iL = 100
Const iT = 100
Const iB = 4000
Const iH = 1000
Dim i As Integer, iKnop As Integer, iRij As Integer

For i = 1 To 30
    If Me("cmdKnop" & i).Visible = True Then
        iKnop = iKnop + 1
        If iKnop Mod 6 = 0 Then
            iRij = iRij + 1
            iKnop = 1
        End If
        Me("cmdKnop" & i).Left = (iL + iB) * iKnop Mod 6
        Me("cmdKnop" & i).Top = (iT + iH) * iKnop Mod 6
    End If
Next i
End Sub
Deze code zou (als hij werkt) maximaal 30 knoppen in 5 rijen van 6 knoppen op het scherm moeten zetten. Alleen heb ik 'm niet getest; het is kortom meer een schets van hoe de procedure er uit zou kunnen zien.
 
Helaas kan ik niet heel de DB sturen ondertussen 115mb voor het programma en 400mb aan data.
Even kort wat knoppen bij elkaar gezet, en knoppen gemaakt die een andere inlog moet simuleren.
Het is gemaakt in access 2007.

Bekijk bijlage dynamische knoppen.zip

Zelf zal ik alvast kijken hoe ik jou code kan implementeren.
 
Ik zal er eens naar kijken!
 
Ik zat er niet ver naast mijn dummycode:

Code:
Sub testje()
Const iL = 200
Const iT = 200
Const iB = 1700
Const iH = 400
Dim i As Integer, iKnop As Integer, iRij As Integer, iFacK As Integer, iFacR As Integer

For i = 1 To 30
    If Me("Knop" & i).Visible = True Then
        iKnop = iKnop + 1
        iFacR = iKnop Mod 6
        If iFacR = 0 Then
            iFacK = iFacK + 1
            iFacR = 1
        End If
        With Me("Knop" & i)
            .Width = iB
            .Height = iH
            .Left = iL + (iL + iB) * iFacK
            .Top = (iT + iH) * iFacR
        End With
    End If
Next i
End Sub
Dit is een werkende code, gebaseerd op 6 rijen knoppen in 5 kolommen. Op basis van constanten voor de breedte en hoogte van de knop, en de top en links positie, loopt de procedure door alle knoppen, en stelt de hoogte en linker positie in op basis van de zichtbaarheid. Om het je makkelijk te maken, ook nog het werkende voorbeeldje :)
 

Bijlagen

Hij werkt geweldig super bedankt.

Ga nu kijken hoe ik hem kan laten beginnen vanaf left 10cm en top 3cm.
 
Laatst bewerkt:
Nu ben ik begonnen met implementeren van de code.
Maar ik raak per rij 1 knop kwijt.
Ook als ik jou versie open zie ik niet alle 30 knoppen als ze allemaal visible zijn.

Verder heb ik er 2 rijen van gemaakt.

Nu nog kijken waarom er 1 knop per rij verdwijnt.
en hoe ik hem vanaf left 10cm en top 3cm kan laten beginnen.

Maar het begin is SUPER.
 
En daar heb je gelijk in :) De code gaat iets te snel over naar de volgende rij, en dat komt doordat 6 Mod 6 0 is, en de kolom vervolgens te snel wordt verhoogd. Dat is op te lossen door de rij te verhogen nadat de laatste knop is geplaatst, in plaats van ervoor. De code wordt dan:

Code:
Function KnoppenIndelen()
Const iL = 200, iT = 200, iB = 1700, iH = 400
Dim i As Integer, iKnop As Integer, iRij As Integer, iFacK As Integer, iFacR As Integer
Dim bNext As Boolean

For i = 1 To 30
    If Me("Knop" & i).Visible = True Then
        iKnop = iKnop + 1
        iFacR = iKnop Mod 6
        If iFacR = 0 Then
            bNext = True
            iFacR = 6
        End If
        With Me("Knop" & i)
            .Width = iB
            .Height = iH
            .Left = iL + (iL + iB) * iFacK
            .Top = (iT + iH) * iFacR
        End With
        If bNext = True Then
            iFacK = iFacK + 1
            iFacR = 1
            bNext = False
        End If
    End If
Next i
End Function
 
Het werk nu helemaal. Alleen zou ik graag het beginpunt op een andere plek willen. left 10cm en top 3cm.
Hoe kan ik dit het makkelijkst doen.

De code heb ik iets aangepast: (En het werkt super)

Code:
Function KnoppenIndelen()
Const iL = 200, iT = 60, iB = 3800, iH = 400
Dim i As Integer, iKnop As Integer, iRij As Integer, iFacK As Integer, iFacR As Integer
Dim bNext As Boolean

For i = 1 To 30
    If Me("Knop" & i).Visible = True Then
        iKnop = iKnop + 1
        iFacR = iKnop Mod 15
        If iFacR = 0 Then
            bNext = True
            iFacR = 15
        End If
        With Me("Knop" & i)
            .Width = iB
            .Height = iH
            .Left = iL + (iL + iB) * iFacK
            .Top = (iT + iH) * iFacR
        End With
        If bNext = True Then
            iFacK = iFacK + 1
            iFacR = 1
            bNext = False
        End If
    End If
Next i
End Function
 
De maatgeving is, zoals je al gezien hebt, niet in centimeters, maar in Twips. Daarbij is een twip 1/1440 deel van een inch. Dus een twip omrekenen naar centimeters is niet heel makkelijk. Wat ik zelf doe is daarom een foefje toepassen.
Zet een teksvak of label o.i.d. op de door jou gewenste positie op het formulier. Laten we hem Testvak noemen, en je zet hem dus a.d.h. van de liniaal en het Eigenschappen op Links=10 cm, en Boven=3 cm.
Vervolgens maak je een knop met deze code:
Code:
    Msgbox Me.Tesvak.Top & VbCrLf & Me.Tesvak.Left
Deze geeft de positie in Twips, en die getallen schrijf je dus op. Het enige wat je verder nog moet doen, is de basispositie van de eerste knop daarmee instellen, en optellen bij de overige waarden. Je hebt dus twee extra constanten nodig, want iL is dan alleen de horizontale tussenruimte tussen de knoppen, en iT de verticale tussenruimte.
 
top is 1360
left is 5555

Maar nu de vraag hoe zet ik die twee extra constanten erin?
 
Bij mij zijn de waarden iets anders; komt natuurlijk omdat TWIPS schermafhankelijk zijn. Dus mijn voorbeeldje ziet er nu zo uit:

Code:
Function KnoppenIndelen()
Const iL = 200, iT = 200, iB = 1700, iH = 400
Dim i As Integer, iKnop As Integer, iRij As Integer, iFacK As Integer, iFacR As Integer
Dim iStartTop As Integer, iStartLinks As Integer
Dim bNext As Boolean

iStartTop = 1700 - iT
iStartLinks = 5670 - iL

For i = 1 To 30
    If Me("Knop" & i).Visible = True Then
        iKnop = iKnop + 1
        iFacR = iKnop Mod 6
        If iFacR = 0 Then
            bNext = True
            iFacR = 6
        End If
        With Me("Knop" & i)
            .Width = iB
            .Height = iH
            .Left = iStartLinks + iL + (iL + iB) * iFacK
            .Top = iStartTop + (iT + iH) * iFacR - iH
        End With
        If bNext = True Then
            iFacK = iFacK + 1
            iFacR = 1
            bNext = False
        End If
    End If
Next i
End Function
Je moet de oorspronkelijke startwaarden van de beginpositie aftrekken, omdat ze er in de lus weer bij worden opgeteld.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan