Gambas France BETA


Pas de compte ? Incription

Close

Ce sujet est résolu.

12
AuteurMessages
valaquarus#1 Posté le 23/5/2021 à 15:31:15
-- Unus Ex Altera --Bonjour à tous,
pour faire suite à mon dernier poste sur le trayIon, je veux reparler de la clôture des projets une fois lancés.
Quelles différences faites vous entre Me.Close et Form_Close?
Ce dernier est ouvert par l'IDE quand on a besoin de faire "des choses" (honorables) avant la fermeture du programme, celles-ci sont exécutées quand on clique sur la croix rouge (ou autre, à droite ou ailleurs) du formulaire principal. quand on créé un menu pour quitter dans ce même formulaire, du style :
1
2
3
4
PUBLIC SUB mnuQuitter_Click()
ME.Close
' Form_Close
END

si on utilise Me.close dans ce menu le même travail est fait par le programme et la clôture semble complète (la mémoire est libérée).
Par contre si on commente Me.close et décommente Form_Close
1
2
3
4
PUBLIC SUB mnuQuitter_Click()
' Me.Close
Form_Close
END
la fermeture se fait avec tout ce qu'on a ajouté dans le Form_Close mais n'est pas complète et la mémoire n'est pas de suite libérée.
Ma question est qu'est ce qui est fait par l'un qui n'est pas fait par l'autre?
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#2 Posté le 23/5/2021 à 16:56:08
Ne cedere ineluctabili possimusComme on le sait, ".Close ()" est une Méthode, tandis que "_Close ()" est un Événement.
Si je lance ce code:
1
2
3
PUBLIC SUB Button1_Click()
Form_Close
END

j'obtiens l'erreur suivante: Identificateur inconnu: Form_Close
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#3 Posté le 23/5/2021 à 17:08:11
-- Unus Ex Altera --Bonsoir Vuott,
merci pour ce rappel simple qui va me permettre d'avancer par comparaison entre les deux choses.
1
2
3
PUBLIC SUB Button1_Click()
Form_Close
END
ce code fonctionnera si j'ai déclaré la procédure grâce à l'IDE ou moi même
1
2
3
4
5
6
PUBLIC SUB Form_Close() 'fermeture de la fenêtre
Module1.ouverture()
ME.Visible = FALSE
SaveSettings()
Module1.quitAppli()
END
c'était la situation dont je parlais mais je vais chercher du côté méthode et évènement comparés.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#4 Posté le 23/5/2021 à 17:35:23
Ne cedere ineluctabili possimusBuonasera valaquarus,
dans les forums et dans la Mailing List officielle de Gambas, les programmeurs proposent parfois, ou soumettent à l'attention, la commande
Quit
à la place de "Me.Close ()".
Mais, comme cela a été répété à maintes reprises, dans le cas d'un programme graphique, il n'est pas conseillé d'utiliser la commande "Quitter": "Me.Close ()" est recommandé.
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#5 Posté le 23/5/2021 à 18:14:50
-- Unus Ex Altera --Buonasera Vuott,
je suis d'acord sur l'utilisation de Quit qui est soit brutal soit incomplète en termes de libération de la mémoire, dans le cas d'une application graphique. Ma question n'était pas ésotérique mais liée à l'observation sur ma machine uniquement, je le concède. Il est souvent des cas où la libération de la mémoire n'est pas immédiate voire pas faite du tout, il suffit de le contrôler avec un gestionnaire de process comme Ksysguard malgré la bonne utilisation de Me.Close.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#6 Posté le 23/5/2021 à 20:55:43
Ne cedere ineluctabili possimusBonsoir valaquarus,
je ne sais pas pourquoi ça t’arrive.
Il faut savoir quelles ressources, et en particulier quelles instances d’Objets, sont appelées et créées par votre programme.
Peut-être que certaines ressources devraient être détruites de manière appropriée et individuellement.
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#7 Posté le 24/5/2021 à 08:11:31
-- Unus Ex Altera --Bonjour Vuott,
oui c'est la "solution" même si ce n'en n'est pas une "normale" à mes yeux car je considère que le langage devrait être capable seul de libérer la mémoire quand la demande est faite ; s'il faut développer une routine pour contrôler que tout a été détruit avant que de fermer je ne saisi pas l'intérêt de Me.close.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#8 Posté le 24/5/2021 à 12:32:06
Ne cedere ineluctabili possimusEvidemment "Me.Close()" suppose que chaque ressource, qui doit être explicitement supprimée via le code, a été supprimée.
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#9 Posté le 24/5/2021 à 13:33:21
-- Unus Ex Altera --Merci Vuott,
et la question du siècle est :
comment récupérer les informations sur les ressources non libérées pour générer la fameuse routine en amont de la clôture?
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
valaquarus#10 Posté le 26/5/2021 à 21:52:41
-- Unus Ex Altera --Bonsoir,
il semble que les ressources les plus "sensibles" à supprimer par le code soient les tableaux et les collections qui ne sont pas "dégagés" par Me.Close(), en fait tout ce qui a été généré par un New donc instancié par le code. Mais cela ne m'explique pas la référence circulaire, c'est à dire le truc qui s'appelle lui même pendant la fermeture.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
valaquarus#11 Posté le 31/5/2021 à 21:09:22
-- Unus Ex Altera --Bonsoir à tous,
peut on m'indiquer comment vider les enfants d'un tabstrip avant de pouvoir le détruire?
j'ai fait ça :
1
2
3
WHILE TabStrip1.Children.Count
TabStrip1.Children.Clear
WEND
mais ça n'a pas l'air de fonctionner
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#12 Posté le 1/6/2021 à 11:42:00
Ne cedere ineluctabili possimusPeut-être que cette page peut vous aider:

Eliminare una scheda da una TabStrip
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#13 Posté le 1/6/2021 à 20:52:06
-- Unus Ex Altera --Bonsoir Vuott,
merci pour la page.
Voici ce que j'ai fait :
1
2
3
4
5
6
7
WHILE TabStrip1.Count
FOR EACH child IN TabStrip1[TabStrip1.Index].Children
Child.Delete
NEXT
PRINT TabStrip1.Count
TabStrip1[TabStrip1.Index].Delete
WEND

Et voici l'erreur que j'obtiens que je ne comprend pas :
1
Tabstrip cannot be empty
Pourquoi le tabstrip ne serait il pas vide puisque c'est exactement ce que je veux?
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
vuott#14 Posté le 1/6/2021 à 23:21:14
Ne cedere ineluctabili possimusIl n'est pas possible d'avoir un TabStrip sans onglets. En fait ce code:
1
TabStrip1.Count = 0 'TabStrip sans tabulation

donne une erreur.

Par conséquent, en gardant l'utilisation d'une boucle autre que "FOR", comme vous l'avez fait, le code peut être modifié comme suit:
1
2
3
4
5
6
7
8
9
DIM child AS OBJECT

DO
FOR EACH child IN TabStrip1[TabStrip1.Index].Children
child.Delete
NEXT
IF TabStrip1.Index == 0 THEN EXIT ' Il n'est pas possible de détruire le dernier onglet d'un TabStrip!
TabStrip1[TabStrip1.Index].Delete
LOOP
« Vita non suavis esse potest, nec Mors amara. »
valaquarus#15 Posté le 2/6/2021 à 15:20:53
-- Unus Ex Altera --Bonjour Vuott,
et merci, encore, je n'avais pas réfléchis à cette incongruité que d'avoir un tabstrip sans onglet.
Je me rapproche donc maintenant de la sortie, je veux dire par là, de la fin de mon nettoyage de fermeture.
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
12