Introduktion.
I den här sessionen av TreeView Control Tutorial kommer vi att lära oss att programmera ImageComboBox Control. Vi kommer att skapa en MS-Access Project rullgardinsmeny, med ImageCombo Control. Det finns en andra ImagecomboBox-kontroll för att visa bilderna och deras nyckelvärden från ImageList Kontrollera. För båda dessa ImageComboBox-kontroller har listan över bilder tagits från en gemensam ImageList-kontroll. Bilderna laddades upp manuellt till ImageList Control från datorn, i en tidigare session av denna självstudieserie.
Följande är de trädvyskontrollsessioner som vi har täckt hittills:
Länkar till TreeView-kontrollsessionen.
- Microsoft TreeView Control Tutorial
- Skapa åtkomstmeny med TreeView-kontroll
- Tilldela bilder till TreeView-kontroll
- Tilldela bilder till TreeView Control-2
- TreeView Control Markera Lägg till Ta bort noder
Demovyn av båda ImageComboBoxarna utökad.
Den färdiga rullgardinsmenyn för MS-Access Project visas nedan:
Designvybilden av ovanstående formulär som anges nedan:
Den nedrullningsbara källdata för ImageComboBox.
Den nya rullgardinsmenyn för MS-Access Project har hämtats från vårt tidigare Access Menu Project.
Ladda ner demodatabasen nu, om du inte har gjort det tidigare, från 4:e objektet Länken ovan. Om du gör det har du alla nödvändiga dataobjekt för att fortsätta med den aktuella sessionen.
Det finns tre tabeller:kategorier, produkter och menyn tabell. Det finns två formulär för att visa kategorier och produktdata och en datafilterparameter Form for Report.
Vi har ytterligare två formulär:frmMenu och frmMenu2 som vi har använt för våra tidigare handledningssessioner.
Du hittar två rapporter för att förhandsgranska kategorier och produktdata.
Två makron för att visa några enkla meddelanden. Makron kan användas för att sekvensera Action-Queries för databehandling för komplicerade rapporter. Dessa åtgärder har utförts genom att välja Alternativ från TreeView Control Project Menu i den tidigare handledningssessionen.
Vi behöver alla dessa objekt här också eftersom vi kommer att skapa en ny rullgardinsmeny med ImageComboBox Kontrollera. Vi måste kunna öppna alla dessa objekt genom att välja alternativen i den nya rullgardinsmenyn, precis på samma sätt som vi gjorde på frmMenu2 Form, med hjälp av TreeView-kontrollen, i samma databas.
menyn Tabellbilden ges nedan som referens.
Förbereder för utformningen av rullgardinsmenyn.
Kolla designvyn i menyformuläret ovan, där har vi två menyrelaterade kontroller. En ImageList Control och en ImageComboBox Control. Ytterligare en ImageComboBox-kontroll har placerats till höger om formuläret för att visa ImageList's Bilder.
- Gör en kopia av ImageList Kontroll från frmMenu2 Formulera och klistra in det på ett nytt formulär, säg frmMenu3Combo .
Denna bildlistkontroll har bilder som vi har laddat upp manuellt från datorn i vår tidigare självstudiesession. Du kan öppna dess egenskapsblad och kontrollera bilderna och deras nyckel Namn. Högerklicka på ImageList Control, markera ImageListCtl Object och välj Egenskaper.
-
ImageComboBox-kontrollen placerad till vänster på formuläret är för rullgardinsmenyn, med namnet:imgCombo1 . Hitta Microsoft ImageComboBox Control från ActiveX-kontroller grupp och placera den på formuläret. Ändra namnet på kontrollen till imgCombo1 .
-
Skapa ytterligare en ImageComboBox-kontroll till höger med namnet imgCombo2 . Den andra ImageComboBox kommer vi att använda för att visa bilderna och deras nyckelnamn, från ImageList0 Kontroll, som en rullgardinslista.
-
Lägg till en etikettkontroll ovanför den andra ImageComboBox-kontrollen och ändra dess bildtext till Bildlista.
Bildlistan i Image-Combo-Box Control.
Först kommer vi att arbeta med den andra imgCombo2 Styr och visa listan över bilder från ImageList Control. När du väl är bekant med koden kommer du att förstå proceduren för att skapa rullgardinsmenyer mycket enkelt.
Vi har delat upp frmMenu3Combo Form Modul VBA-kod i två delar. Låt oss ta den första delen och se vad vi har där inne.
Kortfattat, i det globala deklarationsområdet har huvudobjektvariablerna deklarerats. Form_Load() händelseproceduren initierar ImageList-kontrollen på formuläret till dess objektvariabel objimgList och anropar cboImageList() subrutin för att lägga till bilder från ImageList-kontrollen till den andra ImageComboBox-kontrollen. Låt oss titta närmare på koden.
Den första delen av vba-koden, med Form_Load() och cboImageList() subrutiner listade nedan:
Dim imgcombo1 As MSComctlLib.ImageCombo Dim imgCombo2 As MSComctlLib.ImageCombo Dim objimgList As MSComctlLib.ImageList Const KeyPrfx As String = "X" Private Sub Form_Load() Set objimgList = Me.ImageList0.Object cboImageList 'load imagelist-combo 'CreateMenu 'Create Drop-Down Menu End Sub Private Sub cboImageList() Dim j As Integer Dim strText As String Set imgCombo2 = Me.ImageCombo2.Object imgCombo2.ImageList = objimgList For j = 1 To objimgList.ListImages.Count strText = objimgList.ListImages(j).Key imgCombo2.ComboItems.Add , , strText,j,,j Next imgCombo2.ComboItems(1).Selected = True End Sub
VBA-kodgranskning.
På det globala deklarationsområdet har vi deklarerat två ImageComboBox-kontroller, imgCombo1 för projektmenyn och imgCombo2 för att visa bilder från ImageList kontrollera. objimgList variabel som deklareras för ImageList-kontrollen på formuläret. Keyprfx variabel med tecknet X deklareras som en konstant.
Inom Form_Load() händelseproceduren objimgList initieras med ImageList-kontrollen på formuläret, med satsen:Set objimgList =Me.ImageList0.Object. Nu är alla förladdade bilder i ImageList-kontrollen tillgängliga för åtkomst via objimgList-objektet.
Nästa sats kallar subrutinen cboImageList() för att lägga till alla bilder i ImgCombo1 kontroll.
CreateMenu() subrutinsamtal har kommenterats bort för tillfället.
I cboImageList() s uroutin två variabler har deklarerats.
Därefter satsen Set imgCombo2 =Me.ImageCombo2.Object tilldelar den andra ImagecomboBox på formuläret till objektvariabeln imgCombo2.
Liksom TreeView styr imgCombo2 har en ImageList egenskap, för att skicka ImageList-kontrollens referens till ImageComboBox-kontrollen, för att komma åt ImageLists egenskaper. Nästa påstående:imgCombo2.ImageList =objimgList gör det.
Därefter visas För . . . Nästa Loop körs för antalet bilder i ImageList Control.
Det första ImageList-objektets Key- Värdet ('form_close') har sparats i strText variabel. Här har vi tagit nyckelvärdet för bildlistans kontroll som text eller som en beskrivning av ImageCombo-bilden, eftersom det är den enda tillgängliga texten. Taggen egenskapen är tom och vi har andra användningsområden med den här egenskapen när vi arbetar med rullgardinsmenyn.
Nästa påstående är det viktiga som vi måste titta närmare på, Lägg till metod för kontroll av ImageComboBox. Syntaxen för satsen är enligt nedan:
imgCombo2.ComboItems.Add [Index],[Key],[Text],[Image],[SelImage],[Indentation]
Alla parametrar för Add() metoden är valfri. För vår första testkörning av den här kontrollen kommer vi att använda värden för [Text], [Bild], och [Indrag] bara. Efter att ha sett resultatet av den första testkörningen av bildlistvyn kommer vi inte att använda parametervärdet [Indentation] på denna ImageCombo-kontroll.
Obs! Men tänk på att vi behöver indraget Egenskapsvärde för rullgardinsmenyn för att få menyalternativen att se ut som Root-Node och Child-Node på TreeView-kontrollen. Vi använder [nyckeln] Parameter också (för både nyckel- och textparametrar) för att komma åt ett specifikt menyobjekts tagg Fastighetsvärde.
Bildlista med ökande indrag Param-inställning.
Den första testkörningsbildlistan i ImageCombo2 kommer att se ut som bilden nedan, efter att ha tillämpat inkrementella värden för indrag.:
Effekten av indragningen framgår tydligt av ovanstående provkörningsbild. Varje objekt har flyttats till höger, ett utrymme större än det föregående. Vi kan använda den här funktionen för att placera vårt projektmenyalternativ Noder, så att de ser ut som rotnivå- och undernoder.
Efter strText värde (‘form_close’) den första variabeln j refererar till ImageLists indexnummer, parametern [SelImage] som vi har hoppat över och nästa värde i j har använts för indrag av varje listobjekt när den placeras i ComboBox-listan. Efter den första testkörningen och efter att ha sett resultatet kan du ta bort alla parametrar efter bildindexvärdet.
Nästa påstående:imgCombo2.ComboItems(1).Selected =True väljer det första objektet i ComboBox. När du väljer ett objekt från ImageCombo-kontrollen genom koden visas Change() händelsen startar, men det är det inte när du väljer ett objekt direkt i formuläret. Update() händelse ignorerar manuell uppdatering av händelse och försöker anropa genom kod.
Spara formuläret frmMenu3Combo och öppna det i normalvy. Expandera den andra ImageList ComboBox-kontrollen och se resultatet. Ta bort kommatecken och variabeln j i slutet, efter den första variabeln j, bibehållen för ImageList-indexnumret.
Rullgardinsmenyn VBA Code of Project.
Nu kommer vi att fortsätta med den andra delen av formulärmodulens vba-kod för att lära oss hur man skapar rullgardinsmenyn för åtkomst och se hur man öppnar åtkomstformulär, rapporter och makron genom att välja kontrollobjektet ComboBox.
Den andra delen av vba-koden består av CreateMenu() subrutin och ImageCombo1_Click() e ventileringsprocedur, har listats nedan:
Private Sub CreateMenu() Dim db As DAO.Database Dim rst As DAO.Recordset Dim strSQL As String Dim strKey As String Dim strText As String Dim typ As Integer Set imgcombo1 = Me.ImageCombo1.Object imgcombo1.ImageList = objimgList strSQL = "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 Len(Trim(Nz(rst!PID, ""))) = 0 Then strKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc imgcombo1.ComboItems.Add , strKey, strText, 1, 2, 1 ' image index 1,2([image],[selectedimage]) 'imgcombo1.ComboItems.Add , strKey, strText, "folder_close", "folder_open", 1 Else strKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc imgcombo1.ComboItems.Add , strKey, strText, 4, 5, 4 'last param is spacing 'imgcombo1.ComboItems.Add , strKey, strText, "left_arrow", "right_arrow", 4 'Check for the presense of Type Code If Nz(rst!Type, 0) > 0 Then typ = rst!Type With imgcombo1.ComboItems Select Case typ 'save type Code & Form/Report/Macro Name in Tag Property Case 1 .Item(strKey).Tag = typ & rst!Form Case 2 .Item(strKey).Tag = typ & rst!Report Case 3 .Item(strKey).Tag = typ & rst!Macro End Select End With End If End If rst.MoveNext Loop rst.Close imgcombo1.ComboItems.Item(1).Selected = True End Sub Private Sub ImageCombo1_Click() Dim strObject As String Dim strTag As String Dim typ As Integer strTag = ImageCombo1.SelectedItem.Tag typ = Val(strTag) strObject = Mid(strTag, 2) Select Case typ Case 1 DoCmd.OpenForm strObject, acNormal Case 2 DoCmd.OpenReport strObject, acViewPreview Case 3 DoCmd.RunMacro strObject End Select End Sub
Jag tror att innan du börjar med vba-koden bör du ta en titt på tabellbilden (tredje bilden från toppen av den här sidan) om du inte har gjort det i den tidigare sessionen med att skapa Access Project Menu.
ID fältet har ett unikt ID-värde och är ett AutoNumber-fält.
Det andra fältet Desc har objekttypsgruppnamn (formulär, rapporter och makron) och faktiska objektnamn på formulär, rapport och makro.
PID Fältvärdet (förälder-ID) är tomt för objektgruppsnamn:Formulär, rapporter, och Makron . Dessa tomma PID-värdesobjekt kommer vi att placera till vänster i ImageComboBox rullgardinsmeny, med ett teckenmellanslag, och andra objekt kommer att flyttas framåt med fyra teckenmellanslag. Med den här positioneringen av objekt kommer de att se ut som rotnivå- och barnnivånoderna i en TreeView-kontroll, men vi kommer att sakna de anslutande trädlinjerna.
Kontrollera bilden i kontrollen för valda objekt i ImageComboBox, bilden är placerad längst till vänster. Gruppobjektet på nästa rad är placerat efter ett teckenutrymme på vänster sida och andra gruppobjekt visas också på samma plats. De underordnade medlemsobjekten under varje grupp har placerats efter fyra teckenmellanslag.
PID-fältets värde har kontrollerats och om det hittas tomt antar vi att det är ett gruppnamn annars är det ett Access Object Name som vi måste öppna när användaren klickar på det och placera dem som underordnade medlemmar i gruppen. Det faktiska nyckelvärdet i PID-fältet är inte viktigt här. I båda fallen behöver vi det här. Men vi kan använda typfältvärdet för detta ändamål istället.
Nästa, Typ fältet innehåller objekttypen Kod:1 – Form Name , 2 – Rapportnamn, och 3 – Makronamn . De följande tre fälten:Formulär, Rapport och Makro har de faktiska objektnamnen baserat på deras respektive koder i fältet Typ. Jag har använt tre olika fält för tydlighetens skull, alla kan också placeras i en kolumn.
Typ koden och Objektnamn par (säg 2rptCategories ) kommer att sparas i ImageComboBox:s tagg Egendom.
Subrutinen CreateMenu().
Nu, vidare till vba-koden för CreateMenu() Subroutine.
Databasen och andra variabler har deklarerats i början.
imgcombo1 objekt v ariable har initierats med Me.ImageCombo1. Objektet på formuläret.
Därefter imgCombo1.ImageList egenskapen har laddats med ImageList-objektet objimgList Reference , så att vi kommer att kunna komma åt ImageLists indexnummer och nyckelvärden direkt.
Nästa, menyn Tabellpostuppsättningen är öppen med SQL-strängen.
PID-fältets värde har kontrollerats om det är tomt då är det ett objektgruppsnamn, ID värdet är prefixet med konstant X och sparas i strKey variabel. Fältet Desc värdet har sparats i strText Variabel.
Nästa programsats anropar Add()-metoden för ImageComboBox-kontroll och det första objektet har lagts till i rullgardinsmenyn.
imgcombo1.ComboItems.Add , strKey, strText, 1, 2, 1
Det första parametervärdet Indexnummer har utelämnats, men det skapas automatiskt. strKey variabeln består av ID-fältvärdet 1 med prefixet konstant X (X1 ) som nyckel parameter. strText innehåller Desc fältvärde. Nästa värde 1 är den ImageLists första bildens (nyckelvärde folder_close ) Indexvärde. Om du föredrar 'folder_close' nyckel-värde inom citattecken kan du göra det. Nästa värde 2 är den andra bildens ('folder_open') indexvärde eller så kan du använda 'folder_open' inom citattecken och den sista parametern 1 är för indrag.
Obs! För att bekräfta indexordningen för bilder i ImageList Kontrollera bildlistans ordning i ImageCombo2 Display vi har skapat tidigare. Vi kunde ha prefixet Index-värdet till nyckelvärdet med ett mellanslag för att lägga till det numret också till nyckelvärdet för att se ut som [bild] 1 form_close. [bild] 2 form_open och så vidare . . . Detta lämnar jag till dig som en övning för dig själv.
Därefter, om PID-fältets värde inte är noll, är det faktiska menyalternativet Lägg till red under Annat Klausul. Här har vi lagt till ytterligare ett ImageCombo-objekt som vi gjorde tidigare. För [Bild] och [SelImage] params har vi tagit ImageList Item Index-värdet 4 och 5 . Parametrarna för indrag är 4 teckenmellanslag.
I ImageCombo-objektets Add() Metod, under Annat Klausul, vi måste spara Access Object Name (frmData Entry) tillsammans med Typ Kod 1 i taggen (ImageCombo1.ComboItems.Item(strKey).Tag) Fast egendom. När användaren väljer detta objekt från rullgardinsmenyn ComboBox, visas Click() händelsen utlöses, taggen Fastighetsvärdet har extraherats, typkoden har kontrollerats, om typkoden är 1 (Form) och sedan formulärnamnet i Tag Property (frmData Entry) är öppen med DoCmd.OpenForm Kommando.
På så sätt hela menyn Tabellposter har lagts till i Image ComboBox-kontrollen.
Påståendet imgcombo1.ComboItems.Item(1).Selected =True väljer det första objektet som standardobjekt i Image ComboBox Control. Vid denna kodexekveringstid visas Change() händelse utlöses, men inte när ett objekt valts genom att klicka på det i formulärvyn.
OBS: Innan du öppnar formuläret för testkörningen av rullgardinsmenyn, vänligen ta bort kommentarsymbolen från "CreateMenu" samtalslinje i Form_Load() Händelseprocedur. Vi har kommenterat den här raden tillfälligt, under provkörningar av bildvisning från ImageList Control i ImageCombo2 Control.
ImageCombo1_Click() Händelsen utlöses när användaren väljer ett objekt från Image ComboBox Control. Det valda objektets tagg Egenskapsvärdet har kontrollerats för typkod och objektnamn och öppnar det med Docmd.Objecttype ObjectName .
Demodatabasen ProjectMenuV221.accdb i .zip-format nedan för nedladdning.
Ladda ner ProjectMenuV221.zip
ORDBOKSOBJEKT
- Grundläggande ordbokobjekt
- Dictionary Object Basics-2
- Sortera ordboksobjektnycklar och objekt
- Visa poster från ordbok
- Lägg till klassobjekt som ordboksobjekt
- Uppdatera Class Object Dictionary Item