Ce paramétrage montre comment il est possible d'afficher une petite fenêtre contenant quelques détails d'un document, alors que la souris survole simplement la grille de l'historique clients du menu "Fenêtres". Pour des raisons d'ergonomie, le processus ne se déclenche que si la souris se déplace au-dessus des 6 premières colonnes.
Pour recompiler ce module, il suffit de créer un projet dont le nom est HistCli, qui contient une seule classe Customizer et qui a comme référence ajoutée MercatorUi.dll ou stocker dans la base de données un customizer HistCli à partir d'un onglet C# de l'éditeur de commande. (Cette seconde option est recommandée).
Cette programmation repose sur l'interface MercatorUi.ICustomizers.IFormLoadCustomizer. Comme un nouvel évènement est créé dans une fenêtre d'historique, à partir d'un objet (le customizer) dont la durée de vie est plus longue que celle de la fenêtre de signalétique, nous sommes obligés d'implémenter MercatorUi.ICustomizers.IFormClosedCustomizer pour y supprimer la souscription aux évènements CellMove, Move et FormClosing.
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 est l'implémentation de l'interface IFormLoadCustomizer.
* Comme cette méthode reçoit en paramètre un Form (fenêtre de base - car on peut utiliser cette interface pour divers écrans),
* il faut d'abord effectuer un cast Form -> HistForm
* Ensuite, on écrit un code qui sera exécuté à la fin de l'évènement Load de 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) // il faut se désabonner de tous les events auxquels on s'est abonné dans FormLoadCustomize (donc, il est nécessaire d'implémenter IFormClosedCustomizer)
{
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();
}
}
}