JEU DE PAPILLON SYMPA

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 5 oct. 2008 à 20:44
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009 - 8 oct. 2008 à 14:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48122-jeu-de-papillon-sympa

offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
8 oct. 2008 à 14:19
MERCI YVESSIMON
BY OFFLAKE
yvessimon Messages postés 637 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 9 janvier 2017
8 oct. 2008 à 13:39
Bonjour,

Pas très écolo de faire disparaître les papillons.

Mais bon programme.

Salutations
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
7 oct. 2008 à 09:52
Je suis entrain de publié mes mini projet fait durant l'année 2008/2007

Pas sûr que ça soit une bonne idée OFFLAKE..

Attention à faire du tri de ce que tu proposes(voir si la même chose n'existe pas déjà..)
et ne pas perdre à l'esprit l'intérêt apporté pour l'ensemble de la communauté.

cantador
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
6 oct. 2008 à 23:31
LOL
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
6 oct. 2008 à 23:24
Je suis entrain de publié mes mini projet fait durant l'année 2008/2007
les derniers sont déjà fait!!
c tune chose bien non?
Pour Bacterius
OFFLAKE
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2008 à 23:09
MOI AUSSI, DES FOIS, LOL
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
6 oct. 2008 à 23:04
JE SUIS AUSSI UN DEVELOPEUR C/C++
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2008 à 22:32
Je trouve que le problème exposé par Cantador est représentatif. Close() simule le click sur le bouton de fermeture en haut à droite de la fenêtre. À mon avis il est préférable de le réserver aux commandes de l'utilisateur, du genre si on fait un bouton ou menu "quitter" sur la fiche principale, là il est logique de faire Close().

Mais quand on veut *vraiment* quitter l'application, Terminate est quand même recommandé. Et l'argument "oui, mais le OnClose n'est pas appelé" n'est pas recevable puisqu'il peut y avoir de toute façon des cas où OnClose n'est pas reçu, par exemple lorsque l'application reçoit un message WM_QUIT: même effet que Terminate dans ce cas, et pas de OnClose.

Ceci dit c'est vrai que dans le plupart des cas les 2 solutions vont quand même fonctionner...
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
6 oct. 2008 à 20:18
"il y a une procédure Close dans une fiche ; autant s'en servir !", si tu n'écris rien dans ton Close, autant s'en passer !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
6 oct. 2008 à 17:41
et quand on fait un Close de la fiche principale :

Close => OnClose => Application.Terminated := True => Application.Terminate

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
6 oct. 2008 à 17:40
Moi je ne sais pas il me semble que Application.Terminate est assez brutale comme terminaison d'un processus ... Et Close semble plus propre également.
Et puis : il y a une procédure Close dans une fiche ; autant s'en servir !
De toute façon Application.Terminate est appelé en interne lorsque Application.Terminated a la valeur True.

Cordialement, Bacterius !
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
6 oct. 2008 à 17:36
Jai lhabitude de travaille avec Application.Terminate et peu avec Close
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 oct. 2008 à 16:13
du moins avec close l'application s'arrête mais reste
néanmoins active..
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 oct. 2008 à 15:59
bonjour,
Application.Terminate ou Close ?
le débat fait rage sur CS..
et en fait, ce n'est pas évident.
Moi-même j'ai écrit un tout petit programme en marge d'une application afin de mettre en place une tache mensuelle.
tout marche, mais habitué aussi à mettre close pour fermer une appli, je me suis aperçu qu'en fait, si je voulais que mon appli exécutant une procédure sur le OnCreate (une fois terminée) se ferme automatiquement
alors le close ne fonctionne pas mais
en revanche Application.Terminate marche !

cantador
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2008 à 15:02
Un autre argument en faveur de Application.Terminate: ça peut être appelé depuis une autre fiche, sans avoir à mentionner explicitement la fiche principale (et devoir la mettre dans les uses).

Bien sûr je ne prétends pas qu'il y a unicité des façons de programmer, mais quand même je pense que c'est mieux d'utiliser Terminate. Ton argument du OnClose non appelé je le trouve dangereux, car typiquement OnClose ne doit servir qu'à poser la question à l'utilisateur de savoir s'il veut vraiment quitter (identique à OnCloseQuery) ou à définir un comportement spécifique différent de celui par défaut (par exemple détruire les fiches MDI au lieu de les minimiser). En aucun cas ça ne devrait servir à libérer des resources!
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2008 à 14:55
Salut Cirec,

C'est normal que OnClose ne soit jamais exécuté, vu qu'on ne "close" pas la fiche, on la détruit directement. Mais ça n'a rien à voir avec la libération des resources... A priori, la libération doit intervenir dans OnDestroy (qui lui est effectivement appelé après un Terminate). Mettre la libération des resources dans OnClose est dangereux, car OnClose peut être appelé plusieurs fois (si tu recycles ton code et que tu le mets sur une fiche secondaire, vu que Close est équivalent à Hide par défaut, si tu la montres de nouveau il peut se produire un nouveau Close et tu va libérer plusieurs fois la mémoire -> access violation).

En plus, OnDestroy parait plus logique d'un point de vue sémantique pour libérer des resources, puisque c'est le moment où les resources de la TForm sont effectivement libérées. Et puis il n'est pas nécessaire de libérer quoi que ce soit si les resources crées dynamiquement sont des composants avec la Form comme Owner, Delphi s'en charge.

Je persiste vraiment à dire que Application.Terminate est mieux pour quitter, car ça "colle" mieux au paradigme des boucles de messages.
Utilisateur anonyme
6 oct. 2008 à 14:45
@Forman:
je suis pas d'accord avec toi ... d'ailleurs un simple teste le prouve:

une Form 2 Button
dans l'évènement du premier bouton on utilise "Close" et dans le deuxième "Application.Terminate"

et dans l'évènement OnClose de la Form ajouter:
"ShowMessage('Adieu');" par Ex.

procedure TForm1.btn_CloseClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.btn_TerminateClick(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowMessage('Adieu');
end;

et lors du teste on remarque que si on passe par Application.Terminate l'évènement OnClose n'est pas exécuté.
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2008 à 13:17
Ah oui, juste pour clore le débat: finalement, il est préférable d'utiliser Application.Terminate plutôt que TForm.Close() car Application.Terminate économise des cycles de processeur, pour exactement le même effet (pas de test pour déterminer s'il s'agit de la fiche principale).

:-)
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
6 oct. 2008 à 13:14
Bacterius: tu écris
"[...] Application.Terminate est l'équivalent d'une fermeture forcée de Windows. Close n'est pas appelé, certains composants créés dynamiquements ne sont pas libérés [...]"

Là je ne suis pas d'accord (et de plus je ne comprends pas pourquoi cette idée est autant répandue). Par défaut, la méthode Close(); de TForm est équivalente à la méthode hide();. En effet, à moins de définir l'événement OnClose avec Action:=caFree (la valeur par défaut étant caHide, qui se contente de cacher la form) c'est donc Hide(); qui est appelée en fin de compte (pas Free ou Destroy).

Il se trouve que lorsqu'on fait Close() sur la fiche principale (c'est à dire si Self=Application.MainForm) la méthode définie dans Forms.pas appelle tout simplement Application.Terminate. La preuve, un copier-coller de Delphi 7 (Forms.pas, ligne 4608):

procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;

Ca parle de soi-même, non?

Il n'y a donc aucune différence entre MainForm.Close et Application.Terminate... Close ne détruit aucun objet, c'est le paradigme Delphi de hiérarchie des composants qui s'en charge. En effet, si l'Owner de toutes les forms est l'Application (c'est le cas par défaut quand on fait Application.CreateForm) c'est au moment où Application est détruite que tous ses sous-composants vont être eux-même détruits, en transmettant à leurs sous-composants, etc...
offlake Messages postés 190 Date d'inscription mercredi 3 septembre 2008 Statut Membre Dernière intervention 17 janvier 2009
5 oct. 2008 à 23:10
dans ce code j'ai suivi une stratégie pendant laquelle j'ai opté pour l'utilisation de bloc!!
Et je vais Améliore ce travaille!!
parce que je suis aussi un Développeur C/C++ !!
BY:OFFLAKE
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
5 oct. 2008 à 20:44
Pas mal Offlake, l'effet est réussi pour moi, même si il doit y avoir moyen d'améliorer la vitesse.
Bonne idée d'utiliser BitBlt, car c'est une manière très rapide de copier des blocs de couleur.

Il y a certaines choses qui me chiffonnent néanmoins :

"//stop and then start the game if it is running
//or just show help window"

Ces commentaires ne viennent pas de toi je présume ... mais tu as dû t'en inspirer pour résoudre un problème. Passons ...

"Application.Terminate"

Mauvaise idée ... toujours utiliser Close, parce que Application.Terminate est l'équivalent d'une fermeture forcée de Windows. Close n'est pas appelé, certains composants créés dynamiquements ne sont pas libérés, bref ...
Utilise plutôt Close.

Tu utilises un Buffer (ce qui est correct), mais en tant que composant TImage.
Pas bon ...
Utilise TBitmap :

Buffer := TBitmap.Create; // Création

Buffer.Free; // Libération

Tu verras ça tournera déjà mieux.

"Form1.Cursor:=crDefault;" dans le bouton Exit (avant Application.Terminate).
Inutile de remettre le curseur à default quand tu quittes l'application, l'utilisateur n'en a pour ainsi dire rien a faire. Et c'est 1 ou 2 millisecondes de perdues ...

"if Not Timer1.enabled then exit;
CurX:=x-10;
CurY:=y-10;
if y>= buffer.Height then Form1.Cursor:=crDefault
else Form1.Cursor:=crNone;"

Dans le OnMouseMove

C'est à cause de ces quelques lignes que le curseur a des difficultés à bouger.
Arrange tout ça :)

Cordialement, Bacterius !
Rejoignez-nous