Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Débutant
Débutant Pour bien débuter avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/11/2012, 13h03   #1
F@bien.fd
Nouveau Membre du Club
 
Homme
Enseignant
Inscription : octobre 2004
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : octobre 2004
Messages : 175
Points : 38
Points : 38
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...
F@bien.fd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 13h52   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 202
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 202
Points : 13 258
Points : 13 258
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 16h04   #3
F@bien.fd
Nouveau Membre du Club
 
Homme
Enseignant
Inscription : octobre 2004
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : octobre 2004
Messages : 175
Points : 38
Points : 38
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.
F@bien.fd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 23h37   #4
F@bien.fd
Nouveau Membre du Club
 
Homme
Enseignant
Inscription : octobre 2004
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : octobre 2004
Messages : 175
Points : 38
Points : 38
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;
F@bien.fd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 15h14   #5
F@bien.fd
Nouveau Membre du Club
 
Homme
Enseignant
Inscription : octobre 2004
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : octobre 2004
Messages : 175
Points : 38
Points : 38
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...
F@bien.fd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 20h29   #6
Montor
Membre émérite
 
Avatar de Montor
 
Homme
Inscription : avril 2008
Messages : 863
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations forums :
Inscription : avril 2008
Messages : 863
Points : 844
Points : 844
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;
Montor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 23h26   #7
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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.
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 23h27   #8
F@bien.fd
Nouveau Membre du Club
 
Homme
Enseignant
Inscription : octobre 2004
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : octobre 2004
Messages : 175
Points : 38
Points : 38
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:
F@bien.fd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 00h13   #9
F@bien.fd
Nouveau Membre du Club
 
Homme
Enseignant
Inscription : octobre 2004
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : octobre 2004
Messages : 175
Points : 38
Points : 38
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).

F@bien.fd est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h24.


 
 
 
 
Partenaires

Hébergement Web