Weergave van een pop-up boven de klantenhistoriek van het menu "Vensters" met daarin enkele details van het document

0000001919     -      23-02-2017

Deze parameterinstelling laat zien hoe een klein venster met enkele details van een document kan worden weergegeven door gewoon met de muis over het rooster van de klantenhistoriek in het menu "Vensters" te bewegen. Om ergonomische redenen wordt dit proces enkel geactiveerd als de muis over de eerste 6 kolommen beweegt.

Om deze module opnieuw te compileren, volstaat het een project te creëren, genaamd HistCli, dat bestaat uit één enkele klasse Customizer en met als toegevoegde referentie MercatorUi.dll of in de database een HistCli-customizer op te slaan vanaf een tabblad C# in de besteleditor. (deze tweede optie krijgt de voorkeur)

Deze programmering steunt op de interface MercatorUi.ICustomizers.IFormLoadCustomizer. Aangezien in een historiekvenster een nieuw event wordt gecreëerd op basis van een object (de customizer) met een langere levensduur dan het informatiebestandvenster, moeten we MercatorUi.ICustomizers.IFormClosedCustomizer implementeren om er het abonnement op de event CellMove, Move en FormClosing te schrappen.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using MercatorApi;
using MercatorExtensions;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Runtime.InteropServices;

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

        /*
         * FormLoadCustomize is de implementatie van de interface IFormLoadCustomizer.
         * Aangezien deze methode een Form als parameter krijgt (basisvenster, want we kunnen deze interface gebruiken voor diverse schermen),
         * moet er eerst een cast Form -> HistForm worden gerealiseerd.
         * Vervolgens schrijft men een code die zal worden uitgevoerd aan het eind van het evenement Load van HistForm.
         */

        public void FormLoadCustomize(Form WindowsForm)
        {
            MercatorUi.Forms.Hist.HistForm HistForm = (MercatorUi.Forms.Hist.HistForm)WindowsForm;
            HistForm.dataGridView.CellMouseMove += new DataGridViewCellMouseEventHandler(dataGridView_CellMouseMove);
            HistForm.Move += new EventHandler(HistForm_Move);
            HistForm.FormClosing += new FormClosingEventHandler(HistForm_FormClosing);
            form = WindowsForm;
        }

        public void FormClosedCustomize(Form WindowsForm) // Het abonnement moet worden opgezegd voor alle event waarop men geabonneerd is in FormLoadCustomize (het is dus nodig om IFormClosedCustomizer te implementeren)
        {
            {
            MercatorUi.Forms.Hist.HistForm HistForm = (MercatorUi.Forms.Hist.HistForm)WindowsForm;
            HistForm.dataGridView.CellMouseMove -= new DataGridViewCellMouseEventHandler(dataGridView_CellMouseMove);
            HistForm.Move -= new EventHandler(HistForm_Move);
            HistForm.FormClosing -= new FormClosingEventHandler(HistForm_FormClosing);
        }

        private string last_ident = "";
        private Form form;

        void dataGridView_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
        {
            IntPtr activeHandle = MercatorWM.WMdll.GetActiveWindow();
            if ((activeHandle == form.Handle) || (activeHandle == MercatorUi.Wait.WaitStatic.CurrentHandle))
            {
                DataGridView dataGridView = (DataGridView)sender;
                if ((e.RowIndex > -1) && (e.ColumnIndex <= 5) && (dataGridView.Rows[e.RowIndex].Cells["piece"].Value != DBNull.Value))
                {
                    string id = dataGridView.Rows[e.RowIndex].Cells["id"].Value.ToString();
                    string journal = dataGridView.Rows[e.RowIndex].Cells["journal"].Value.ToString();
                    Int64 piece = Convert.ToInt64(dataGridView.Rows[e.RowIndex].Cells["piece"].Value);
                    if (last_ident != id + journal + piece.ToString())
                    {
                        Point p = new Point();
                        GetCursorPos(ref p);
                        string s = "<p><strong>" + journal.Trim() + " " + piece.ToString() + "</strong></p>";
                        MercatorSqlParam[] param = new MercatorSqlParam[3]
                            {
                            new MercatorSqlParam ("@id", id, SqlDbType.Char),
                            new MercatorSqlParam ("@journal", journal, SqlDbType.Char),
                            new MercatorSqlParam ("@piece", piece, SqlDbType.Int)
                            };
                        DataSet ds = Api.Zselect(MercatorUi.Globals.RepData, "select top 5 q,designatio from lignes_v (NOLOCK) where (id=@id) and (journal=@journal) and (piece=@piece) and (designatio<>'') order by recno \r\n select count(*) as nbre from lignes_v (NOLOCK) where (id=@id) and (journal=@journal) and (piece=@piece) and (designatio<>'')", param);
                        if (ds != null)
                        {
                            foreach (DataRow dr in ds.Tables[0].Rows)
                            {
                                if (Convert.ToInt32(dr["q"]) == 0)
                                    s += dr["designatio"].ToString().Trim() + "<br />";
                                else
                                    s += Convert.ToInt32(dr["q"]).ToString("### ##0.00").Trim() + " " + dr["designatio"].ToString().Trim() + "<br />";
                            }
                            if (Convert.ToInt32(ds.Tables[1].Rows[0]["nbre"]) > 5)
                                s += "...";
                        }
                        if (s.EndsWith("<br />"))
                            s = s.Substring(0, s.Length - 6);
                        MercatorUi.Wait.WaitStatic.WaitWindowBaseThread(s, p, 3);
                        last_ident = id + journal + piece.ToString();
                    }
                }
            }
        }

        [DllImport("user32.dll")]
        static extern bool GetCursorPos(ref Point lpPoint);

        void HistForm_Move(object sender, EventArgs e)
        {
            MercatorUi.Wait.WaitStatic.WaitClearBaseThread();
        }

        void HistForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            MercatorUi.Wait.WaitStatic.WaitClearBaseThread();
        }
    }
}