Office az office-ban

Többlapos űrlap/karton vezérlőelem (Tab control) formázása adattartalomtól függően

2020/01/04. - írta: BG84

A Karton vezérlőelemmel több lapos űrlapokat készíthetünk, mely nagyobb mennyiségű vezérlőelemek esetén az űrlapot sokkal rendezettebbé, átláthatóbbá teheti. Felépítése hasonló a már sok programnál alkalmazotthoz: adott számú lapfülek, melyekre kattintva az odatartozó lapot jeleníti meg, a ráhelyezett vezérlőelemekkel együtt. Létrehozása nem bonyolult, a mostani bejegyzésnek sem ez lesz a témája, hanem a formai megjelenése.

A vezérlőelem formázási lehetőségei ugyanis nem az igaziak. Keretet állítani, az összes fül színét változtatni vagy a hátterét módosítani ugyan nyilván fontos lehet, de használhatóság szempontjából feltételes formázás lehetősége nagyon hiányzik.

Ezzel el is jutottunk a gyakorlati problémához: azt szeretném elérni, hogy az egyes tabulátorokon lévő mezők értékéhez kötötten eltérő színűek legyenek a fülek. Miért hasznos ez? Képzeljünk el egy 6 tabból álló karton vezérlőelemet, mind a hat tabon lehetnek adatok, de nem kötelezőek. Honnan tudjuk, hogy melyik fülön van feltöltött adat? Végig kattintgatjuk őket. A problémát gyorsan megoldaná, ha mondjuk az adattal rendelkező tabok fülei eltérő háttérszínt vennének fel.

Az Access vezérlőeleme ezt a lehetőséget nem kínálja fel, ilyen formázási lehetőség nem áll rendelkezésre, ezért a VBA segítségét kell hívnunk.

Példa

Adott egy MS Access Űrlap, ami üzleteket jelenít meg, és az ahhoz tartozó szerződések adatait. Egy üzlethez maximum 6 szerződés tartozhat, mindegyik szerződés külön lapon van megjelenítve.

Az űrlap karton vezérlőelemét az alábbiak szerint szeretnénk módosítani:

  • az adattal feltöltött lapok füleit zöld színnel jelölje;
  • ha nincs adat, akkor legyen szürke;
  • az aktuálisan kiválasztott lap füle fehér színű legyen.

 access_tab_1.jpg

 

Megoldás

Access űrlap tervező nézet

1.) Hozzunk létre 6 db címke (Label) vezérlő elemet, azonos mérettel és formázással, majd helyezzük egymás mellé őket úgy, hogy ne legyen szünet kettő között (ezek lesznek az új "fülek"). 

2.) Jelöljük ki a 6 db címkét, és hozzuk őket előtérbe a megjelenítés szempontjából: jobb egérgomb --> "Elhelyezés" --> "Előrehozás". Így most már ha más elemekre ráhúzzuk, akkor az előtérbe maradnak, kitakarva a többi elemet. 

access_tab_2.jpg

3.) Az eredeti tab fülekre ráhúzva kitakarja az eredetit, így már csak az általunk létrehozott, "álfülek" lesznek láthatóak az űrlapon. 

access_tab_3.jpg

 VBA

 Eljárások

0.) megjegyzés: a rekordléptetőkhöz külön eljárást írtam (JumpButton()), melyek elvégzik a megfelelő rekordra ugrást, de ez nem tartozik a tárgyhoz

1.) TabClick()

 Public Sub TabClick(Optional iEventNumber As Integer = 1)
'1.) jump to the chosen tab
    Controls("TAB_CONTRACT" & iEventNumber).SetFocus
'2.) open the colouration procedure
    Call TabColouration(iEventNumber)
End Sub

 Magyarázat:

  • opcionális argumentum: ha nem adja meg, akkor az elsőt vesz alapértelmezett tabnak;
  • ráugrik a kiválasztott tabra;
  • meghívja a színező eljárást: TabColouration().

 

2.) TabColouration()

Public Sub TabColouration(Optional iEventNumber As Integer = 1)

'0.) inicialization
    Dim lngFilledTabColour As Long, lngEmptyTabColour As Long, lngActiveTabColour As Long
    Dim ctrlEventCode As Control, ctrltab_LE As Control
    Dim i As Integer
    lngFilledTabColour = RGB(196, 189, 151) 'green
    lngEmptyTabColour = RGB(217, 217, 217)  'grey
    lngActiveTabColour = RGB(255, 255, 255) 'white
   
'1.) colouration of each tabs according to the the fulfill of the "EventCode" boxes
    For i = 1 To 6
        Set ctrlEventCode = Controls("EventCode" & i)
        Set ctrltab_LE = Controls("lbl_tabCONTRACT" & i)
       
        If (ctrlEventCode.Value = "" Or IsNull(ctrlEventCode.Value) = True) Then
            ctrltab_LE.BackColor = lngEmptyTabColour
        Else
            ctrltab_LE.BackColor = lngFilledTabColour
        End If
    Next
   
'2.) colouration of the actual tab
    Controls("lbl_tabCONTRACT" & iEventNumber).BackColor Color = lngActiveTabColour
End Sub

Magyarázat:

  • a használt színek deklarálása RGB kódokkal: lngFilledTabColour, lngEmptyTabColour, lngActiveTabColour;
  • az összes tab végignézi, és a feltételek szerint használja a megadott színeket;
  • legvégén az aktuális tabot külön színnel jelöli. 

Meghívás:

eseményvezérlet eljárás: kattintásra (on-lick):
  • egyes tabok: itt az aktuális tab számával hívja meg az eljárást,
  • rekordléptetők: szám nélkül hívja meg, így az alapértelmezett az első tab lesz, ezekre ugrik rá

access_tab_4.jpg

Űrlaptulajdonságok, eseményvezérlet eljárás: betöltésre (OnLoad):
  • a karton vezérlőelemet tartalmazó űrlap megnyitásához.

access_tab_5.jpg

 Végeredmény:

access_tab_6a.jpgaccess_tab_6b.jpg

A képeken jól látható a végeredmény: a Földszint 2-es üzlet esetében az 1. és a 4. szerződésen van érvényes adat, ezeket színezi, az aktuálisan kiválasztott tabot pedig fehérrel jelöli. Az 1 emelet 3-as üzletében az 1. és a 3. szerződés aktív, ezeket jelöli külön színnel.

A bemutatott példa zip-be tömörítve, forráskódokkal együtt letölthető az alábbi linkről: OfficeHelp.Blog.hu_tab_control.zip

 

 

Szólj hozzá!

A bejegyzés trackback címe:

https://officehelp.blog.hu/api/trackback/id/tr107461846

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása