Comment tester si une fenêtre existe?

Résolu
jlmcom
Messages postés
57
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
3 décembre 2004
- 1 déc. 2004 à 09:57
cs_grandvizir
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
- 3 déc. 2004 à 18:53
Bonjour,

Je ne sais plus comment on fait enchaîner des fenêtres différentes mais qui ne doivent se voir que lorsque les opérations sur la fenêtre précédente sont terminées, donc en principe à sa fermeture...

Je pense que cela revient à tester l'existence d'un handle de fenêtre.

Qu'elqu'un peut-il me rappeler un boiut de code permettant de gérer cela?

remarque : Les opérations de création des fenêtres se font depuis la méthode activate de la fenêtre principale.

procedure mainform.Onactivate
begin
Si test_OK => création forme fenêtre 1
puis création forme fenêtre 2
end;

Merci d'avance!

jlmcom :)

6 réponses

ni69
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
1 déc. 2004 à 12:12
Tu peux effectivement tester par le Handle...

Si la fenêtre existe, son handle sera différent de 0, donc :
procedure TestFenetreExiste;
var
H : THandle;
begin
H := FindWindow(nil,'Nom de la fenêtre');
if H = 0 then ShowMessage('Existe pas')
else ShowMessage('Existe');
end;


@+
Bonne Prog'
Nico

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! :)
3
cs_grandvizir
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
22
1 déc. 2004 à 17:53
Dote-toi de Spy++... c'est très utile. Ou de WinSpector, mais chez moi, il rame terriblement.

Je suis pas sûr. Essayons ça, tu me diras:
if LaTFormATester=nil then ShowMessage('Non active')
else ShowMessage('En mémoire');

Pour créer les fenêtres, ouvre le fichier DPR.

===========
Validez les réponses si ok...

ViewVite : HTML - ZIP
0
merci ni69

Après test rapide de ta solution, quelque chose m'échappe. en effet, si je teste H en pas à pas, la valeur est nulle alors que la fenêtre est créee.
Par contre, lorsque sur l'instruction suivante (création de la deuxième fenêtre) je teste H, elle n'est plus nulle, alors que je souhaiterai qu'elle soit nulle pour la création de la deuxième fenêtre.

H := FindWindow(nil,'Nom fiche 1');
If H = 0 then Création fiche 1 else MemH :=True;
H := FindWindow(nil,'Nom fiche 2');
If MemH and H = 0 then Création fiche 2

J'inclut cela dans une boucle repeat until fin traitement, qui teste la fin des opérations sur les fiches. peut-être faut-il que je déclare des variables booléennes globales qui seront mises à 1 lors de la fermeture de chaque fenêtre! car MemH=true alors que le traitement de la fiche n'est pas commencé.

Qu'en pensez-vous? Qu'elles sont les règles de l'art en la matière, je n'avais jamais à gérer ce problème...

Delphi, delphi quand je te tiens! Merci d'avance, si vous avez une solution.

jlmcom :)
0
jlmcom
Messages postés
57
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
3 décembre 2004
2
2 déc. 2004 à 15:15
Bonjour grandVisir

Excuse moi, il y a des bizareries dans ma cambrousse en ce moment et ton message n'apparazissait pas à l'écran.

Je viens d'en prendre connaissance.

1. Bon, pour Winspector et spy++, je ne sais pas ce que c'est. Peux-tu m'en dire plus! Il me semble que winspetor permet de suivre à la trace tout ce que gère windows à la trace, c'est cela?
Où le trouve t-on?

2. Oui, l'instruction fonctionne, mais il semble que j'ai un autre problème, car la fiche est déjà créée avant même que j'en donne l'ordre. Pourtant, elle n'est pas en autocrée dans le projet.

Il faut donc que je réétudie la procédure de création de la fiche principale qui est assez complexe. Il y a peut-être un ordre de création qui trazine dans une procédure.


Merci pour vos lumières! Dès que j'ai une idée qui marche je vous en fait part.

jlmcom :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlmcom
Messages postés
57
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
3 décembre 2004
2
3 déc. 2004 à 12:28
Bonjour,

Voici la solution que j'ai retenu pour l'instant. Je ne la trouve pas satisfaisante, j'aurai préférer me passer de Flag à gérer, mais c'est ce que j'ai trouvé. Si vous avez mieux n'hésitez pas !

Deux booléens de vérification des opérations ayant eu lieu sur les fiches sont mis à false dans Create de la Fiche principale et mis à true dans la fermeture des fiches en question..

If not Traitefiche1 and (Tform1<>nil) 
then (Tform1.Create(Application).show 
else if not Traitefiche2 and (Tform2<>nil) then (Tform2.Create(Application).show 


jlmcom :)
0
cs_grandvizir
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
22
3 déc. 2004 à 18:53
Si tu n'as pas vraiment la réponse, décoche Ni69. Ca remettra en blanc la question. Une question verte non résolue n'a pas d'avenir.

Je fais comme si tu n'avais pas posté le message précédent:
==============

J'ai eu Spy++ avec le pack VisualC++ 6 IE. WinSpector se trouve sur le site .com du même nom. Ca permet de trouver les handles et les classes, de suivre des messages, trouver des styles, d'avoir une idée sur le langage qui a programmé l'application que l'on scrute... etc. Mon choix est Spy++, mais il y aura tjs des avis contraires. De toute façon, les deux sont très utiles et suffisants.

Sinon, essaye encore un truc. Si ça marche pas, essaye avec 0, mais ça m'étonnerait.

[code]if LaTFormeATester.Handle=-1 then PasCréée else Créée;[code]
Essaye de nous donner le code entier de ton prog, épurés des codes inutiles sans se tromper. Car c'est vraiment étrange. Une fenêtre ne se crée pas par miracle.

Un .Hide ne détruit pas une fenêtre. Tjs bon à préciser :)

===========
Validez les réponses si ok...

ViewVite : HTML - ZIP
0