Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: ON_CHANGE pour l'objet MEMO Ven 28 Nov 2014 - 0:47 | |
| J'ai hésité à poster cela dans la section des bugs, mais je préfère le faire finalement ici. L'objet MEMO peut recevoir un évènement ON_CHANGE. Il est déclenchée par une commande ITEM_ADD, par exemple. L'ennui, c'est qu'un message Windows WM_SETTEXT ne déclenche pas cet évènement, bien que ce message remplace complètement le texte du mémo par un autre texte, envoyé ce message. Si ce n'est pas un changement du contenu du mémo, je ne comprends plus... Pour un objet EDIT, par contre, ça marche bien: la commande TEXT déclenche l'évènement ON_CHANGE d'un objet EDIT, et le message Windows WM_SETTEXT également. Parfait. Mais alors, pourquoi cette dissymétrie avec MEMO ? Voici les codes pour le mettre en évidence. Le code Panoramic: - Code:
-
label change, chargeP, chargeW dim res%
memo 10 : top 10,10 : left 10,10 : on_change 10,change
button 20 : top 20,100 : left 20,10 : width 20,150 caption 20,"Charger mémo Panoramic" on_click 20,chargeP button 30 : top 30,130 : left 30,10 : width 30,150 caption 30,"Charger mémo Windows" on_click 30,chargeW dll_on "test_memo.dll"
end
change: message "mémo a changé" return chargeP: item_add 10,date$+" "+time$ return
chargeW: res% = dll_call1("test_memo_load",handle(10)) return
Et le code de la DLL par test_memo.dpr (Delphi 6 Personal Edition): - Code:
-
library test_memo;
uses SysUtils, Windows, Messages, Classes;
{$R *.res}
function test_memo_load(hnd: integer):integer; stdcall; export; var s: string; begin s := FormatDateTime('dddd, mmmm d, yyyy, hh:mm AM/PM', Now); SendMessage(hnd, WM_SETTEXT,0, integer(pchar(s))); result := 0; end;
exports test_memo_load;
begin end.
La DLL est ultra-simple. Une seule fonction qui remplace le texte du mémo par une chaîne de caractères contenant la date et l'heure. Cette fonction est appelée par le bouton "Charger mémo Windows". L'évènement ON_CHANGE du mémo devrait se déclencher chaque fois. Il n'en est rien. Le bouton "Charger mémo Panoramic" ajoute une ligne avec date et heure au texte du mémo. Et là, l'évènement se déclenche. Est-ce que tu peux y faire quelque chose, Jack ? | |
|
Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: ON_CHANGE pour l'objet MEMO Ven 28 Nov 2014 - 16:07 | |
| Oui, après différents essais, j'en arrive à la conclusion qu'un événement OnChange ne se déclenche sur un MEMO que lorsqu'on ajoute ou qu'on retire une ligne. Le message Windows WM_SETTEXT ne déclenche pas l'événement OnChange sur cet objet : c'est codé comme ça dans Windows.
Ce comportement n'est pas du à Panoramic, mais à Windows. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ON_CHANGE pour l'objet MEMO Ven 28 Nov 2014 - 17:33 | |
| D'accord. Merci, Jack. Il va falloir que je change mon fusil d'épaule. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ON_CHANGE pour l'objet MEMO Ven 28 Nov 2014 - 22:07 | |
| Pour clore ce sujet, je publie ici ma solution à ce problème. J'ai fait une procédure interne à la DLL, avec laquelle je peux forcer le déclenchement de l'évènement ON_CHANGE d'un objet MEMO. Je lui passe le handle de l'objet, et si c'est un TMemo, je fais ce traitement: - Code:
-
// force l'évènement ONCHANGE d'un objet TMemo (qui n'est pas déclenché par me message WM_SETTEXT procedure fire_memo_onchange(hnd: integer); var aName: array [0..255] of Char; j: integer; s: string; begin GetClassName(hnd, aname, 256); if aname='TMemo' then begin j := GetWindowTextLength (hnd); SetFocus (hnd); SendMessage(hnd, EM_SETSEL, j, j); s := ' '; SendMessage (hnd, EM_REPLACESEL, 0, LongInt(pchar(s))); end; end; Je reconnais que ça n'a pas d'intérêt particulier pour un panoramicien. Je le mets juste pour clore ce sujet et indiquer que je sais dorénavant déclencer cet évènement si j'en ai besoin. En tout cas, je te remercie d'avoir planché sur ce problème. | |
|
Contenu sponsorisé
| Sujet: Re: ON_CHANGE pour l'objet MEMO | |
| |
|