Microsoft Access-projektmenuen, når den er færdig med trævisningskontrollen, vil se ud som billedet nedenfor.
Billedet ovenfor viser rapportgruppens tredje valgmulighed Tilpasset rapport er valgt og fremhævet, med rapportfilterparameterformularen åben, overlappende menuskærmen, til brugerens input.
Før vi går ind på det, har vi i sidste uges lektion lært, hvordan man organiserer de relaterede emner i hierarkisk rækkefølge ved hjælp af Microsoft Tree View Control, baseret på Eksemplet data tabel.
Jeg har gjort en pointe i sidste uge, at de relaterede elementer i Tree View-kontrollens data ikke nødvendigvis behøver at være ved siden af hinanden. Efter dette vil du være mere klar over, hvordan du opdaterer Relativ Nøgler til underordnede noder, uanset dens fysiske placering af posterne i tabellen, men baseret på forholdet til dets forældrenode-id'er.
Dette var datatabellen, som vi har brugt og afsluttet med sidste uges øvelse:
Kan du tilføje følgende liste over elementer i slutningen af ovenstående tabel og opdatere deres ParentID-feltværdier, så TreeView-visningen ser ud som eksempelbilledet nedenfor:
Nye poster for Tabel varepostrelateret felt :
- Tekstfelt.
- Nummerfelt.
- Dato/tidspunkt.
- Hyperlinkfelt.
Form relaterede kontrolelementer:
- Tekstboks.
- Kommandoknapper.
- Komboboks.
- Listeboks.
Rapportér relaterede kontrolelementer:
- Tekstboks.
- Etiket.
- Grafdiagram.
Tildel forældre-id-værdier til disse elementer, så trævisningsvisningen ser ud som følgende billede:
Nu vil vi fortsætte med oprettelsen af en MS-Access-projektmenu og lære, hvad der skal til for at oprette en. Et simpelt menubillede er givet nedenfor:
Det er en simpel menu med kun tre grupper af muligheder:Formularer, Rapportvisninger og Makroer.
Under Formularer Gruppe to muligheder er givet, den første viser trævisningskontrolmenuen tabelpost. Den anden mulighed viser de samme poster i kontinuerlig formulartilstand.
Den første mulighed under Rapportvisning viser en rapport om produkters kategori poster fra kategoritabellen i NorthWind.accdb database.
Den anden mulighed viser produktliste-prisrapporten.
Den tredje mulighed åbner en Parameter Formular, så brugeren kan indstille Min imum og Max mindste listeprisværdiområde for at filtrere data for produktlisteprisrapporten.
Under Makroprocesser Gruppe, begge muligheder kører Macro1 og Macro2 og vise forskellige meddelelser.
Vi har brug for en menutabel med ovenstående valgposter med nogle ekstra felter, udover de sædvanlige TreeViews unikke ID'er, Beskrivelse og ParentID datafelter. Menutabelbilledet er vist nedenfor:
Opret en tabel med ovenstående struktur, tilføj ovenstående poster, og gem den med navnet Menu . ID feltet er AutoNumber, PID, og Typ felter er numeriske felter, andre er tekstfelter.
Vi er bekendt med de første tre datafelter:det unikke ID , Beskrivelse, og Forældre-ID Felter. Her har jeg forkortet ParentID-feltnavnet til PID .
Vi har brug for yderligere fire felter i menutabellen, et felt Type for objekttypen Kode og tre felter Form , Rapportér, og makro .
Typ Feltet indeholder de numeriske koder for adgangsobjekttype for at identificere den indstilling, som brugeren klikkede på.
- Formularfeltet er for Formularnavne, objekt Type kode 1,
- Rapportfeltet indeholder Rapportnavne objekt Indtast kode 2,
- Makrofelt er for Makronavne, objekttypekode 3.
Bemærk: Alle objektnavne kan placeres i én kolonne. Vi har kun brugt separate felter for klarhedens skyld. Hvis du gør det, skal du foretage ændringer i VBA-koden, uanset hvor den refererer til forskellige feltnavne.
Baseret på kodenumrene kan vi hente objektnavnene fra deres respektive felter og kalde DoCmd.Openform eller Docmd.OpenReport eller Docmd.RunMacro for at udføre handlingen på de underordnede nodeklik.
Nu skal vi gemme typekoden og objektnavnet på de underordnede noder. Vi vil tage det emne op, når vi begynder at tilføje noderne til trævisningskontrollen.
Vi har brug for yderligere to datatabeller til eksempler på formularer og rapporter. Kategorier Tabel og produkter Tabeller fra NorthWind.accdb eksempel database. For at spare tid har jeg vedhæftet demodatabasen med alle objekter og programmer i slutningen af denne side for at downloade og prøve den.
Opret to formularer ved hjælp af menutabellen med navnene Data Entry og en anden formular Datavisning i kontinuerlig Formulartilstand.
Opret to rapporter, én på kategoritabellen med rapportnavnet:Kategorier, endnu en rapport om produkttabel med navnet Produktliste . Tilføj en lang etiket kontrol under hovedoverskriften på produktlisterapporten, og skift navneegenskabsværdien til interval .
Opret en lille formular med to ubundne tekstbokse, og skift deres navn Egenskabsværdi til Min &Maks, som designet nedenfor:
Tilføj to kommandoknapper som vist ovenfor. Skift underteksten Egenskabsværdi for den første knap til åbning af rapport t og navnet Ejendomsværdi til cmdReport .
Skift den anden kommandoknaps billedtekst til Annuller og navnet Ejendomsværdi til cmdCancel .
Vis formularens kodemodul. Kopiér og indsæt følgende kode i formularmodulet, og gem formularen:
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 brugeren angiver et værdiinterval ved at indtaste minimums- og maksimumslisteprisintervallet i deres respektive tekstbokse, oprettes rapportfilterkriteriestrengen. Rapportfilteret Strengværdien sendes til Produktfortegnelsen Rapportér som Åben rapport-kommandoparameter. Filterstrengværdien videregives også som OpenArgs (Åbent argument) Parameter.
Filterparameteren filtrerer rapportdataene baseret på de kriterier, der er angivet i felterne Min. og Maks., og værdien af det åbne argument kopieres til området Etikettekst, når rapporten er åben.
Kopiér og indsæt følgende kode i produktlisten Rapportens VBA-modul:
Private Sub Report_Open(Cancel As Integer) DoCmd.Close acForm, "Parameter" Me.Range.Caption = Nz(Me.OpenArgs, "") End Sub
-
Opret en ny formular med navnet frmMenu, og tilføj Microsoft TreeView Control fra Activex-kontrollens liste. Ændr størrelsen på kontrolelementet som vist i designvisningen nedenfor:
-
Skift navnet på trævisningskontrollen til TreeView0 i det normale ejendomsark.
-
Tilføj en kommandoknap under trævisningskontrollen. Skift dens navn Ejendomsværdi til cmdExit og Billedtekst Ejendomsværdi til Afslut .
-
Højreklik på trævisningskontrollen og marker TreeCtrl_Object og vælg Egenskaber for at vise ejendomsarket.
-
Skift følgende egenskabsværdier som angivet nedenfor:
- Stil =7 (tvwTreeLinesPlusMinusPictureText)
- Linjestil =1 (tvwRootLines)
- LabelEdit =1 (tvwManual)
I sidste uge har vi ændret de to første ejendomsværdier. Når LabelEdit Ejendommens standardværdi er 0 - tvwAutomatic, Ved at klikke på noden to gange (ikke dobbeltklikke) vil nodeteksten gå i redigeringstilstand, og du kan ændre teksten. Men det vil ikke direkte opdatere datakildefeltet. Ved at ændre det til 1 – tvwManual forhindrer den i at gå i redigeringstilstand.
Vi kan ændre dette gennem kode ved at tilføje følgende linjer i Form_Load()-hændelsesproceduren:
With Me.TreeView0.Object .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual End With
I sidste uge har vi brugt Form_Load() Hændelsesprocedure for at læse trævisningsknudeværdierne for at oprette rodniveau- og undernoder. Vi har brug for den samme procedure her også med få linjer ekstra kode.
Udover det skal vi fange Node_Click() Event of Nodes for at kontrollere, hvilken indstilling brugeren har valgt.
Kopiér og indsæt følgende VBA-kode i formularmodulet og gem formularen.
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å modulets globale deklarationsområde erklæres trævisningsobjektet. En konstant variabel KeyPrfx er deklareret med værdien "X".
Form_Load() Begivenhedsprocedure i sidste uges artikel, vi har ændret med yderligere kode. Jeg har kommenteret det nye kodesegment for at give en indikation af, hvad det gør, men vil forklare, hvad det gør.
Proceduren erklærer Database, Recordset og fire strengvariabler. De næste to linjer erklærer et midlertidigt nodeobjekt:tmpNod og Typ Variant Variabler erklæres.
Dernæst TreeView Object tv er tildelt TreeView0 Objekt på formularen. TreeView0's eksisterende noder, hvis nogen, ryddes med sætningen:tv.Nodes.Clear , som forberedelse til at indlæse alle noderne igen.
Vi har implementeret følgende kode for at ændre trævisningskontrollens egenskaber gennem kode i stedet for gennem ejendomsarket.
With tv .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual .Font.Name = "Verdana" End With
Trævisningsskrifttypen ændres til Verdana. Udover det vil vi bringe nogle flere funktioner ind, såsom at udvide eller skjule alle menugrupperne med ét klik, i stedet for manuelt at udvide eller skjule den ene gruppe efter den anden.
Den nye SQL-streng er ændret for at tilføje de nye felter Type, Form, Rapport og Makro fra menutabellen.
Menutabellens første registrering kontrolleres for tilstedeværelsen af enhver værdi i PID felt, hvis det er tomt, er det en nodepost på rodniveau. Det føjes til trævisningsobjektet som rodniveauknudepunktet, og dets reference gemmes i tmpNod Objekt.
Noden har flere egenskaber såsom Forfarve, fed, og flere andre ud af det har vi taget Fed Ejendom og tildelt True for at lave rodniveauet Node ser anderledes ud end dens underordnede noder.
Hvis det ikke er en Root Node-indgang, har den PID-værdien, programmet tager Else klausul, og posten tilføjes som en Child Node. Her tjekker vi Type feltværdi. Hvis den indeholder en af de tre værdier 1, 2, eller 3 så skal vi tage værdien fra formular, rapport eller makronavn sammen med typekoden og forbinde dem (som "1Data Entry" , "2Kategoriliste" osv.), og gem det i Tag Ejendom af børneknuder. Vi er bekendt med tag-egenskaben i adgangskontroller, såsom tekstbokse, etiketter, kommandoknapper og andre, men vi bruger det sjældent.
cmdExit_Click() Proceduren lukker menuformularen, hvis svaret fra brugeren er bekræftende.
Når brugeren klikker på en Child Node, er den værdi, vi har gemt i dens Tag Ejendom skal udvindes og kontrolleres for at bestemme, hvad der skal gøres. Til dette har vi brug for en TreeView0_NodeClick() Begivenhedsprocedure.
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
Click()-hændelsesproceduren modtager den klikkede Nodes reference som en parameter i objektet Node . I begyndelsen af denne procedure har vi erklæret nogle få variabler.
De næste par linjer kontrollerer, om den klikkede node er i en udvidet eller foldet tilstand.
Normalt, for at udvide en node, for at vise dens skjulte underordnede noder, klikker vi enten på + (plussymbol) i venstre side af en node eller dobbeltklik på selve noden. Dobbeltklik på noden igen eller klik på – (minus-symbolet) skjuler underordnede noder.
Med følgende kodesegment kan vi udvide eller kollapse Child-Nodes med et enkelt klik:
If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
De næste seks eksekverbare linjer sikrer, at noden modtog klikket forbliver fremhævet.
‘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-
Derefter læses tag-egenskabsværdien ind i varTag Variabel. Hvis den ikke er tom, opdeles værdien i to dele. Den numeriske værdi udtrækkes og gemmes i Typid variabel og Objektnavn-delen gemmes i variabel objName .
Afhængigt af værdien i Typid-variablen er Docmd udføres for at åbne formularen, rapporten eller køre makroen.
Vi tilføjer yderligere to kommandoknapper øverst i menuen. Den ene for at udvide alle noderne med ét klik og den anden for at skjule alle noderne.
- Tilføj yderligere to kommandoknapper i det øverste område af trævisningskontrollen som vist på designet nedenfor.
- Skift navnet Egenskabsværdi for venstre kommandoknap til cmdExpand og billedteksten for at Udvid alle .
- Tilsvarende skal du ændre kommandoknappens navn i højre side Egenskab til cmdCollapse og billedteksten til Skjul alle.
- Kopiér og indsæt følgende VBA-kode under den eksisterende kode i frmMenu Formularmodul og gem formularen.
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 begyndelsen af cmdExpand_Click() Begivenhed, vi har erklæret et Tree View Node-objekt NodExp. Den For . . . Næste loop tager en node ad gangen og kontrollerer, om den er i udvidet form eller ej. Hvis ikke, så er den Udvidet Ejendomsværdien er indstillet til True .
Tilsvarende er cmdCollapse_Click() Hændelsen foretager en lignende kontrol, og hvis den er i en udvidet tilstand, er værdien for den udvidede egenskab sat til False.
Den fulde trævisningskontrols alle noder kan udvides og gør alle deres underordnede noder synlige på én gang, eller alle børneknuder holdes skjult undtagen noderne på rodniveau.
Håber du nød at oprette den nye menu til dit projekt. Hvis du løber langs designopgaven trin for trin, skal din menu ligne det færdige menubillede, der er vist øverst.
I løbet af året 2007 har jeg designet en menu i et af mine projekter, for køretøjsservicekontraktsystem, ved hjælp af fanekontrol med flere sider. Hver side har 10 eller flere valgmuligheder og for at få hver side til at blive vist på skift i det samme område, når brugeren klikker på kommandoknapperne på hver side af menuen. Kommandoknapper på højre side ændres også, baseret på valget af venstre side knap.
Klik for at forstørre
Du kan finde menudesign med fanekontrol-artiklen på dette link:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html
KLASSEMODUL
- MS-Access Class Module og VBA
- MS-Access VBA Class Object and Arrays
- MS-Access Basisklasse og afledte objekter
- VBA-baseklasse og afledt objekt-2
- Basisklasse og afledte objektvarianter
- MS-Access Recordset og Class Module
- Adgang til klassemodul- og indpakningsklasser
- Wrapper Class Funktionalitet