Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour tous,
j'ai un problème avec l'appui de la touche ESC en édition dans une DW; on fait un traitement générique sur nos DW consistant à rappeler la valeur précédente d'un champ lors de l'appui sur ESC. Cette partie fonctionne, sauf que visiblement dans la couche PB, la DW semble annuler un flag permettant de savoir si une édition est en cours quand on utilise ESC.
Du coup lorsque que je sors du champ, il n'y a pas de ItemChanged(), même si le traitement a remis une valeur qui n'est pas la valeur initiale du retrieve. Ça permet de modifier discrètement une valeur sans appeler les traitements ad-hoc. C'est pratique pour Madoff, mais moi j'aimerais bien remettre le flag "modif en cours".
SetItemStatus() ne semble pas pouvoir m'aider, ni la valeur de retour de l'évènement KeyDown() (pbm_dwnkey). Vous auriez une suggestion ?
Dernière modification par seki (31-05-2012 14:58:11)
Hors ligne
Je suppose qu'il y a un acceptText() à la fin de ton traitement générique?
Hors ligne
Il n'y en avait pas (on le fait généralement plus tard, au moment de quitter la fenêtre ou à certains changements de focus pour forcer l'enregistrement des données), mais l'ajouter n'a rien changé.
Je suis en train de tenter la magie vaudou (rechercher via l'api la "fenêtre" de classe PBEDIT115 dans les enfants de ma DW; j'arrive à la trouver et en récupérer le contenu mais je n'arrive pas à lui appliquer des modifications qui seraient vues par la DW) mais je n'ai rien qui fonctionne pour le moment.
Hors ligne
Bon, j'ai avancé un peu et voici où j'en suis :
- la DW semble ne recevoir aucun message windows concernant l'appui de touche (WM_KEYDOWN / WM_CHAR / WM_KEYUP)
- c'est le contrôle PBEDIT115 qui est affiché à l'emplacement d'une case de ma DW qui reçoit les messages
- on ne peut rien faire au niveau de l'évènement other() ou de keydown() puisque la touche a déjà été reçue et traitée par l'edit (on ne peut pas "refuser" une touche, c'est déjà fait)
Il faudrait que j'arrive à faire un SetItem() qui permette de recevoir l'ItemChanged() ou que j'arrive à envoyer quelque chose à l'édit pour lui faire croire que la modif vient de l'utilisateur...
Bon, dans l'immédiat je laisse tomber, PB a gagné sauf si quelqu'un me propose une idée géniale...
Hors ligne
Bonjour,
Je n'ai pas tout suivi. Le comportement par défaut de la touche ESC dans une datawindow remet bien par défaut la précédente valeur acceptée et il est inutile de faire un traitement spécifique et le "status flag" reste correcte même si le champ a déjà fait l'objet d'une précédente modification.
Il me paraît normal de ne pas déclencher l'Itemchanged puisque tu remets la valeur précédente ayant déjà été acceptée donc pas de changement.
Sinon pour déclencher un itemchanged forcé, je procède de la manière suivante :
dw_1.SetColumn("mycol1")
dw_1.SetText(ls_previousvalue)
dw_1.AcceptText()
Hors ligne
buck a écrit:
Je n'ai pas tout suivi. Le comportement par défaut de la touche ESC dans une datawindow remet bien par défaut la précédente valeur acceptée et il est inutile de faire un traitement spécifique et le "status flag" reste correcte même si le champ a déjà fait l'objet d'une précédente modification.
Le hic c'est qu'ici le comportement a été sophistiqué, et qu'à chaque modification (chaque EditChanged) on mémorise la modif, de sorte que si on appuie ESC plusieurs fois, on "rejoue la saisie à l'envers". C'est une sorte de fonctionnalité d'undo multiple comme dans n'importe quel éditeur de texte décent.
Mon problème c'est que la partie "remettre les valeurs précédentes" fonctionne, mais qu'en plus le fonctionnement de base de PB en annulant la modif en cours m'embête. Esc + SetItem() ne génère pas d'ItemChanged() quand le Setitem() remet une valeur différente de la valeur acceptée précédente. (Ou je m'y suis mal pris)
Hors ligne
Ok, c'est plus clair. Tu procèdes bien à un traitement spécifique sur la touche ESC.
Si tu tiens à déclencher un Itemchanged après avoir remis l'ancienne valeur remplace le setitem par :
dw_1.SetColumn("mycol1")
dw_1.SetText(ls_previousvalue)
dw_1.AcceptText()
Je pense que cela devait marcher.
Hors ligne
buck a écrit:
Je pense que cela devait marcher.
\o/ Dans mes bras ! Ça marche enfin comme je le voulais !
Bilan :
- il faut faire le SetColumn()
- il faut passer par SetText() c'est tout con, mais je n'y avais pas pensé; c'est ce que j'essayais de faire avec mes hack sur le contrôle edit dans les enfants de la DW
- je dois Poster l'appel de mon traitement
Ça ne fonctionne pas avec un SetItem(), ou un dw.object.data[ al_row, al_column ] = old_data...
J'y ai passé la demi-journée hier et un bon moment aujourd'hui à tester ton truc pour identifier ce qui était indispensable.
Bon, ça a l'air de faire ce qu'il faut (= ça compile)... Je peux faire un commit du code.
Ça vaut au moins 1 000 000 pepites ça !
Hors ligne