Dans la dernière version, Jack a ajouté l'évènement ON_USER_EVENT, et ça fonctionne parfaitement. C'est un grand pas en avant, et je suis en train d'en tirer avantage.
Il y a un problème similaire que j'aimerais pouvoir résoudre. Panoramic rend certains évènements Windows accessibles au niveau du langage Panoramic, concernant des objets (ON_CLICK, ON_KEY_DOWN etc). Mais il y en a beaucoup d'autres. J'ai parfaitement conscience qu'il est totalement hors de propos de rendre l'ensemble des évènements accessibles - Panoramic deviendrait une usine à gaz, en contradiction avec le concept initial. Par contre, j'aimerais pouvoir lever cette limitation à l'intérieur d'une DLL.
Pour cela, il faudrait pouvoir spécifier une fonction ou procédure interne à une DLL, comme routine évènement d'un type particulier. Le problème se pose pour moi au sujet de l'évènement ON_DRAWWCELL d'un objet GRID (TStringGrid en Delphi). J'ai développé un objet StringGrid créé directement dans la DLL et piloté uniquement par des appels à des fonctions de la DLL. Cela marche, mais reste très lourd et insatisfaisant au niveau d'une programmation Panoramic standard.
Concernant ON_DRAWWCELL d'un GRID, on pourrait évidemment créer, en Panoramic, l'évènement ON_DRAW_CELL, puis gérer tout en Panoramic. Mais il y a trois écueils à cela: d'une part, je ne suis pas certain que Panoramic ait suffisamment de fonctionnalités et performance pour gérer l'affichage individuel de chaque cellule d'un GRID (accès au canvas etc), ensuite un évènement ON_DRAWCELL reçoit cinq paramètres pour lesquels il faudrait définir des variables système, et pour finir cela resterait une solution spécifique à un seul évènement d'un seul objet. Je ne pense pas que ça vaille l'effort de faire cette réalisation.
Par contre, il serait utile de disposer d'une commande Panoramic définissant une procédure DLL comme routine évènement ! Une commande du type suivant:
ON_WINDOWS_EVENT N,E$,A%
avec:
N = numéro d'objet Panoramic
E$ = nom de l'évènement
A% = adresse d'une "class procedure" dans la DLL
et bien entendu la commande symmétrique
OFF_WINDOWS_EVENT N,E$
On pourrait alors faire facilement une fonction DLL retournant cette adresse A% qui serait mémorisée dans une variable standard de Panoramic. Le nom de l'évènement serait donné sous forme d'une chaîne de caractères (du genre "DRAWWCELL" ou "ONDRAWWCELL"...), et Panoramic, via les informations RTTI, pourra retrouver l'évènement ciblé et charger l'adresse spécifiée.
Tout ceci ne peut malheureusement pas être fait directement dans la DLL, car les versions VCL diffèrent. Je peux dévier la procédure WndProc via un API en utilisant le handle, mais je ne peux pas accéder aux propriétés ON... des objets.
J'ai conscience qu'en cas d'erreur de programation dans la DLL, ce genre de fonctionnalités peut conduire à de violents plantages du programme. Mais ceci est vrai pour beaucoup d'autres aspects de programmation des DLLs, et depuis que les violations de mémoire et autres crashs lourds sont captés dans Panoramic, les conséquences sont beaucoup moins spectaculaires, bien que cela complique un peu la mise au point des DLLs. Mais c'est mieux ainsi.
J'ai également conscience que cette demande, très technique, n'est certes pas prioritaire, surtout dans la situation actuelle de Jack. Mais je pense vraiment que cela ouvrirait de nouveaux domaines d'application dans les DLLs. De plus, la technique proposée ne serait pas limitée à une DLL en Delphi, mais pourrait également être utilisée à partir d'une DLL et FreeBasic ou en C.