Po dokončení s ovládacím prvkem stromového zobrazení bude nabídka projektu Microsoft Access vypadat jako na obrázku níže.
Obrázek výše ukazuje třetí možnost skupiny přehledů Vlastní přehled je vybráno a zvýrazněno s otevřeným formulářem parametrů filtru sestavy, který překrývá obrazovku nabídky, pro zadání uživatele.
Než se do toho pustíme, v lekci z minulého týdne jsme se naučili, jak uspořádat související položky v hierarchickém pořadí pomocí Microsoft Tree View Control na základě Ukázky datová tabulka.
Minulý týden jsem uvedl, že související položky v datech ovládacího prvku stromového zobrazení nemusí být nutně vedle sebe. Poté vám bude jasnější, jak aktualizovat Relativní Klíče podřízených uzlů, bez ohledu na jejich fyzickou polohu záznamů v tabulce, ale na základě vztahu s ID nadřazených uzlů.
Toto byla tabulka dat, kterou jsme použili a dokončili cvičení z minulého týdne:
Můžete přidat následující seznam položek na konec výše uvedené tabulky a aktualizovat jejich hodnoty polí ParentID tak, aby zobrazení TreeView vypadalo jako ukázkový obrázek uvedený níže:
Nové záznamy pro Tabulku pole související se záznamem položky :
- Textové pole.
- Číselné pole.
- Pole data/času.
- Pole hypertextového odkazu.
Formulář související Ovládací prvky:
- Textové pole.
- Příkazová tlačítka.
- Pole se seznamem.
- Pole seznamu.
Nahlásit související Ovládací prvky:
- Textové pole.
- Štítek.
- Grafický graf.
Přiřaďte těmto položkám hodnoty ParentID, aby zobrazení stromu vypadalo jako následující obrázek:
Nyní budeme pokračovat ve vytváření nabídky projektu MS-Access a naučíme se, co je potřeba k jejímu vytvoření. Níže je uveden jednoduchý obrázek nabídky:
Je to jednoduchá nabídka pouze se třemi skupinami možností:Formuláře, Zobrazení sestav a Makra.
V části Formuláře Jsou uvedeny dvě možnosti skupiny, první zobrazuje záznam tabulky ovládacích prvků stromového zobrazení. Druhá možnost zobrazuje stejné záznamy v režimu souvislého formuláře.
První možnost v části Zobrazení přehledu zobrazí přehled kategorie produktů záznamy z tabulky kategorií NorthWind.accdb databáze.
Druhá možnost zobrazí sestavu Product List-Price Report.
Třetí možnost otevře Parametr Formulář, aby uživatel mohl nastavit Min imum a Max imum rozsah hodnot katalogové ceny pro filtrování dat pro sestavu katalogových cen produktů.
V části Procesy maker Skupina, obě možnosti spustí Macro1 a Makro2 a zobrazovat různé zprávy.
Potřebujeme tabulku nabídky s výše uvedenými záznamy možností s některými dalšími poli, kromě obvyklých datových polí Unique ID, Popis a ParentID v TreeView. Obrázek tabulky nabídky je uveden níže:
Vytvořte tabulku s výše uvedenou strukturou, přidejte výše uvedené záznamy a uložte ji pod názvem Menu . ID pole je Automatické číslo, PID, a Typ pole jsou číselná pole, ostatní jsou textová pole.
Známe první tři datová pole:jedinečné ID , Popis, a ParentID Pole. Zde jsem zkrátil název pole ParentID na PID .
Potřebujeme další čtyři pole v tabulce nabídky, jedno pole Typ pro typ objektu Kód a tři pole Formulář , Přehled, a Makro .
Typ Pole obsahuje číselné kódy typu přístupového objektu k identifikaci možnosti, na kterou uživatel klikl.
- Pole Formulář je určeno pro Názvy formulářů objekt Typový kód 1,
- Pole přehledu obsahuje Názvy přehledů objekt Typový kód 2,
- Pole maker je určeno pro názvy maker, kód typu objektu 3.
Poznámka: Všechny názvy objektů lze umístit do jednoho sloupce. Samostatná pole jsme použili pouze pro přehlednost. Pokud to uděláte, proveďte změny v kódu VBA, ať už odkazuje na jiné názvy polí.
Na základě číselných kódů můžeme vybrat názvy objektů z příslušných polí a zavolat DoCmd.Openform nebo Docmd.OpenReport nebo Docmd.RunMacro pro provedení akce na kliknutí na podřízený uzel.
Nyní musíme uložit typový kód a název objektu na podřízené uzly. Tomuto tématu se budeme věnovat, když začneme s přidáváním uzlů do ovládacího prvku stromového zobrazení.
Potřebujeme další dvě datové tabulky pro vzorové formuláře a sestavy. Kategorie Tabulka a Produkty Tabulky z NorthWind.accdb ukázková databáze. Abych vám ušetřil čas, připojil jsem Demo databázi se všemi objekty a programy na konci této stránky ke stažení a vyzkoušení.
Vytvořte dva formuláře pomocí tabulky nabídky s názvy Data Entry a další formulář Zobrazení dat souvisle Režim formuláře.
Vytvořte dva přehledy, jeden v tabulce kategorií s názvem přehledu:Kategorie, další přehled v tabulce produktů s názvem Výpis produktů . Přidejte dlouhý štítek pod hlavním nadpisem v přehledu Product Listing Report a změňte hodnotu vlastnosti názvu na Rozsah .
Vytvořte malý formulář se dvěma nesvázanými textovými poli a změňte jejich název Hodnota vlastnosti na Min &Max, jako níže uvedený design:
Přidejte dvě příkazová tlačítka, jak je znázorněno výše. Změňte Titulek Hodnota vlastnosti prvního tlačítka pro otevření sestavy t a Název Hodnota vlastnosti do cmdReport .
Změňte popisek druhého příkazového tlačítka na Zrušit a Jméno Hodnota vlastnosti cmdCancel .
Zobrazte modul kódu formuláře. Zkopírujte a vložte následující kód do modulu formuláře a uložte formulář:
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
Když uživatel nastaví rozsah hodnot zadáním rozsahu minimální a maximální katalogové ceny do příslušných textových polí, vytvoří se řetězec kritérií filtru sestav. Filtr přehledů Hodnota řetězce je předána do Záznamu o produktu Report as Open Report příkaz Parametr. Hodnota Řetězec filtru je také předána jako OpenArgs (Otevřený argument) Parametr.
Parametr Filtr filtruje data sestavy na základě kritérií zadaných v polích Min a Max a hodnota otevřeného argumentu se zkopíruje do Rozsahu Označte popisek, když je sestava otevřená.
Zkopírujte a vložte následující kód do Záznamu o produktu Modul VBA sestavy:
Private Sub Report_Open(Cancel As Integer) DoCmd.Close acForm, "Parameter" Me.Range.Caption = Nz(Me.OpenArgs, "") End Sub
-
Vytvořte nový formulář s názvem frmMenu, a přidejte ovládací prvek Microsoft TreeView ze seznamu ovládacího prvku Activex. Změňte velikost ovládacího prvku, jak je znázorněno v návrhovém zobrazení níže:
-
Změňte název ovládacího prvku stromového zobrazení na TreeView0 v normálním listu vlastností.
-
Přidejte příkazové tlačítko pod ovládací prvek stromového zobrazení. Změňte jeho Název Hodnota vlastnosti na cmdExit a Titulek Hodnota vlastnosti Konec .
-
Klepněte pravým tlačítkem myši na ovládací prvek stromového zobrazení a zvýrazněte Objekt TreeCtrl_Object a vyberte Vlastnosti zobrazíte list vlastností.
-
Změňte následující hodnoty vlastností, jak je uvedeno níže:
- Styl =7 (tvwTreeLinesPlusMinusPictureText)
- Styl čáry =1 (tvwRootLines)
- LabelEdit =1 (tvwManual)
Minulý týden jsme změnili první dvě hodnoty majetku. Když LabelEdit Výchozí hodnota vlastnosti je 0 - tvwAutomatic Dvojitým kliknutím na uzel (nikoli dvojitým kliknutím) přejde uzel-Text do režimu úprav a můžete změnit text. Ale nebude přímo aktualizovat pole zdroje dat. Změnou na 1 – tvwManual zabrání přechodu do režimu úprav.
Můžeme to změnit pomocí kódu přidáním následujících řádků do Form_Load() Event Procedure:
With Me.TreeView0.Object .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual End With
Minulý týden jsme použili Form_Load() Procedura události pro načtení hodnot uzlu stromového zobrazení za účelem vytvoření uzlů na úrovni kořene a podřízených uzlů. Potřebujeme stejný postup i zde s několika řádky dodatečného kódu.
Kromě toho musíme zachytit Node_Click() Událost uzlů, abyste zjistili, jakou možnost uživatel vybral.
Zkopírujte a vložte následující kód VBA do modulu formuláře a uložte formulář.
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
V oblasti globální deklarace modulu je deklarován objekt stromového zobrazení. Konstantní proměnná KeyPrfx je deklarován s hodnotou „X“.
Form_Load() Postup události v článku z minulého týdne jsme upravili o další kód. Okomentoval jsem nový segment kódu, abych naznačil, co dělá, ale vysvětlím, co dělá.
Postup deklaruje databázi, sadu záznamů a čtyři řetězcové proměnné. Následující dva řádky deklarují dočasný objekt uzlu:tmpNod a Typ Variant Variables jsou deklarovány.
Dále objekt TreeView tv je přiřazeno TreeView0 Objekt ve formuláři. Stávající uzly TreeView0, pokud existují, jsou vymazány příkazem:tv.Nodes.Clear , v rámci přípravy na opětovné načtení všech uzlů.
Implementovali jsme následující kód, abychom upravili vlastnosti ovládacího prvku stromového zobrazení pomocí kódu, nikoli pomocí listu vlastností.
With tv .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual .Font.Name = "Verdana" End With
Písmo stromového zobrazení se změní na Verdana. Kromě toho přineseme některé další funkce, jako je rozbalení nebo sbalení všech skupin nabídek jedním kliknutím, spíše než ruční rozbalování nebo sbalování jedné skupiny za druhou.
Nový řetězec SQL je upraven tak, aby přidal nový typ pole, formulář, sestavu a pole makra z tabulky nabídky.
První záznam tabulky nabídky je zkontrolován na přítomnost jakékoli hodnoty v PID Pokud je prázdné, jedná se o záznam uzlu na kořenové úrovni. Je přidán do objektu stromového zobrazení jako uzel kořenové úrovně a jeho reference je uložena v tmpNod Objekt.
Uzel má několik vlastností jako Forecolor, Bold a několik dalších z toho jsme vzali tučné Vlastnost a přiřazené True pro vytvoření kořenové úrovně Uzel vypadá jinak než jeho podřízené uzly.
Pokud to není položka Root Node, pak má hodnotu PID, program převezme Else klauzule a záznam je přidán jako podřízený uzel. Zde zkontrolujeme Typ hodnota pole. Pokud obsahuje jednu ze tří hodnot 1, 2, nebo 3 pak musíme převzít hodnotu z formuláře, sestavy nebo názvu makra spolu s kódem typu a spojit je dohromady (například ”1Data Entry” , „2Výpis kategorie“ atd.) a uložte jej do Tag Vlastnost podřízených uzlů. Známe vlastnosti Tag v ovládacích prvcích přístupu, jako jsou textová pole, štítky, příkazová tlačítka a další, ale používáme je zřídka.
cmdExit_Click() Procedura zavře formulář nabídky, pokud je odpověď od uživatele kladná.
Když uživatel klikne na podřízený uzel, hodnota, kterou jsme uložili do jeho Tag Vlastnost musí být extrahována a zkontrolována, aby bylo možné určit, co dělat dál. K tomu potřebujeme TreeView0_NodeClick() Postup události.
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
Událostní procedura Click() obdrží Referenci uzlu, na kterou bylo kliknuto jako parametr v objektu Node . Na začátku tohoto postupu jsme deklarovali několik proměnných.
Následujících několik řádků kontroluje, zda je uzel, na který kliknete, v rozbaleném nebo sbaleném stavu.
Normálně, chcete-li rozbalit uzel a zobrazit jeho skryté podřízené uzly, buď klikneme na + (symbol plus) na levé straně uzlu nebo poklepejte na samotný uzel. Opětovné poklepání na uzel nebo kliknutí na – (symbol mínus) podřízené uzly skryjí.
Pomocí následujícího segmentu kódu můžeme rozbalit nebo sbalit podřízené uzly jediným kliknutím:
If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
Následujících šest spustitelných řádků zajistí, že uzel obdržel kliknutí, zůstane zvýrazněný.
‘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ále se hodnota vlastnosti značky načte do varTag Variabilní. Pokud není prázdný, je hodnota rozdělena na dvě části. Numerická hodnota je extrahována a uložena do Typid a část Název objektu je uložena v proměnné objName .
V závislosti na hodnotě v proměnné Typid Docmd se spustí pro otevření formuláře, sestavy nebo spuštění makra.
Do horní části nabídky přidáme další dvě příkazová tlačítka. Jeden pro rozbalení všech uzlů jedním kliknutím a druhý pro sbalení všech uzlů.
- Přidejte další dvě příkazová tlačítka do horní oblasti ovládacího prvku stromového zobrazení, jak je znázorněno na návrhu níže.
- Změňte Název Hodnota vlastnosti levého příkazového tlačítka na cmdExpand a Titulek na Rozbalit vše .
- Podobně změňte Název pravého příkazového tlačítka Vlastnost pro cmdCollapse a Titulek na Sbalit vše.
- Zkopírujte a vložte následující kód VBA pod stávající kód v frmMenu Modul formuláře a uložte formulář.
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
Na začátku cmdExpand_Click() Událostí jsme deklarovali objekt Tree View Node NodExp. Pro . . . Další smyčka bere vždy jeden uzel a kontroluje, zda je v rozšířené formě nebo ne. Pokud ne, pak je Rozbaleno Hodnota vlastnosti je nastavena na True .
Podobně cmdCollapse_Click() Událost provede podobnou kontrolu a pokud je v rozbaleném stavu, pak je hodnota Expanded Property nastavena na False.
Všechny uzly plného stromu zobrazení lze rozbalit a zviditelnit všechny jejich podřízené uzly najednou nebo všechny podřízené uzly ponechat skryté kromě uzlů na kořenové úrovni.
Doufám, že se vám vytváření nového menu pro váš projekt líbilo. Pokud postupujete podle úkolu návrhu krok za krokem, pak by vaše nabídka měla vypadat jako hotový obrázek nabídky uvedený nahoře.
V průběhu roku 2007 jsem v jednom ze svých projektů navrhl Menu pro systém smluv o servisu vozidel pomocí ovládacího prvku Tab s několika stránkami. Každá stránka má 10 nebo více možností a každá stránka se postupně zobrazí ve stejné oblasti, když uživatel klikne na příkazová tlačítka seřazená na obou stranách nabídky. Příkazová tlačítka na pravé straně se také mění v závislosti na výběru tlačítko na levé straně.
Klikněte pro zvětšení
Článek Návrh nabídky s ovládáním pomocí karet naleznete na tomto odkazu:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html
MODUL TŘÍDY
- MS-Access Class Module a VBA
- Objekt a pole třídy VBA MS Access
- Základní třída MS-Access a odvozené objekty
- VBA-Base Class a Derived Object-2
- Základní třída a varianty odvozených objektů
- Sada záznamů MS-Access a modul třídy
- Přístup k modulu třídy a třídám Wrapper
- Funkčnost třídy Wrapper