Pastaba.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti prisijungti arba pakeisti katalogus.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti pakeisti katalogus.
Pastaba.
Bendruomenės interesų grupės dabar perkeltos iš "Yammer" į "Microsoft Viva Engage". Norėdami prisijungti prie Viva Engage bendruomenės ir dalyvauti naujausiose diskusijose, užpildykite formą Prašyti prieigos prie "Finance and Operations Viva Engage Community ir pasirinkite bendruomenę, prie kurios norite prisijungti.
Šiame straipsnyje aprašomi įvykių terminai ir raktažodžiai X++.
Naudokite įvykio dizaino šabloną, kad kodas būtų labiau modulinis ir pakartotinai naudojamas. Termino įvykis yra metafora, paaiškinanti, kaip naudojami atstovai. Kai programos vykdymo metu įvyksta kas nors svarbi, įvykiui apdoroti gali reikėti kitų modulių. Šie svarbūs įvykiai vadinami įvykiais. Įvykus įvykiui, programa praneša jo pranešėjui apie įvykį, kad pranešėjas turi siųsti pranešimus apie įvykį. Pranešėjas siunčia pranešimą visoms įvykių apdorojimo programos, kurios yra pranešėjo prenumeratoriai. Kai programa praneša pranešėjui siųsti pranešimus, šis procesas kelia įvykį.
Galite apibrėžti atstovą lentelėje, formoje arba užklausoje, o ne tik klasėje.
Šioje lentelėje pateikiami terminai, apibūdinantys įvykio metaforą.
| Terminas | Aprašas |
|---|---|
| Įvykis | Svarbus įvykis programos modulyje, kuriame papildomi moduliai turi apdoroti pasikartojimą. |
| Pranešėjas | Programos elementas, kuris siunčia informaciją apie įvykį visoms įvykių apdorojimo programoms, kurios prenumeruoja pranešėją. |
| Prenumeratorius | Programos funkcijos arba metodai, kurie prenumeruoja įvykio pranešėją. |
| Įvykių apdorojimo programa | Metodai, kurie prenumeruoja įvykio pranešėją. Įvykių apdorojimo programos gali būti tik tinkamo tipo metodai. |
Raktažodžiai, naudojami programuojant atstovus
Šioje lentelėje rodomi raktažodžiai, apibūdinantys atstovų naudojimą.
| Raktažodis arba terminas | Kodas | Aprašas |
|---|---|---|
| atstovas | delegate myDelegate(str information) {} |
Kodas rodo, kaip atrodo atstovas kodų rengyklėje. Kadangi grąžinimo tipas visada negalioja, jis nėra paminėtas sintaksėje. Riestiniuose skliaustuose neleidžiamas joks kodas ({}). |
| įvykio apdorojimo programa | myClassInstance.myDelegate += eventHandler(otherClass.myInstanceMethod); |
Nors raktinio žodžio eventHandler sintaksė gali sudaryti įspūdį, kad eventHandler yra X++ funkcija, tai nėra funkcija. EventHandler raktažodis nurodo kompiliatorius, kad metodas prenumeruojamas atstovui. |
| Metodo prenumeravimas arba įtraukimas į atstovą | myClassInstance.myDelegate += eventHandler(OtherClass::aStaticMethod); |
Kode statinis metodas OtherClass::aStaticMethod tampa prenumeruojamas atstovui. |
| Skambinimas atstovui | myClassInstance.myDelegate("Hello"); |
Šis skambutis atstovui paragina atstovą iškviesti kiekvieną atstovui prenumeruojamą būdą. Prenumeruojami metodai iškviečiami ta pačia tvarka, kuria jie buvo įtraukti į atstovą. Vienas užsiprenumeruotas metodas turi būti atliktas prieš atstovui iškviečiant kitą būdą. |
Pavyzdžiui
Toliau pateiktame kodo pavyzdyje parodyta, kaip apibrėžti įvykį, prenumeruoti įvykį ir pakelti įvykį naudojant dvi klases. PointWithEvent klasė apibrėžia atstovą, perkeltą. Perkėlimo metodas iškviečia perkeltą atstovą, kuris praneša apie visus objektus, kurie prenumeruoja įvykį. PointKeeper klasė apibrėžia metodą writeMove ir priskiria jį kaip perkelto taško egzemplioriaus, sukurto naudojant metodą createAndMove, įvykių apdorojimo programą.
class PointWithEvent
{
// Instance fields.
real x;
real y;
// Constructor to initialize fields x and y.
void new(real _x, real _y)
{
x = _x;
y = _y;
}
void move(real x_offset, real y_offset)
{
x += x_offset;
y += y_offset;
this.moved(abs(x_offset) + abs(y_offset));
}
delegate void moved(real distance)
{
}
}
class PointKeeper
{
public void createAndMove()
{
PointWithEvent point = new PointWithEvent(1.0, 2.0);
point.moved += eventhandler(this.writeMove);
point.move(4.0, 5.0);
// Output is "9.0".
}
public void writeMove(real distance)
{
info(any2Str(distance));
}
}
Įvykių apdorojimo programos ir metodai prieš / po
Senstelėjusioje X++, metaduomenyse galite nurodyti, kad tam tikri metodai vykdomi prieš ir po metodo vykdymo. Leidėjas įrašė informaciją apie tai, kas užsiprenumeruoja skambutį, o tai nėra naudinga aplinkoje. Dabar galite teikti išankstinio apdorojimo programas ir skelbti jas naudodami kodą, prenumeratoriams pateikdami atributą SubscribesTo.
Pre and post methods pavyzdys
[PreHandlerFor(classStr(MyClass2), methodstr(MyClass2, publisher))]
public static void PreHandler(XppPrePostArgs arguments)
{
int arg = arguments.getArg("i");
}
[PostHandlerFor(classStr(MyClass2), methodstr(MyClass2, publisher))]
public static void PostHandler(XppPrePostArgs arguments)
{
int arg = arguments.getArg("i");
int retvalFromMethod = arguments.getReturnValue();
}
public int Publisher(int i)
{
return 1;
}
Šiame pavyzdyje parodytas publikavimo metodas, vadinamas Publisher. Du prenumeratoriai įtraukiami naudojant atributus PreHandlerFor ir PostHandlerFor. Kodas rodo, kaip pasiekti kintamuosius ir grąžinamas reikšmes.
Ši funkcija skirta atgaliniam suderinamumui ir, kadangi programos kode nėra daug atstovų, publikuoti svarbius programos įvykius. Apdorojimo programos prieš ir po jos gali lengvai sulaužyti dėl pridėtų arba pašalintų parametrų, pakeistų parametrų tipų arba dėl to, kad metodai nebeiškviečiami arba iškviečiami skirtingomis aplinkybėmis. Atributai taip pat naudojami įvykio apdorojimo programų susiejimui su atstovais:
[SubscribesTo(
classstr(FMRentalCheckoutProcessor),
delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))]
public static void RentalFinalizedEventHandler(
FMRental rentalrecord, Struct rentalConfirmation)
{
}
delegate void RentalTransactionAboutTobeFinalizedEvent(
FMRental fmrentalrecord, struct RentalConfirmation)
{
}
Šiuo atveju atributas SubscribesTo nurodo, kad metodas RentalFinalizedEventHandler turėtų būti iškviestas, kai iškviečiamas FmRentalCheckoutProcessor.RentalTransactionAboutToBeFinalizedEvent atstovas. Kadangi leidėjas ir prenumeratoriai susiejami naudojant atributus, negalite nurodyti sekos, kuria iškviečiami prenumeratoriai.