Comment faire pour qu'une form attente le retour d'information d'une autre form?

Résolu
Microsux Messages postés 19 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 1 septembre 2009 - 30 juin 2005 à 16:13
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 7 juil. 2005 à 19:42
Bonjour a tous,

J'ai un probleme.J'ai une application mdi.Dans cette application j'ai une form qui realise un traitement.Au cours de celui-ci,celle-ci fait appel a une autre form dans laquelle l'utilisateur doit choisir une valeur et cliquer sur un bouton.L'info doit ensuite etre repassee a l'autre form.
Pour afficher la seconde form,j'appelle une fonction dans celle-ci qui se charge de l'afficher etc...
Probleme, la fonction de la seconde form appelee par la premiere ne peut renvoyer le resultat.Il faut que l'utilisateur clique sur un bouton ok.
Donc,dans ma form 1, j'ecris:
variable = form2.fonction()
Ca ca marche nickel quand il n'y a pas d'interaction utilisateur et que la fonction rend son resultat.Tout le monde est d'accord.
j'aimerai que le traitement s'arrete la en attendant l'info mais vu que la fonction ne renvoie rien (oui je sais jaurai alors du faire une sub ms le probleme est pas la) le traitement continue sans avoir eu la bonne valeur et ca torche.
Je sais pas si c'est tres clair.Mais je suis bien bloque.
Si quelqu'un peut m'aider ce serait bien sympa et mon patron sera content ;)

9 réponses

ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
6 juil. 2005 à 20:58
Dommage!



Mais entre nous, dans les boucles d'attente il faut toujours mettre un
DoEvents!!! Je ne l'ai pas mis parce que ça me paraissait évident!!!




Do While varAttTmp <> False

DoEvents
Loop



Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
3
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
30 juin 2005 à 20:55
Je ne suis pas certain d'avoir bien compris mais je pense que ton problème doit pouvoir être résolu via une variable globale. Pour se faire, il faut insérer un "Module de code" et, dedans, déclarer une variable avec le mot clef "Public" :
Public maVariable As MonType

Cette variable sera, dans ce cas, commune à tous les modules de code ainsi qu'a toutes les Forms qu'elles soient Mère, fille, ou modale! Du coup, elle te servira pour passer des arguments...

Est-ce que celà répond à ta question ?????
Si oui, clique sur le bouton "Accepter ..." de ce cadre, merci. Sinon, dit-le moi... et précise-nous sous quelle version de VB tu codes (VBA, VBS, VB6, VB.NET, ...) ok!

Enjoy
0
Microsux Messages postés 19 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 1 septembre 2009
1 juil. 2005 à 09:05
Je code en vb6 (sp6).
J'ai deja un module dans mon projet ou je declare effectivement des variables globales comme par exemple les connexions aux bases de données.
Ta solution ne va malheureusement pas resoudre mon probleme.En fait,ce n'est pas le passage de variables qui pose probleme.
Mon probleme est de pouvoir interrompre l'execution du code dans ma 1er form tant que l'utilisateur n'a pas cliqué sur le bouton ok de la seconde form.
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
1 juil. 2005 à 19:25
J'ai toujours pas super bien pigé ton truc mais moi je te propose un truc du genre boucle d'attente.

Si tu utilises une variable globale (varAttTmp par exemple) tu peux faire un truc du genre :




Module de code (globale) :

Public varAttTmp As Boolean




1ère feuille (appelante) :

varAttTmp = True

'Affiche la 2ème fenêtre

Form2.Show

'Boucle d'attente

Do While varAttTmp <> False

Loop



2ème feuille (appelée) :

Private Function/Sub ...

...

'Modif de la valeur par l'utilisateur mais sans appuyé sur le bouton "Ok" :

Valeur = controle.Machin.Bidule.Truc...

varAttTmp = False

...

End Function/Sub



Le problème majeur de telles pratiques c'est que, bien évidemment, la
deuxième feuille sera toujours visible lorsque la première continuera
sa procédure!!!



Moi je me demande si tu ne devrais pas jouer sur le coté "modal / non modal" de tes feuilles...



Te souhaitant bien du courage...


Enjoy
<hr size="2" width="100%">
(Si une réponse vous convient, cliquez sur son bouton "Accepter")
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Microsux Messages postés 19 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 1 septembre 2009
6 juil. 2005 à 18:33
Merci mais j'avais deja pense a ca.Mais le probleme avec ce style de boucle est que,comment dire,ca tourne trop vite et tu perd un peu la main sur le prog.Exemple,j'avais une listebox a derouler pendant que cette boucle tournait et j'arrivis pas a la derouler.
Mais t'inquiete,mon probleme est resolu.J'ai trouve une autre entourloupe et maintenant ca marche comme je veux.
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
6 juil. 2005 à 21:01
Oui, j'oubliais... ça raisoud le problème de "vitesse"
qui n'en est pas un en fait mais plutôt, au contraire, un problème de
lenteur. Du coup, avec ça tu devrais pouvoir ouvrir ta liste déroulante!



Mais si tu as trouvé la solution, s'il te plait, met là sur le site
parce qu'après tout, c'est comme ça qu'il fonctionne (sur le
partage)!!! Alors ne garde pas pour toi toutes les solutions en ne nous
donnant que les problèmes à raisoudre !!!

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
0
Microsux Messages postés 19 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 1 septembre 2009
6 juil. 2005 à 23:18
Ah ben ca je savais pas.Et je connais po non plus oops!Vais regarder ca.
Merci
0
Microsux Messages postés 19 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 1 septembre 2009
6 juil. 2005 à 23:27
Ok, je t'explique ce que j'ai fait.
Donc j'ai une fonction dans une form qui rempli une grille.Parfois,une valeur ne peut etre determinee et la premiere idee etait d'interrompre le traitement dans ce cas,et de demander a l'utilisateur de selectionner manuellement certaines valeurs par l 'intermediaire d'autre form.
Mais vu que je savais pas arreter le traitement en cours dans la 1er form ben ca foirait.Donc j'ai decide de laisser le traitement aller jusqu'au bout.Ensuite,l'utilisateur peut recalculer les cellules indeterminees a son aise.(ce qui est,en plus,bien plus logique et convivial qu'un traitement qui s'interrompt san cesse)
Rien de plus simple en fait,les fonction de traitement prevu dans la 1er form,je les ai mis dans le module de mon app,ainsi que certaines variables que j'ai rendu global,une fois le traitement de la 1er form terminee,les autres forms peuvent a tout moment faire appel a ces fonction,modifier ces variables et recalculer les cellules.
C'est la maniere de penser qui etait a revoir :)
Mais je vais approfondir ta solution qui semble fort utile
En gros,le doevents ca signifie, executer le reste en attendant?
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
7 juil. 2005 à 19:42
Hé hé, ça arrive à tout le monde de penser de travers!!!



Alors, le DoEvents... Je sais pas si tu as la MSDN (l'aide du VB) parce
qu'elle explique ça bien mieux que moi. Mais dans le doute, je vais
quand même essayer de t'expliquer ça... :

Windows est "multitâches". Autrement dit, il arrive a faire plusieurs
trucs en même temps... Sauf qu'en fait, ben il les fait pas "en même
temps" parce que c'est pas possible (en l'état des choses... pas dans
l'absolu!). En fait, pour donner cette illusion, il bascule de
processus en processus exécutant à chaque fois que ce qui est
necessaire. Car en effet, le temps libre des applications
est très

de par leur orientation "utilisateur". Donc, au lieu de perdre ce
temps, Windows travail comme un "serveur" de bar. A savoir, il va
prendre la commande du dernier client, il va voir si le 1er est
content, il débarrasse une table au passage, récupère les consons au
bar puis les dépose et reprend une commande, ... C'est pour ça qu'on a
l'impression que le serveur est toujours à notre disposition (que c'est
le notre) alors qu'en fait, il sert tout le monde alternativement.

Donc, dès que le code d'une de tes procédure est terminé, Windows passe
à un autre "client". Mais il ne passera à un autre client que lorsque
tout ce que ton prog lui demande de faire est terminé!!!



Or, lorsque tu fais des boucles, il se peut que tu enfermes ton
programme pour une durée relativement longue!!! Donc, Windows va se
bloquer là dessus et ne faire que ça jusqu'a ce que ta boucle soit
terminée. Or, comme il n'a qu'un doigt notre Windows et qu'il peut pas
être partout à la fois, ben tout le reste est figé en attente (freeze
temporaire). Du coup, le curseur de ta souris dit que Windows est
occupé et qu'il ne répondra à tes demandes que lorsqu'il aura fini son
job.



Bref, un DoEvent c'est un peu comme lui dire, lorsque tu sais que tu as
une grosse commande à passer (une boucle longue à exécuter), je peux
attendre un instant alors allez vite traiter les autres petits clients
et revenez me voir pour qu'on continu de passer notre commande...
Autrement dit, c'est rendre la main à Windows durant un tour de piste
(processus). C'est donc de la politesse inter-softs... C'est dire,
allez-y madame, passez devant puisque vous n'en avez pas pour
longtemps, moi, j'en ai pour un bout de temps! Or, si tu fais pas ça,
ben tout le système est coincé à la caisse en attendant que ton soft
égoïste ait finit ce qui, du coup, casse l'effet "multitâches" !!!



Bon, j'ai un peu broder... Mais as-tu tout compris ou pas ???

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
0
Rejoignez-nous