U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Bijzondere voorzorgsmaatregelen bij programmering van customizers

0000001945     -      07-03-2018

Om prestatieredenen worden eventuele customizers niet steeds opgeroepen telkens als ze nodig zijn (bv. telkens als een informatiebestand wordt geopend). De informatiebestandcustomizers, bijvoorbeeld, worden slechts eenmaal opgeroepen, bij het opstarten van Mercator, en opgeslagen in de statische eigenschappen.

Dat impliceert dat ze een langere levensduur hebben (de duur van de Mercator-sessie) dan de vensters waarvoor ze gelden (de informatiebestandvensters). Dit kan problemen stellen voor de Garbage Collector (GC) van de .net-omgeving (beheerder van ongebruikt geheugen), als men een permanente link heeft geïnstalleerd tussen de customizer en het venster dat hij wijzigt.

Het meest klassieke geval van een permanente link is de inschrijving op een abonnement van het venster door de customizer. Dit zal het onmogelijk maken om de door het venster ingenomen geheugenruimte te recupereren, zelfs wanneer dat venster door de gebruiker wordt gesloten. Het is dan ook van essentieel belang dat een customizer geen enkel abonnement meer heeft op enig event. Het abonneren op een event gebeurt via +=, het annuleren van dat abonnement gebeurt via een identieke structuur, waarbij += vervangen wordt door -=.

Voor het abonneren op event wordt doorgaans de methode FormLoadCustomize van de interface MercatorUi.ICustomizers.IFormLoadCustomizer gebruikt.

Op gelijkaardige wijze wordt voor het annuleren van het abonnement meestal gewerkt via de methode FormClosedCustomize van de interface MercatorUi.ICustomizers.IFormClosedCustomizer.

Bij het programmeren van customizers is het van essentieel belang dat nauwgezet wordt toegezien op de toepassing van deze principes. Is dat niet zo, dan zal Mercator altijd steeds meer geheugen verbruiken.

Voorbeelden zie de broncode van:

 


 

Zoals hierboven vermeld, kan een enkele customizer slechts eenmaal worden opgeroepen en gebruikt voor het wijzigen van meerdere Mercator-elementen. Een informatiebestandcustomizer zal dan ook eenmalig worden gecreëerd en gebruikt voor elk overeenstemmend informatiebestandvenster. Het zou dan ook foutief zijn om in de customizer privé-eigenschappen te behouden voor gebruik in verschillende methodes van de klasse.

Voorbeeld van foutieve broncode

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using MercatorUi;
using MercatorApi;

namespace SigCli
{
     public class Customizer : MercatorUi.ICustomizers. IFormLoadCustomizer , MercatorUi.ICustomizers. IFormClosedCustomizer
    {

         private MercatorUi.MovableControls. MovableTextBox textExp;

         public void FormLoadCustomize( Form form)
        {
            MercatorUi.Forms.Sig. SigForm sigForm = (MercatorUi.Forms.Sig. SigForm )form;

            textExp = (MercatorUi.MovableControls. MovableTextBox )sigForm.MovableControls[ "O37F122SIU" ];
            textExp.ButtonCustom.Visible = true ;
            textExp.ButtonCustomClick += new EventHandler (textExp_ButtonCustomClick);
        }

         public void FormClosedCustomize( Form form)
        {
            textExp.ButtonCustomClick -= new EventHandler (textExp_ButtonCustomClick);
        }

         void textExp_ButtonCustomClick( object sender, EventArgs e)
        {
            MercatorUi. Dialogs .Stop(textExp.Text);
        }
    }
}

Hoewel deze code structureel perfect compileerbaar is, is ze niet logisch. Ze zal immers slechts werken op voorwaarde dat er telkens één enkele fiche van het overeenstemmende informatiebestand wordt geopend. Opent men een tweede fiche, dan zal de (unieke) customizer de verwijzing naar de textbox van deze tweede fiche opslaan in de eigenschap textExp. Als de gebruiker terugkeert naar de eerste fiche en op de knop van de textbox klikt, zal het event textExp_ButtonCustomClick wel worden opgeroepen, maar textExp.Text zal overeenstemmen met de waarde van de tweede fiche.

Voorbeeld van correcte broncode

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using MercatorUi;
using MercatorApi;

namespace SigCli
{
     public class Customizer : MercatorUi.ICustomizers. IFormLoadCustomizer , MercatorUi.ICustomizers. IFormClosedCustomizer
    {
         public void FormLoadCustomize( Form form)
        {
            MercatorUi.Forms.Sig. SigForm sigForm = (MercatorUi.Forms.Sig. SigForm )form;

            MercatorUi.MovableControls. MovableTextBox textExp = (MercatorUi.MovableControls. MovableTextBox )sigForm.MovableControls[ "O37F122SIU" ];
            textExp.ButtonCustom.Visible = true ;
            textExp.ButtonCustomClick += new EventHandler (textExp_ButtonCustomClick);
        }

         public void FormClosedCustomize( Form form)
        {
            MercatorUi.Forms.Sig. SigForm sigForm = (MercatorUi.Forms.Sig. SigForm )form;

            MercatorUi.MovableControls. MovableTextBox textExp = (MercatorUi.MovableControls. MovableTextBox )sigForm.MovableControls[ "O37F122SIU" ];
            textExp.ButtonCustomClick -= new EventHandler (textExp_ButtonCustomClick);
        }

         void textExp_ButtonCustomClick( object sender, EventArgs e)
        {
            MercatorUi.MovableControls. MovableTextBox textBox = (MercatorUi.MovableControls. MovableTextBox )sender;
            MercatorUi. Dialogs .Stop(textBox.Text);
        }
    }
}