IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

fermeture modules fois x


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut fermeture modules fois x
    Bonjour,

    j'ai une application qui peut créer de multiples fiches sous forme de boites de message de même class mais pas de même caption.

    Jusqu'à présent la fermeture de l'application entrainait la fermeture de toutes les fiches (elles ne sont pas MDIChild).

    Je souhaiterais dorénavant les fermer en cours d'utilisation et je ne trouve pas le moyen même avec Fincomponent.
    j'ai bien tenté d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          LeHandle := 1;
              While LeHandle <> 0 do
                begin
                   LeHandle := FindWindow('TClass ', 'Name');
                   GetWindowThreadProcessId(LeHandle, @dwProcessId);
                   If dwProcessId <> 0 then
                     begin
                       HandleProcess := OpenProcess(PROCESS_TERMINATE, False, dwProcessId);
                      TerminateProcess(HandleProcess,0);
                     end;
                 end;
    mais ça me ferme mon application...

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    FindWindow n'est pas utile à l'intérieur d'une application
    TerminateProcess va fermer ton programme, c'est plutôt un SendMessage(WM_CLOSE) pour fermer une fenêtre

    tu peux utilise MDIChildren[] et MDIChildCount
    Tu as aussi Application.Components[] et Component, ça dépend le paramètre Owner passé au Create de tes Fenêtres
    Tu as aussi Screen.Forms[] et FormCount
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Salut et merci de ta réponse,

    Effectivement TerminateProcess ferme le programme, alors j'ai essayé
    SendMessage(LeHandle,WM_CLOSE,0,0), mais ça veut rien savoir...

    Pour MDIChildren[] et MDIChildCount, c'est exclus en effet la MainForm crée une multitude de MDIChildren de différentes class en fonction des sollicitations. L'une de ces class dont les résultats m'intéressent appelle une unité sans Form par une détection sur une grille des résultats du clic gauche de la souris et des touches schift et alt associées. Cette unité elle-même envoie un signal à la fiche MainForm qui décide de la création de toutes ces boîtes de message.

    Je vais creuser, merci de la piste.

  4. #4
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut solution
    on ne peut plus simple... merci de ton coup de pouce

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure TMain.Button2Click(Sender: TObject);
    var
      I, J: Integer ;
    begin
      J:= 0;
     
      J := Screen.FormCount;
      memo2.Lines.Add('Il y a '+inttostr(j)+ ' fiches.');
     
      for I := 0 to Screen.FormCount-1 do
        begin
          memo2.Lines.Add(Screen.Forms[I].Name);  // indique le nom.
     
       // Confirme ou non que celles qui me concernent ont "Name" à "Synthese_PV_MV".
          If Pos('Synthese_PV_MV', (Screen.Forms[I].Name)) = 1
            then memo2.Lines.Add('OUI')
            else memo2.Lines.Add('non');
     
       // Ne pas oublier de tester le début de "name".
       // En effet au fur et à mesure qu'elles sont créées, elles sont indicées.
       // De plus les fiches peuvent être dans le désordre.
          If ((Screen.Forms[I].Name) = ('Synthese_PV_MV'))
            then memo2.Lines.Add('Il y a en numéro '+ inttostr(i)); // on peut indiquer leur numéro.
     
       // Ensuite on peut fermer celles qui me concernent.
          If Pos('Synthese_PV_MV', (Screen.Forms[I].Name))=1
            then Screen.Forms[I].Close;
        end;
    end;

  5. #5
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Je viens de m'apercevoir que si l'on teste à nouveau la liste des fenêtres après la fermeture des n fiches identiques, les noms des fiches closed subsistent et le nombre de fiches reste celui d'avant fermeture. ::
    Donc si l'on en a fermé 4 sur 9 il reste toujours... 9 nanes en mémoire...
    et si on en ouvre une supplémentaire on se retrouve avec 10 fiches dont seulement 6 sont bien réelles.
    Comment faire la mise à jour ?

    Encore mieux si je ferme les dites fiches individuellement par l'évènement Onclose... elles demeurent dans la liste

    Si j'utilise Free au lieu de Close, je lève évidemment une classe d’exception sauf pour la dernière bien sûr...

  6. #6
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    il suffit de les retirer du projet
    pour créer une nouvelle instance de fiche tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with TmyForm.Create(nil) do
    try
     
        {initialiser les champ de la fiche}
        if Showmodal = mfOk then //afficher la fiche
        begin
     
     
        end;
    finally
         Free
    end;

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par F@bien.fd Voir le message
    Je viens de m'apercevoir que si l'on teste à nouveau la liste des fenêtres après la fermeture des n fiches identiques, les noms des fiches closed subsistent et le nombre de fiches reste celui d'avant fermeture. ::
    tu utilise Screen.Forms[I].Close; ceci ne détruit pas la fenêtre mais la rend juste invisible.

    Utilise plutôt screen.Forms[i].Release;
    De plus il faudrait savoir comment tu les crées ??

    comme le dit shail tu peux utiliser ceci aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      for i := Application.ComponentCount-1 Downto 0 do
      begin
        if Application.Components[i] is TForm then
        begin
          if Application.Components[i].Tag > 0 then (Application.Components[i] As Tform).release;
        end;
      end;
    tu pourrais donc utiliser un tag spécifique pour faire tel ou tel action.

  8. #8
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Montor Voir le message
    il suffit de les retirer du projet
    pour créer une nouvelle instance de fiche tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with TmyForm.Create(nil) do
    try
        {initialiser les champ de la fiche}
        if Showmodal = mfOk then //afficher la fiche
        begin
     
        end;
    finally
         Free
    end;
    non non non, elles ne sont pas showmodal.
    la FormStyle est fsStayOnTop...
    elles ne doivent pas bloquer l'application...

    Je suis un âne...
    j'avais oublié de compléter l'évènement OnClose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TSynthese_PV_MV.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
    Cette fois tous les éléments qui sont dépendants (menus et autres) de la présence d'une de ces fiches au moins sont mis en forme.
    Que ces fiches soient fermées manuellement ou par commande...
    Screen.FormCount est correctement mis à jour et la liste des fiches ouvertes est tout à fait exacte.

    : mouarf:

  9. #9
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2004
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Merci à vous deux,

    Mais j'utilise le Tag pour autre chose.
    Screen.Forms[I].Release; ne me va pas non plus, en effet si j'ai des fiches qui trainent sur le bureau, quand je ferme l'application, leur mémoire est libérée trop tard. C'est franchement inesthétique.

    Donc dans mon module de fermeture, je passe d'abord par Screen.Forms[I].Hide;, puis, plus tard j'appelle l'élément du menu qui me les ferme toutes en libérant l'espace (peu importe quand).


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/08/2011, 15h55
  2. les fonctions du module win32::odbc marchent une fois/100
    Par sbtrinity dans le forum Modules
    Réponses: 0
    Dernier message: 28/11/2008, 18h42
  3. Fermeture d'un formulaire : Ne fonctionne qu'une fois sur deux
    Par hellmaster78 dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/04/2008, 12h35
  4. Page chargée deux fois a la place d'une (fermeture popup)
    Par JoloKossovar dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 15/01/2008, 18h00
  5. La fonction à la fermeture d'un fichier est exécutée 2 fois...
    Par Pierre Fauconnier dans le forum Access
    Réponses: 4
    Dernier message: 27/04/2006, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo