Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Problème de fenêtre modale. | |
| | Auteur | Message |
---|
Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Problème de fenêtre modale. Mer 25 Fév 2015 - 9:57 | |
| Bonjour. Dans le code suivant, j'aimerais que la fenêtre n° 2 s'affiche en mode modal, et que le message ne s'affiche pas. Avez-vous une solution ? Merci de votre aide. Ce code étant un extrait très simplifié du code de mon programme général. - Code:
-
dim res%
dll_on "kgf.dll"
width 0,1600 height 0,900
afficher_f1() afficher_f2()
message ""
end
sub afficher_f1() form 1 ' res%=DLL_call2("WindowTopMost",handle(1),1) res%=dll_call1("BringWindowToForeground",handle(1))
width 1,500 height 1,500 left 1,500 top 1,300 end_sub
sub afficher_f2() form 2 ' res%=DLL_call2("WindowTopMost",handle(2),1) res%=dll_call1("BringWindowToForeground",handle(2))
width 2,100 height 2,100 left 2,600 top 2,400 end_sub | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème de fenêtre modale. Mer 25 Fév 2015 - 10:31 | |
| Voilà comment on fait les forms modales: - Code:
-
label form1, form2, close1, close2 dim res%
dll_on "kgf.dll"
width 0,1600 height 0,900
creer_f1() creer_f2()
button 11 : top 11,10 :left 11,10 : caption 11,"Form 1" : on_click 11,form1 button 12 : top 12,40 :left 12,10 : caption 12,"Form 2" : on_click 12,form2
end
form1: afficher_f1() return form2: afficher_f2() return close1: hide 1 active 0 : to_foreground 0 return
close2: hide 2 active 0 : to_foreground 0 return
sub afficher_f1() inactive 0 show 1 end_sub sub creer_f1() form 1 hide 1 : on_close 1,close1 ' res%=DLL_call2("WindowTopMost",handle(1),1) res%=dll_call1("BringWindowToForeground",handle(1))
width 1,500 height 1,500 left 1,500 top 1,300 end_sub
sub afficher_f2() inactive 0 show 1 end_sub sub creer_f2() form 2 hide 2 : on_close 2, close2 ' res%=DLL_call2("WindowTopMost",handle(2),1) res%=dll_call1("BringWindowToForeground",handle(2))
width 2,100 height 2,100 left 2,600 top 2,400 end_sub | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Problème d'affichage de Form. Mer 25 Fév 2015 - 10:41 | |
| Bonjour. Merci Klaus, mais la solution que tu me proposes est imparfaite. En effet, le message ne devrait pas apparaître dans mon cas. Le traitement des évènements après l'affichage de la 1ère form modale devrait être interrompu. - Code:
-
label form1, form2, close1, close2
dim res%
dll_on "kgf.dll"
width 0,1600 height 0,900
creer_f1() creer_f2()
' button 11 : top 11,10 :left 11,10 : caption 11,"Form 1" : on_click 11,form1 ' button 12 : top 12,40 :left 12,10 : caption 12,"Form 2" : on_click 12,form2
afficher_f1() message ""
end
form1: afficher_f1() return
form2: afficher_f2() return
close1: hide 1 active 0 : to_foreground 0 return
close2: hide 2 active 0 : to_foreground 0 return
sub afficher_f1() inactive 0 show 1 end_sub
sub creer_f1() form 1 hide 1 : on_close 1,close1 ' res%=DLL_call2("WindowTopMost",handle(1),1) res%=dll_call1("BringWindowToForeground",handle(1))
width 1,500 height 1,500 left 1,500 top 1,300 end_sub
sub afficher_f2() inactive 0 show 1 end_sub
sub creer_f2() form 2 hide 2 : on_close 2, close2 ' res%=DLL_call2("WindowTopMost",handle(2),1) res%=dll_call1("BringWindowToForeground",handle(2))
width 2,100 height 2,100 left 2,600 top 2,400 end_sub | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème de fenêtre modale. Mer 25 Fév 2015 - 11:37 | |
| Ca ne peut pas du tout marcher comme ça. Et ce n'est pas parce que tu essaies d'utiliser une fonction de la DLL que ça changera quelque chose au fonctionnement de Windows.
Le seul moyen d'interrompre une séquence linéaire de code, c'est d'ouvrir une fenêtre de dialogue. Et c'est en la quittant que l'exécution continue. Ce sont des fenêtres du genre MESSAGE_CONFIRMATION_YES_NO etc. Il y a aussi des fonctions ShowMessageModal... dans KGF.dll.
Il faut bien voir que toutes les commandes Panoramic (sauf justement celles ouvrant un dialogue, comme MESSAGE et ses clones, et FILE_NAME$) s'exécutent et passent à la suite. Donc, ce n'est pas la commande FORM ni la commande SHOW qui interrompra une suite linéaire de commandes.
Il faut concevoir son programme de sorte à avoir une séquence linéaire initiale qui prépare l'environnement Windows, les initialisations générales, etc. Puis, des actions ponctuelles, déclenchées par des évènements Windows qui sont les ON_CLICK, ON_CHANGE, ON_KEY_DOWN, ON_TIMER etc. A chaque évènement est associé une routine évènement qui est par essence une séquence de code linéaire, la plus limitée possible, et qui se termine par RETURN. Et si dans une telle séquence, il doit être interdit de cliquer ailleurs dans le programme, alors il faut appliquer la technique que j'ai montré dans mon code exemple ci-dessus, en désactivant la form 0 (et d'autres forms qui pourrraient être visibles !) et de la ou les réactiver en sortant du traitement censé être "modal". Tu auras beau essayer toutes les astuces possibles, tu ne pourras pas sortir de ce principe qui est la base du fonctionnement de Windows. Cela ne dépend pas de Panoramic. | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Problème de fenêtre modale. Mer 25 Fév 2015 - 13:18 | |
| Bonjour.
Merci Klaus pour toutes ces précisions.
Je continuerai donc à utiliser inactive 0, puis active 0 à la sortie. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 25 Fév 2015 - 14:45 | |
| @ Pedro,
Que doit faire ta form "modal" ? - agit elle sur ton programme pendant son affichage ? - Propose t' elle un choix qui modifie une voir plusieurs variables ? - affiche t elle un résultat ?
Avec un peu plus de précisions, on pourrait, peut être, t' apporter une solution... | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Problème de fenêtre modale. Mer 25 Fév 2015 - 16:27 | |
| Bonjour.
Ma form modale affiche des informations, possède les boutons OK et Annuler, puis attend la sélection d'un élément dans une combo.
Le traitement doit donc être interrompu à cet endroit. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re Mer 25 Fév 2015 - 16:39 | |
| Tu peux créer un petit programme, comme un "plug in" Tu lances par execute_wait , cela met le programme en attente. Ton bouton "ok" passes le résultat par les fonctions de KGF.dll de communication entre programmes, puis ferme la fenêtre. Le programme principal reprend la main et traite les données passées.... C' est peu académique mais cela peut rendre service... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème de fenêtre modale. Mer 25 Fév 2015 - 19:11 | |
| @Pedro: J'ai mis une nouvelle version en ligne qui apporte un petit truc pour résoudre ton problème. Dans le petit exemple qui suit, le bouton effectue 3 actions: 1. afficher le message "avant' 2. lancer une form en mode modal 3. afficher le message "après" Et le message "après" ne vient que lorsqu'on ferme la form. - Code:
-
' MakeFormModal.bas
label modal
dim res%
form 1 : hide 1 : caption 1,"Form devant être modale" memo 2 : parent 2,1
button 10 : top 10,10 : left 10,10 : caption 10,"Form modale" on_click 10,modal
dll_on "KGF.dll"
end
modal: message "avant" res% = dll_call3("SetFormProperties",object_internal(1),2,1) message "après" return | |
| | | Contenu sponsorisé
| Sujet: Re: Problème de fenêtre modale. | |
| |
| | | | Problème de fenêtre modale. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |