Microsoft Access-projektmenyn, när den är klar med trädvykontrollen, kommer att se ut som bilden nedan.
Bilden ovan visar rapportgruppens tredje alternativ Anpassad rapport väljs och markeras, med rapportfilterparameterformuläret öppet, överlappande menyskärmen, för användarens inmatning.
Innan vi går in på det, i förra veckans lektion, har vi lärt oss hur man organiserar de relaterade objekten i hierarkisk ordning, med hjälp av Microsoft Tree View Control, baserat på Exemplet datatabell.
Jag har påpekat förra veckan att de relaterade objekten i trädvykontrollens data inte nödvändigtvis behöver ligga bredvid varandra. Efter detta kommer du att bli mer tydlig med hur du uppdaterar Relativ Nycklar för underordnade noder, oavsett dess fysiska position för posterna i tabellen, men baserat på förhållandet till dess föräldranod-ID.
Det här var datatabellen som vi har använt och avslutat med förra veckans övning:
Kan du lägga till följande lista med objekt i slutet av tabellen ovan och uppdatera deras ParentID-fältvärden så att TreeView-visningen ser ut som exempelbilden nedan:
Nya poster för Tabell postrelaterat fält :
- Textfält.
- Nummerfält.
- Fält för datum/tid.
- Hyperlänkfält.
Formulär relaterade kontroller:
- Textruta.
- Kommandoknappar.
- Kombobox.
- Listruta.
Rapportera relaterade kontroller:
- Textruta.
- Etikett.
- Diagram.
Tilldela ParentID-värden till dessa objekt så att trädvyn ser ut som följande bild:
Nu kommer vi att fortsätta med att skapa en MS-Access-projektmeny och lära oss vad som krävs för att skapa en. En enkel menybild ges nedan:
Det är en enkel meny med bara tre grupper av alternativ:Formulär, rapportvyer och makron.
Under Formulär Grupp två alternativ ges, det första visar tabellposten för trädvyskontrollerna. Det andra alternativet visar samma poster i kontinuerligt formulärläge.
Det första alternativet under Rapportvy visar en rapport om produkter kategori poster från kategoritabellen i NorthWind.accdb databas.
Det andra alternativet visar produktens listprisrapport.
Den tredje alternativet öppnar en Parameter Formulär så att användaren kan ställa in min imum och Max imum listprisvärdeintervall, för att filtrera data för produktlistprisrapporten.
Under Makroprocesser Grupp, båda alternativen kör Macro1 och Macro2 respektive och visa olika meddelanden.
Vi behöver en menytabell med ovanstående alternativposter med några ytterligare fält, förutom de vanliga TreeViews unika ID-, beskrivnings- och föräldra-ID-datafält. Menytabellbilden visas nedan:
Skapa en tabell med ovanstående struktur, lägg till ovanstående poster och spara den med namnet Meny . ID fältet är AutoNumber, PID, och Typ fält är numeriska fält, andra är textfält.
Vi är bekanta med de tre första datafälten:det unika ID , Beskrivning, och förälder-ID Fält. Här har jag förkortat ParentID-fältnamnet till PID .
Vi behöver ytterligare fyra fält i menytabellen, ett fält Typ för objekttypen Kod och tre fält Form , Rapportera, och makro .
Typ Fältet innehåller numeriska koder för åtkomstobjekttyp för att identifiera det alternativ som användaren klickade på.
- Formulärfältet är för Formulärnamn, objekt Typ kod 1,
- Rapportfältet innehåller Rapportnamn, objekt Typ kod 2,
- Makrofält är för Makronamn, objekttypskod 3.
Obs! Alla objektnamn kan placeras i en kolumn. Vi har endast använt separata fält för tydlighetens skull. Om du gör det gör du ändringar i VBA-koden, varhelst den refererar till olika fältnamn.
Baserat på kodnumren kan vi hämta objektnamnen från deras respektive fält och anropa DoCmd.Openform eller Docmd.OpenReport eller Docmd.RunMacro för att utföra åtgärden för de underordnade nodklicken.
Nu måste vi lagra typkoden och objektnamnet på undernoderna. Vi kommer att ta upp det ämnet när vi börjar lägga till noderna till trädvykontrollen.
Vi behöver ytterligare två datatabeller för exempelformulär och rapporter. Kategorier Tabell och produkter Tabeller från NorthWind.accdb exempeldatabas. För att spara tid har jag bifogat demodatabasen med alla objekt och program i slutet av den här sidan för att ladda ner och prova den.
Skapa två formulär med hjälp av menytabellen med namnen Datainmatning och en annan Datavy formulär i kontinuerlig Formulärläge.
Skapa två rapporter, en i kategoritabellen med rapportnamnet:Kategorier, en annan rapport om produkttabellen med namnet Produktlista . Lägg till en lång etikett kontrollera under huvudrubriken i produktlistningsrapporten och ändra namnegenskapens värde till intervall .
Skapa ett litet formulär med två obundna textrutor och ändra deras namn Egenskapsvärde till Min &Max, som designen nedan:
Lägg till två kommandoknappar som visas ovan. Ändra bildtexten Egenskapsvärde för den första knappen för att öppna rapport t och namnet Egenskapsvärde till cmdReport .
Ändra den andra kommandoknappens bildtext till Avbryt och namnet Egenskapens värde till cmdCancel .
Visa kodmodulen för formuläret. Kopiera och klistra in följande kod i formulärmodulen och spara formuläret:
Private Sub cmdOpen_Click() Dim mn, mx, fltr As String mn = Nz(Me![Min], 0) mx = Nz(Me![Max], 9999) If (mn + mx) > 0 Then fltr = "[List Price] > " & mn & " And " & "[List Price] <= " & mx DoCmd.OpenReport "Products Listing", acViewReport, , fltr, , fltr Else DoCmd.OpenReport "Products Listing", acViewReport End If End Sub Private Sub cmdCancel_Click() DoCmd.Close End Sub
När användaren anger ett värdeintervall genom att ange minimi- och högsta listprisintervall i sina respektive textrutor, skapas strängen för rapportfilterkriterier. Rapportfiltret Strängvärdet skickas till Produktlistan Rapportera som Öppna Rapport kommando Parameter. Filtersträngsvärdet skickas också som OpenArgs (Öppet argument) Parameter.
Filterparametern filtrerar rapportdata, baserat på de kriterier som anges i Min- och Max-fälten, och det öppna argumentvärdet kopieras till intervallet Etiketttext när rapporten är öppen.
Kopiera och klistra in följande kod i produktlistan Rapportens VBA-modul:
Private Sub Report_Open(Cancel As Integer) DoCmd.Close acForm, "Parameter" Me.Range.Caption = Nz(Me.OpenArgs, "") End Sub
-
Skapa ett nytt formulär med namnet frmMenu, och lägg till Microsoft TreeView Control från Activex-kontrollens lista. Ändra storlek på kontrollen som visas i designvyn nedan:
-
Ändra namnet på trädvyskontrollen till TreeView0 i det vanliga egenskapsbladet.
-
Lägg till en kommandoknapp under trädvyn. Ändra dess namn Egenskapsvärde till cmdExit och Texttext Fastighetsvärde till Avsluta .
-
Högerklicka på trädvykontrollen och markera TreeCtrl_Object och välj Egenskaper för att visa egenskapsbladet.
-
Ändra följande egenskapsvärden enligt nedan:
- Stil =7 (tvwTreeLinesPlusMinusPictureText)
- Linjestil =1 (tvwRootLines)
- LabelEdit =1 (tvwManual)
Förra veckan har vi ändrat de två första fastighetsvärdena. När LabelEdit Egendomens standardvärde är 0 - tvwAutomatic, Genom att klicka på noden två gånger (inte dubbelklicka) kommer nodtexten att gå till redigeringsläge och du kan ändra texten. Men det kommer inte att uppdatera datakällans fält direkt. Genom att ändra den till 1 – tvwManual kommer att förhindra att den går in i redigeringsläge.
Vi kan ändra detta genom kod genom att lägga till följande rader i Form_Load()-händelseproceduren:
With Me.TreeView0.Object .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual End With
Förra veckan har vi använt Form_Load() Händelseprocedur för att läsa trädvynodvärdena för att skapa rotnivå- och undernoderna. Vi behöver samma procedur här också med några rader med ytterligare kod.
Förutom det måste vi fånga Node_Click() Event of Nodes för att kontrollera vilket alternativ användaren har valt.
Kopiera och klistra in följande VBA-kod i formulärmodulen och spara formuläret.
Option Compare Database Option Explicit Dim tv As MSComctlLib.TreeView Const KeyPrfx As String = "X" Private Sub Form_Load() Dim db As Database Dim rst As Recordset Dim nodKey As String Dim PKey As String Dim strText As String Dim strSQL As String Dim tmpNod As MSComctlLib.Node Dim Typ As Variant Set tv = Me.TreeView0.Object tv.Nodes.Clear
‘Change the TreeView Control Properties
With tv
.Style = tvwTreelinesPlusMinusPictureText
.LineStyle = tvwRootLines
.LabelEdit = tvwManual
.Font.Name = "Verdana"
End WithstrSQL = "SELECT ID, Desc, PID, Type,Macro,Form,Report FROM Menu;" Set db = CurrentDb Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) Do While Not rst.EOF And Not rst.BOF If Nz(rst!PID, "") = "" Then nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc Set tmpNod = tv.Nodes.Add(, , nodKey, strText) 'Root-Level Node Description in Bold letters With tmpNod .Bold = True End With Else PKey = KeyPrfx & CStr(rst!PID) nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc Set tmpNod = tv.Nodes.Add(PKey, tvwChild, nodKey, strText) 'Check for the presense of Type Code If Nz(rst!Type, 0) > 0 Then Typ = rst!Type Select Case Typ Case 1 'save type Code & Form Name in Node Tag Property tmpNod.Tag = Typ & rst!Form Case 2 'save type Code & Report Name in Node Tag Property tmpNod.Tag = Typ & rst!Report Case 3 'save type Code & Macro Name in Node Tag Property tmpNod.Tag = Typ & rst!Macro End Select End If End If rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub Private Sub cmdExit_Click() If MsgBox("Close Menu Form? ", vbYesNo, "cmdExit_Click()") = vbYes Then DoCmd.Close End If End Sub Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
‘Reset the earlier lighlight to normal
For Each nodOn In tv.Nodes
nodOn.BackColor = vbWhite
nodOn.ForeColor = vbBlack
Next‘changes BackColor to light Blue and ForeColor White
tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255)
tv.Nodes.Item(Node.Key).ForeColor = vbWhite‘—Highlight code ends-
varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub
På modulens globala deklarationsområde deklareras trädvyobjektet. En konstant variabel KeyPrfx deklareras med värdet "X".
Form_Load() Eventprocedur för förra veckans artikel har vi modifierat med ytterligare kod. Jag har kommenterat det nya kodsegmentet för att ge en indikation på vad det gör men kommer att förklara vad det gör.
Proceduren deklarerar databas, postuppsättning och fyra strängvariabler. De nästa två raderna deklarerar ett temporärt nodobjekt:tmpNod och Typ Variantvariabler deklareras.
Nästa, TreeView Object tv är tilldelad TreeView0 Objekt på formuläret. TreeView0:s befintliga noder, om några, rensas med påståendet:tv.Nodes.Clear , som förberedelse för att ladda alla noder igen.
Vi har implementerat följande kod för att modifiera trädvykontrollens egenskaper genom kod, snarare än via egenskapsbladet.
With tv .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual .Font.Name = "Verdana" End With
Trädvysteckensnittet ändras till Verdana. Förutom det kommer vi att ta in några fler funktioner som att expandera eller komprimera alla menygrupper med ett klick, snarare än att manuellt expandera eller komprimera en grupp efter den andra.
Den nya SQL-strängen modifieras för att lägga till de nya fälten Typ, Form, Rapport och Makro från menytabellen.
Menytabellens första post kontrolleras för närvaron av något värde i PID Om det är tomt är det en nodpost på rotnivå. Det läggs till i Tree View-objektet som rotnivånod och dess referens sparas i tmpNod Objekt.
Noden har flera egenskaper som Förfärg, Fet, och flera andra av det har vi tagit Fet Egendom och tilldelad True för att göra rotnivån Noden ser annorlunda ut än dess undernoder.
Om det inte är en rotnodspost har den PID-värdet, programmet tar annat och posten läggs till som en underordnad nod. Här kontrollerar vi Typ fältvärde. Om den innehåller ett av de tre värdena 1, 2, eller 3 då måste vi ta värdet från Form, Report eller Macro Name tillsammans med typkoden och sammanfoga dem (som ”1Data Entry” , "2Kategorilista" etc.) och spara den i taggen Egenskapen för barnnoder. Vi är bekanta med taggegenskapen i åtkomstkontroller, som textrutor, etiketter, kommandoknappar och andra, men vi använder den sällan.
cmdExit_Click() Procedur stänger menyformuläret om svaret från användaren är jakande.
När användaren klickar på en Child Node, värdet vi har sparat i dess Tag Egendomen måste tas ut och kontrolleras för att avgöra vad som ska göras härnäst. För detta behöver vi en TreeView0_NodeClick() Händelseprocedur.
Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
‘Reset the earlier lighlight to normal
For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn
‘changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends- varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub
Händelseproceduren Click() tar emot den klickade Nodens referens som en parameter i objektet Node . I början av denna procedur har vi deklarerat några variabler.
De nästa raderna kontrollerar om den klickade noden är i ett expanderat eller komprimerat tillstånd.
Normalt, för att expandera en nod, för att visa dess dolda underordnade noder, antingen klickar vi på + (plussymbol) på vänster sida av en nod eller dubbelklicka på själva noden. Dubbelklicka på noden igen eller klicka på – (minussymbolen) kommer att dölja barnnoderna.
Med följande kodsegment kan vi expandera eller kollapsa barnnoder med ett enda klick:
If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
De nästa sex körbara raderna säkerställer att noden som fick klicket förblir markerad.
‘Reset the earlier Highlight to Normal
For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn
‘Changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends-
Därefter läses taggegenskapsvärdet in i varTag Variabel. Om det inte är tomt delas värdet i två delar. Det numeriska värdet extraheras och sparas i Typid variabeln och objektnamnsdelen sparas i variabeln objName .
Beroende på värdet i Typid-variabeln visas Docmd körs för att öppna formuläret, rapporten eller kör makrot.
Vi kommer att lägga till ytterligare två kommandoknappar överst på menyn. En för att expandera alla noder med ett klick och den andra för att komprimera alla noder.
- Lägg till ytterligare två kommandoknappar längst upp i trädvykontrollen som visas på designen nedan.
- Ändra namnet Egenskapsvärde för den vänstra kommandoknappen till cmdExpand och bildtexten för att Utöka alla .
- Ändra på samma sätt kommandoknappens namn på höger sida Egenskap till cmdCollapse och bildtexten till Komprimera alla.
- Kopiera och klistra in följande VBA-kod under den befintliga koden i frmMenu Formulärmodul och spara formuläret.
Private Sub cmdExpand_Click() Dim Nodexp As MSComctlLib.Node For Each Nodexp In tv.Nodes If Nodexp.Expanded = False Then Nodexp.Expanded = True End If Next Nodexp End Sub Private Sub cmdCollapse_Click() Dim Nodexp As MSComctlLib.Node For Each Nodexp In tv.Nodes If Nodexp.Expanded = True Then Nodexp.Expanded = False End If Next Nodexp End Sub
I början av cmdExpand_Click() Händelse, vi har deklarerat ett trädvynodobjekt NodExp. För . . . Nästa loop tar en nod i taget och kontrollerar om den är i utökad form eller inte. Om inte så är den Utökad Egenskapens värde är inställt på True .
På liknande sätt, cmdCollapse_Click() Händelse gör en liknande kontroll och om den är i utökat tillstånd är värdet på den utökade egenskapen inställt på False.
Den fullständiga trädvykontrollens alla noder kan utökas och gör alla deras underordnade noder synliga på en gång eller alla underordnade noder hålls dolda förutom rotnivånoderna.
Hoppas du tyckte om att skapa den nya menyn för ditt projekt. Om du kör med designuppgiften steg för steg bör din meny se ut som den färdiga menybilden som visas högst upp.
Under år 2007 har jag designat en meny i ett av mina projekt, för fordonsserviceavtalssystem, med hjälp av flikkontrollen med flera sidor. Varje sida har 10 eller fler alternativ och för att få varje sida att visas i tur och ordning i samma område när användaren klickar på kommandoknapparna på vardera sidan av menyn. Kommandoknapparna på höger sida ändras också, baserat på valet av knappen på vänster sida.
Klicka för att förstora
Du hittar artikeln Menydesign med flikkontroll på denna länk:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html
KLASSMODUL
- MS-Access Class Module och VBA
- MS-Access VBA Class Object and Arrays
- MS-Access basklass och härledda objekt
- VBA-basklass och härlett objekt-2
- Basklass- och härledda objektvarianter
- MS-Access Recordset och Class Module
- Åtkomst till klassmoduler och omslagsklasser
- Wrapper Class Funktionalitet