Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai un service qui crée des documents Word.
Pour indiquer le traitement, il y a une fenêtre qui apparait avec une barre de progression. Le service est une variable d'instance de la fenêtre.
Durant mon traitement (depuis le service), je mets à jour le titre de la fenêtre et les 2 Progress Bar, cela fonctionne bien.
Mon problème survient quand j'essaie de donner à l'utilisateur la possiblité d'annuler la tache...Impossible de reprendre le controle sur la fenêtre (deplacement, clic sur le bouton,...) alors qu'elle est rafraichit correctement.
J'ai placé des yield dans mes boucles mais rien à faire...et pas d'autre idées...
Merci d'avance!
Dernière modification par mial (10-01-2008 09:42:27)
Hors ligne
il y a un timer sur ta barre de progression ?
tu as le code qui permet de charger cette fenetre, et et les autres scripts ?
Hors ligne
Je ne suis pas sur que ca aide mais ca ne coute rien
Voici donc la fonction principale de ma fenetre possedant les progressbar avec inv_word un objet n_cst_word chargé du traitement:
string ls_mode if isvalid(inv_word) then // j'associe la GUI inv_word.w_title = this inv_word.hpb_jauge = hpb_1 inv_word.hpb_jauge2 = hpb_2 inv_word.st_progress = st_1 ls_mode = inv_word.of_getmode() if ls_mode = 'DE' then // Impression Word dernier evt inv_word.event ue_impression_word_dernier_evt() if inv_word.of_getprevisualisation() then cb_terminer.visible = true else Close(this) end if elseif ls_mode = 'RV' then // Impression relevé vide inv_word.event ue_impression_word_releve_vide() if inv_word.of_getprevisualisation() then cb_terminer.visible = true else Close(this) end if elseif ls_mode = 'PE' then // Impression dernier evt dchaque periodicite inv_word.event ue_impression_word_periodicite() //if inv_word.of_getprevisualisation() then // cb_terminer.visible = true //else Close(this) //end if elseif ls_mode = 'NC' then // Non conformité inv_word.event ue_non_conformite() Close(this) end if end if
et la fonction principale de mon service n_cst_word :
For ll_i = 1 to upperbound(is_balises) setpointer(arrow!) w_title.setfocus() w_title.setredraw(true) Yield ( ) hpb_jauge2.StepIt ( ) st_progress.Text = 'Remplacement de ' + is_balises[ll_i] + '...' iole_document_tab[ll_index].ActiveDocument.Content.Select // Test de la présence de la balise do while iole_document_tab[ll_index].Selection.Find.Execute(is_balises[ll_i]) // Elle existe, on remplace par la valeur si celle-ci n'est pas nulle if not isnull(is_valeurs[ll_i]) and Trim(is_valeurs[ll_i]) <> "" then iole_document_tab[ll_index].selection.TypeText(is_valeurs[ll_i]) else iole_document_tab[ll_index].selection.TypeText(" ") end if loop next
Vous pouvez voir que mon service met a jour les 2 progressbar et le titre.
Reste a savoir comment rendre ma fenêtre reactive aux clics de souris...
Hors ligne
il y a quoi comme code sur le bouton annuler de ta barre de progression ?
Hors ligne
Pour l'instant rien du tout...juste une messageBox avec un point d'arret en debug, mais rien ne se passe.
Pareil pour tous le evenement clicked, key, .. de ma fenêtre. Il ne passe dans aucun evenement :
l'affichage de la fenêtre est correct mais aucun interactivité.
Hors ligne
il faudrait que tu ajoutes une variable d'instance du genre 'boolean ib_annuler'
dans ta boucle, tu testes cette variable, tant qu'elle est fausse, la boucle tourne.
à partir de ce bouton 'annuler', intégré dans ta fenetre de barre de progression...
un petit bout de code de type :
w_word lw_parent lw_parent = Parent.ParentWindow() IF isvalid(lw_parent) then lw_parent.event ue_annulerword() close(this) end if
et dans l'evenement ue_annulerword de ta fenetre, tu as juste à mettre le boolean à true.
Hors ligne
Oui j'ai bien compri, le bouton annuler est la pour ca..
Je répète mon problème : Impossible de faire le moindre clic sur le bouton annuler ni sur la fenêtre elle même.
Le traitement du service semble empecher toute action. Seul le rafraichissement de ma fenêtre est opérationnel.
Hors ligne
tu ne peux pas mettre un "sleep" à la fin de ton do while ? histoire que tu ai le temps d'avoir la main sur la fenetre de progression ?
Hors ligne
Je viens d'essayer et ca ne change malheureusement rien.
Hors ligne
tu ne peux pas declencher la fenetre d'avancement sur une nouvelle fenetre ?
parce vu ton code, j'ai l'impression que tout est codé dans le meme objet.
Hors ligne
enfin, je donne des pistes comme ca... car je vois bien ton probleme.
on peut maitriser cela pour les retrieve, mais la, c'est un autre cas.
Hors ligne
Résolut grâce à un
do while Yield ( ) loop
plutôt qu'un yield() simple.
Hors ligne