Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Note
Community-interessegrupper er nu flyttet fra Yammer til Microsoft Viva Engage. Hvis du vil deltage i et Viva Engage community og deltage i de seneste diskussioner, skal du udfylde formularen Anmodning om adgang til Finance and Operations Viva Engage Community og vælge det community, du vil deltage i.
I denne artikel beskrives hændelsesterminologi og nøgleord i X++.
Brug mønsteret for hændelsesdesign til at gøre din kode mere modulopbygget og genbrugelig. Ordhændelsen er en metafor, der forklarer, hvordan stedfortrædere bruges. Når der forekommer noget vigtigt under et programkørsel, kan det være nødvendigt at behandle forekomsten i andre moduler. Disse vigtige forekomster kaldes hændelser. Når en hændelse indtræffer, fortæller programmet anmelderen for hændelsen, at anmelderen skal sende meddelelser om hændelsen. Anmelderen sender en meddelelse til alle hændelseshandlere, der er abonnenter på anmelderen. Når programmet beder anmelderen om at sende meddelelserne, udløser denne proces en hændelse.
Du kan definere en stedfortræder i en tabel, formular eller forespørgsel og ikke kun i en klasse.
I følgende tabel vises de ord, der beskriver hændelsesmetforen.
| Periode | Beskrivende tekst |
|---|---|
| Hændelse | En vigtig forekomst i et programmodul, hvor flere moduler skal behandle forekomsten. |
| Anmelderen | Det programelement, der sender oplysninger om hændelsen til alle hændelseshandlere, der abonnerer på anmelderen. |
| Abonnent | De programfunktioner eller -metoder, der abonneres på en hændelses anmelder. |
| Hændelseshandler | De metoder, der abonnerer på en hændelses anmelder. Kun den relevante type metoder kan være hændelseshandlere. |
Nøgleord, der bruges til programmering, som bruger stedfortrædere
I følgende tabel vises de nøgleord, der beskriver brugen af stedfortrædere.
| Nøgleord eller ord | Kode | Beskrivende tekst |
|---|---|---|
| delegeret | delegate myDelegate(str information) {} |
Koden viser, hvordan stedfortræderen ser ud i kodeeditoren. Da returtypen altid er tom, nævnes den ikke i syntaksen. Ingen kode er tilladt i klammeparenteserne ({}). |
| eventHandler | myClassInstance.myDelegate += eventHandler(otherClass.myInstanceMethod); |
Selvom syntaksen for nøgleordet eventHandler kan give indtryk af, at eventHandler er en X++-funktion, er det ikke en funktion. Nøgleordet eventHandler fortæller compileren, at en metode abonneres på en stedfortræder. |
| Abonner på eller føj en metode til en stedfortræder | myClassInstance.myDelegate += eventHandler(OtherClass::aStaticMethod); |
I koden abonneres den statiske metode OtherClass::aStaticMethod på stedfortræderen. |
| Ring til en stedfortræder | myClassInstance.myDelegate("Hello"); |
Dette kald til stedfortræderen beder stedfortræderen om at kalde hver metode, der abonneres på stedfortræderen. De metoder, der abonneres på, kaldes i samme rækkefølge, som de blev føjet til stedfortræderen. Én metode, der abonneres på, skal fuldføres, før stedfortræderen kalder den næste metode. |
Eksempel:
Følgende kodeeksempel viser, hvordan du definerer en hændelse, abonnerer på en hændelse og udløser en hændelse ved hjælp af to klasser. Klassen PointWithEvent definerer en stedfortræder, der er flyttet. Metoden move kalder den flyttede stedfortræder, som giver besked om alle objekter, der abonnerer på hændelsen. Klassen PointKeeper definerer metoden writeMove og tildeler den som hændelseshandler for den flyttede stedfortræder for den Point-forekomst, der er oprettet i metoden createAndMove.
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));
}
}
Hændelseshandlere og præ/post-metoder
I ældre X++ kan du ordinere i metadata, som visse metoder udfører før og efter udførelsen af en metode. Udgiveren har registreret oplysningerne om, hvad der abonnerer på opkald, hvilket ikke er nyttigt i miljøet. Du kan nu angive før- og efterhandlere via kode ved at angive attributten SubscribesTo for abonnenterne.
Eksempel på præ- og post-metoder
[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;
}
I dette eksempel vises en publiceringsmetode med navnet Publisher. To abonnenter tilmeldes ved hjælp af attributterne PreHandlerFor og PostHandlerFor. Koden viser, hvordan du får adgang til variablerne og returværdierne.
Denne funktion er beregnet til bagudkompatibilitet og til at publicere vigtige programhændelser, fordi programkoden ikke har mange stedfortrædere. Før- og efterhandlere kan nemt bryde som følge af tilføjede eller fjernede parametre, ændrede parametertyper, eller fordi metoder ikke længere kaldes eller kaldes under forskellige omstændigheder. Attributter bruges også til binding af hændelseshandlere til stedfortrædere:
[SubscribesTo(
classstr(FMRentalCheckoutProcessor),
delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))]
public static void RentalFinalizedEventHandler(
FMRental rentalrecord, Struct rentalConfirmation)
{
}
delegate void RentalTransactionAboutTobeFinalizedEvent(
FMRental fmrentalrecord, struct RentalConfirmation)
{
}
I dette tilfælde angiver attributten SubscribesTo, at metoden RentalFinalizedEventHandler skal kaldes, når FmRentalCheckoutProcessor.RentalTransactionAboutToBeFinalizedEvent-stedfortræderen kaldes. Da bindingen mellem udgiveren og abonnenter sker via attributter, kan du ikke angive den rækkefølge, som abonnenterne kaldes i.