Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
Bemerkning
Interessegrupper i fellesskapet har nå flyttet fra Yammer til Microsoft Viva Engage. Hvis du vil bli med i et Viva Engage-fellesskap og delta i de siste diskusjonene, fyller du ut skjemaet Be om tilgang til Finance and Operations Viva Engage Community og velger fellesskapet du vil bli med i.
Denne artikkelen beskriver hendelsesterminologi og nøkkelord i X++.
Bruk mønsteret for hendelsesutforming til å gjøre koden mer modulær og gjenbrukbar. Termhendelsen er en metafor som forklarer hvordan representanter brukes. Når det oppstår noe viktig under en programkjøring, kan det hende at andre moduler må behandle forekomsten. Disse viktige forekomstene kalles hendelser. Når en hendelse oppstår, forteller programmet sin varsler for hendelsen at varsleren må sende varsler om hendelsen. Varsleren sender et varsel til alle hendelsesbehandlinger som er abonnenter av varsleren. Når programmet ber varsleren om å sende varslene, øker denne prosessen en hendelse.
Du kan definere en representant i en tabell, et skjema eller en spørring, og ikke bare i en klasse.
Tabellen nedenfor viser begrepene som beskriver hendelsesmetaforen.
| Semester | Description |
|---|---|
| Hendelse | En viktig forekomst i en programmodul der flere moduler må behandle forekomsten. |
| Varsleren | Programelementet som sender informasjon om hendelsen til alle hendelsesbehandlingene som abonneres på varsleren. |
| Abonnent | Programfunksjonene eller metodene som abonneres på en hendelsesvarsler. |
| Hendelsesbehandling | Metodene som abonnerer på en hendelsesleser. Bare riktig type metoder kan være hendelsesbehandlinger. |
Nøkkelord som brukes til programmering som bruker representanter
Tabellen nedenfor viser nøkkelordene som beskriver bruken av representanter.
| Nøkkelord eller term | Kode | Description |
|---|---|---|
| representant | delegate myDelegate(str information) {} |
Koden viser hvordan representanten ser ut i koderedigeringsprogrammet. Siden returtypen alltid er ugyldig, er den ikke nevnt i syntaksen. Ingen kode er tillatt i klammeparentesene ({}). |
| eventHandler | myClassInstance.myDelegate += eventHandler(otherClass.myInstanceMethod); |
Selv om syntaksen for eventHandler-nøkkelordet kan gi inntrykk av at eventHandler er en X++-funksjon, er det ikke en funksjon. EventHandler-nøkkelordet forteller kompilatoren at en metode abonneres på en representant. |
| Abonnere eller legge til en metode i en representant | myClassInstance.myDelegate += eventHandler(OtherClass::aStaticMethod); |
I koden blir den statiske metoden OtherClass::aStaticMethod abonnert på representanten. |
| Ringe en representant | myClassInstance.myDelegate("Hello"); |
Dette kallet til representanten ber representanten om å kalle opp hver metode som abonneres på representanten. De abonnerte metodene kalles i samme rekkefølge som de ble lagt til representanten i. Én abonnementsmetode må fullføres før representanten kaller opp neste metode. |
Eksempel
Følgende kodeeksempel viser hvordan du definerer en hendelse, abonnerer på en hendelse og reiser en hendelse ved hjelp av to klasser. PointWithEvent-klassen definerer en representant, flyttet. Flyttemetoden kaller opp den flyttede representanten, som varsler alle objekter som abonnerer på hendelsen. PointKeeper-klassen definerer writeMove-metoden og tilordner den som hendelsesbehandling for den flyttet representanten for Point-forekomsten som er opprettet i createAndMove-metoden.
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));
}
}
Hendelsesbehandlinger og forhånds-/innleggsmetoder
I eldre X++kan du forskrive i metadata som bestemte metoder utfører før og etter kjøringen av en metode. Utgiveren registrerte informasjonen om hva abonnerer kaller, noe som ikke er nyttig i miljøet. Du kan nå angi forhånds- og postbehandlinger gjennom kode ved å angi Attributtet AbonnerTil på abonnentene.
Eksempel på forhånds- og innleggsmetoder
[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;
}
Dette eksemplet viser en publiseringsmetode kalt Publisher. To abonnenter verves ved hjelp av attributtene PreHandlerFor og PostHandlerFor. Koden viser hvordan du får tilgang til variablene og returverdiene.
Denne funksjonen er angitt for bakoverkompatibilitet og, fordi programkoden ikke har mange representanter, til å publisere viktige programhendelser. Forhånds- og postbehandlinger kan enkelt brytes som et resultat av lagt til eller fjernet parametere, endrede parametertyper eller fordi metoder ikke lenger kalles, eller kalles under forskjellige omstendigheter. Attributter brukes også for binding av hendelsesbehandlinger til representanter:
[SubscribesTo(
classstr(FMRentalCheckoutProcessor),
delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))]
public static void RentalFinalizedEventHandler(
FMRental rentalrecord, Struct rentalConfirmation)
{
}
delegate void RentalTransactionAboutTobeFinalizedEvent(
FMRental fmrentalrecord, struct RentalConfirmation)
{
}
I dette tilfellet angir Attributtet SubscribesTo at metoden RentalFinalizedEventHandler skal kalles når FmRentalCheckoutProcessor.RentalTransactionAboutToBeFinalizedEvent-representanten kalles. Siden bindingen mellom utgiveren og abonnentene utføres gjennom attributter, kan du ikke angi rekkefølgen som abonnenter kalles i.