Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : octobre 2004
    Messages : 201
    Points : 49
    Points
    49

    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 :
    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 Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 007
    Points : 12 794
    Points
    12 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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  3. #3
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : octobre 2004
    Messages : 201
    Points : 49
    Points
    49

    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 du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : octobre 2004
    Messages : 201
    Points : 49
    Points
    49

    Par défaut solution

    on ne peut plus simple... merci de ton coup de pouce

    Code :
    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 du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : octobre 2004
    Messages : 201
    Points : 49
    Points
    49

    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 émérite Avatar de Montor
    Homme Profil pro
    Inscrit en
    avril 2008
    Messages
    863
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : avril 2008
    Messages : 863
    Points : 801
    Points
    801

    Par défaut

    il suffit de les retirer du projet
    pour créer une nouvelle instance de fiche tu fais
    Code :
    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 émérite Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 920
    Points
    920

    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 :
    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 du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : octobre 2004
    Messages : 201
    Points : 49
    Points
    49

    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 :
    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 :
    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 du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : octobre 2004
    Messages : 201
    Points : 49
    Points
    49

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •