Dogodkovna procedura se nikoli ne pokliče
Procedura, kot je Grid1_RowClick ali btnSave_Click, obstaja v modulu obrazca, vendar se ob uporabnikovem
dejanju na kontrolniku nič ne zgodi – nobena prekinitvena točka ni dosežena, nobeno okno s sporočilom se ne
prikaže.
Okolje
Vsi kontrolniki in objekti WKL, vse izdaje, Access za Microsoft 365 (polna različica in izvajalno okolje) ter obrazci UserForm v Excelu in Wordu.
Vzrok
Eden od naslednjih vzrokov, najpogostejši najprej:
- Modula obrazca ni mogoče prevesti. Modul z napako pri prevajanju na katerem koli mestu ne prejme nobenega dogodka, Access pa tega nikjer ne sporoči, dokler modula ne prevedete:
DoCmd.OpenForm, poklican z avtomatizacijo, se vrne, ne da bi odprl obrazec,RunCommand acCmdCompileAndSaveAllModulespa ne sproži napake. Pogost vzrok je ročno natipkana deklaracija z drugačnim številom parametrov, kot jih ima dogodek, ali tip naštevanja (WklUpdateAction…), medtem ko sklic na WKL Forms Object Library manjka. - Obrazec nima modula. Ima modul = Ne: Access obrazcu ne posreduje nobenega dogodka nobenega kontrolnika. Zadošča prazen modul.
- Dejanje je sprožila koda. Večina dogodkov sporoča, kaj naredi uporabnik. Ista sprememba, ki jo naredi koda –
SelectedKey = 5,Value = True,MoveNode,Requery– ne sproži nobenega dogodka, tako kot ga ne sprožiAfterUpdatepolja z besedilom Accessa, ki mu vrednost nastavi koda. Izjeme so navedene pri ustreznem članu:AfterTabChangekontrolnikaWklDockLayout(razlogwtcCode),FilterChipRemoved(ByUser = False) inCommandStateChangesledijo tudi spremembam, ki jih naredi koda. - Dogodek oblikovanja je izklopljen.
NodeFormat,RowFormatinCellFormatse pojavijo samo priFormatEvents = True(zakaj). - Ime se ne ujema. Procedura se mora imenovati
<ime kontrolnika>_<dogodek>, in sicer s trenutnim imenom kontrolnika; ko kontrolnik preimenujete, mu stara procedura ne pripada več. WithEventsznotraj procedure ali pa objekta ni več. PriWklToastinWklLinkManagermora biti spremenljivkaWithEventsdeklarirana na vrhu modula razreda ali modula obrazca, objekt pa mora biti tam še vedno shranjen (Set mToast = New WklToast), ko se dogodek pojavi.- Druga dogodkovna procedura istega kontrolnika se še izvaja. VBA ne posreduje nobenega dogodka objekta, dokler se izvaja procedura za dogodek istega objekta. Ukazi za zapise kontrolnika
WklGrid(DeleteSelected,NewRecord…), poklicani znotraj ene od njegovih lastnih dogodkovnih procedur, se zato izvedejo šele, ko se ta procedura konča, tako da njihovi dogodki prispejo; drugi dogodki, sproženi medtem, se izgubijo.
Rešitev
- V urejevalniku VBA izberite Debug › Compile <project> in odpravite vse napake, ki jih prikaže; nato v oknu Immediate preverite, ali
? Application.IsCompiledvrne True. - Lastnost obrazca Ima modul nastavite na Da.
- Proceduro ustvarite s seznamoma objektov in procedur v oknu s kodo (ali na strani oblikovalnika Dogodki pri drevesnih kontrolnikih in mrežah), da bosta njeno ime in deklaracija pravilna (navodilo).
- Za dogodke oblikovanja nastavite
FormatEvents = True; pri objektih deklaracijoWithEventspremaknite na raven modula. - Če želite kodo izvesti po dejanju, ki ga sprožite sami, pokličite svojo proceduro neposredno za stavkom, ki dejanje sproži.
sl/wiki/msaccess/comctl/troubleshooting/event-procedure-never-called.txt · Zuletzt geändert: von Wolfgang van der Stille