Le titre n'est peut etre pas tres clair mais je vais essayer d'expliquer le plus clairement possible.
Je travaille avec un application MDI
pour eviter que certaines fenetres s'ouvrent en plusieur exemplaire, j'ai la fonction suivante qui me sert de verification :
la creation de mes fenetres MDIChild ce fait de cette maniere :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function TfrmMain.isFormImplement(aForm: TForm): Boolean; var i : integer; begin result := false; for i := 0 to self.MDIChildCount-1 do if self.MDIChildren[i] = aForm then begin if Aform <> self.MDIChildren[i] then continue; result := true; exit; end; result := false; end;
mon erreur est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TfrmMain.ActionMDIChildExecute(Sender: TObject); begin if isFormImplement(FrmMDIChild) then FrmMDIChild.Show else begin FrmMDIChild:= TFrmMDIChild.Create(Application); end; end; FrmMDIChild.Show;
je me suis apercu que lors d'une succession d'ouverture/fermeture de fenetre. l'une de mes fenetres "s'ouvrait" dans une autre.
si j'ouvre une fenetre X puis que je la ferme puis que j'ouvre une fenetre Y, je n'ai pas d'erreur.
Apres plusieurs fois que j'ouvre une fenetre X, puis que j'ouvre fenetre Y sans avoir fermer ma fenetre. La deuxieme fenetre ne s'ouvre plus, car lors du test isFormImplement frmFenetreX contient les données de fenetreY.
L'erreur se fait a coup sur lors de l'execution suivante.
Ouverture fenetreA
Ouverture fenetreB
-> Fermeture fenetreB Fermeture fenetreA
Ouverture fenetreB
Ouverture fenetreA
-> Fermeture fenetreA Fermeture fenetreB
Ouverture fenetre A
Tentative d'ouverture fenetre B <- echec lors du test (renvoie false)
d'ailleur le show de la fenetreB (suite a l'echec de isFormImpement) se fait sur la fenetreA.
J'ai supprimer toute l'execution du reste de mon code et l'erreur persiste, je me perds dans la destruction pour savoir ou l'échange se fait. En plein désepoir de cause, je viens voir si une âme charitable pourrais me filer un coup de main ou aurait deja eu ce probleme.
Merci d'avance de votre aide.
Partager