Gambas France BETA


Pas de compte ? Incription

Sortir d'une Boucle

Ce sujet est résolu.

1
AuteurMessages
valaquarus#1 Posté le 21/7/2024 à 20:07:12
-- Unus Ex Altera --Bonsoir,
comment sort on d'une boucle avant fermeture d'un formulaire en modal?
Si je sors du formulaire par un break au moment de la fermeture j'ai une erreur "Objet invalide"
l'objet étant le dit formulaire.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#2 Posté le 22/7/2024 à 10:59:12
Ne cedere ineluctabili possimusPouvez-vous écrire ici deux codes très simples des deux formulaires qui génèrent cette erreur ?
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#3 Posté le 22/7/2024 à 12:25:31
-- Unus Ex Altera --Bonjour Vuott,
Voici ce qui appèle dans le formulaire principal :
1
2
3
4
5
6
7
PUBLIC SUB tbDiapo_Click()

ME.Hide()
FPictBox.ShowModal()
ME.Show()

END

Et ce qui fait planter quand on ferme le formulaire avant que la boucle ne soit terminée :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PUBLIC SUB tbDiaporama_Click()

DIM i AS INTEGER

FOR i = 0 TO $siPhotos
IF tbDiaporama.Value = TRUE THEN
PictureBox1.Picture = NULL
Picture.Flush()
WAIT
PictureBox1.Picture = Picture[$sPhotoPath &/ $sPhotoList[i]]
ME.Title = $sPhotoPath &/ $sPhotoList[i]
WAIT $iDuree
ELSE
PictureBox1.Picture = NULL
Picture.Flush()
WAIT
PictureBox1.Picture = Picture[$sPhotoPath &/ $sPhotoList[0]] '<-------- première photo
ME.Title = $sPhotoPath &/ $sPhotoList[0]
BREAK '<---------------------------------------------------- sortie de la boucle si arrêt diaporama
ENDIF
NEXT

END


Vous avez ça dans le formulaire FPictBox du projet https://gambas-fr.org/code-255-lecteurmultibase.html, il suffit pour le tester de rendre visible le Panel3.
Lancer un diaporama puis fermer avant la fin de la boucle pour voir l'erreur : "Objet invalide" comme si le formulaire avait été complètement détruit avant de pouvoir revenir au formulaire principal.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#4 Posté le 22/7/2024 à 13:58:11
Ne cedere ineluctabili possimusJ'ai dû adapter :evil: votre code.

Code du formulaire principal (id est: FMain):
1
2
3
4
5
6
7
8
PUBLIC SUB Button1_Click()

DIM f AS Form1

f = NEW Form1
f.ShowModal()

END


Code du formulaire secondaire (id est: Form1):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUBLIC SUB ToggleButton1_Click()

DIM i AS INTEGER
DIM $sPhotoPath AS STRING = "/chemin/d'accès/au/DOSSIER/contenant/les/fichiers/images"
DIM $sPhotoList AS String[] = Dir($sPhotoPath, "*.*", gb.File)

FOR i = 0 TO $sPhotoList.Max
IF ToggleButton1.Value THEN
PictureBox1.Picture = Picture[$sPhotoPath &/ $sPhotoList[i]]
ME.Title = $sPhotoPath &/ $sPhotoList[i]
WAIT 1
ELSE
PictureBox1.Picture = Picture[$sPhotoPath &/ $sPhotoList[0]] '<-------- première photo
ME.Title = $sPhotoPath &/ $sPhotoList[0]
BREAK ' ...ou encore comme ceci: i = $sPhotoList.Max
ENDIF
NEXT

END


...ce code fonctionne parfaitement pour moi.
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#5 Posté le 22/7/2024 à 14:50:27
-- Unus Ex Altera --J'ai modifié ceci :
1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB tbDiapo_Click()

DIM f AS FPictBox

ME.Hide()
' FPictBox.ShowModal()
f = NEW FPictBox
f.ShowModal()
ME.Show()

END

ça ne mange pas de pain
Pour le reste ça plante dès qu'on veut sortir si la boucle n'est pas finie.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
valaquarus#6 Posté le 22/7/2024 à 15:22:37
-- Unus Ex Altera --J'ai corrigé ainsi :
1
2
3
4
5
6
7
PUBLIC SUB Form_Close()

tbDiaporama.Value = FALSE
WAIT $iDuree
Settings.Write(ME)

END

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUBLIC SUB tbDiaporama_Click()

DIM i AS INTEGER

FOR i = 0 TO $sPhotoList.Max '$siPhotos
IF tbDiaporama.Value THEN
PictureBox1.Picture = NULL
Picture.Flush()
WAIT
PictureBox1.Picture = Picture[$sPhotoPath &/ $sPhotoList[i]]
ME.Title = $sPhotoPath &/ $sPhotoList[i]
WAIT $iDuree
ELSE
BREAK '<---------------------------------------------------- sortie de la boucle si arrêt diaporama
' i = $sPhotoList.Max
ENDIF
NEXT

END

Et cela fonctionne, si on réduit le delay de wait à la sortie ça plante.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
linuxos#7 Posté le 23/7/2024 à 17:13:24
Un peu de sel, de poivre et la crevette sera... valaquarus,

Pourquoi ne pas mettre une boucle d'attente dans le Form_Close(), a la place du WAIT pour attendre que l'objet 'FPictBox' soit bien détruit ?

1
2
3
4
5
6
7
8
9
10
PUBLIC SUB Form_Close()

tbDiaporama.Value = FALSE
Settings.Write(ME)

WHILE Object.IsValid(f)
WAIT 0.25
WEND

END


Quelque chose comme ceci.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
valaquarus#8 Posté le 24/7/2024 à 11:52:25
-- Unus Ex Altera --Bonjour Olivier,
je trouvais ton idée très belle mais après essaiss elle ne fonctionne pas,la sortie ne se fait pas.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
1