2010-07-06 6 views
1

Je continue à courir dans ce problème étrange. Il semble presque être aléatoire, mais je cours mon application et ouvre un formulaire, travailler avec et le fermer. La prochaine fois que je vais ouvrir un autre isntance de cette forme, je reçois un message d'erreur sur le formulaire déjà existant. C'est très étrange et je n'ai pas été capable de reproduire constamment l'erreur."formulaire existe déjà" après la fermeture du formulaire et l'ouverture d'une autre instance. Delphi

Si ça aide, j'utilise Delphi 6 encore. Y at-il une raison connue pour laquelle cela se produit ou ce que je peux faire pour l'empêcher?

+1

Vous devez fournir plusieurs étapes ou le code source pour les gens pour vous aider. –

Répondre

4

Etes-vous sûr que le formulaire n'est pas masqué lorsqu'il est fermé? Ceci est la valeur par défaut pour les formulaires MDI, mais j'ai vu d'autres personnes faire la même chose (pour accélérer la ré-affichage du formulaire).

Modifier (merci Cosmin Prund pour le commentaire!):

Accrochez l'événement OnClose de votre formulaire, et regardez ce que la valeur du paramètre est CloseAction. Si c'est caHide, le formulaire est masqué.

Un hack temporaire pourrait être d'attribuer caFree au CloseAction, mais une meilleure solution est de regarder la pile dans votre gestionnaire d'événements OnClose pour voir comment vous avez fini là-bas, et ce qui est à l'origine du CloseAction être caHide dans le premier endroit.

Remarque: dans ces situations, vous voulez souvent voir ce que fait la VCL. Il est donc sage d'activer le debug DCUs pour votre projet; Voir ce blog article comment faire cela (recherche debug DCUs dans le lien).

--jeroen

+1

+1. Test sur Delphi 2010, caHide semble être l'action OnClose par défaut pour les formulaires normaux. –

+0

+1 vient d'apparaître pour donner la même réponse que vous avez donnée (vous étiez beaucoup plus éloquent que j'aurais été!) –

0

Vous n'avez pas fourni le code, mais il semble que vous donniez aux deux instances de formulaire le même nom de composant et que le propriétaire des deux formulaires soit le même (probablement l'objet Application).

Vous ne pouvez pas avoir des composants portant le même nom appartenant à un autre composant. Vous devez soit donner des noms différents à chaque instance de formulaire, soit ne donner aucune valeur à la propriété Name, et laisser RTL choisir un nom de composant unique pour vos instances nouvellement créées.

Si ce n'est pas votre cas, veuillez indiquer le code par lequel vous créez vos instances de formulaire, afin que nous puissions vérifier ce qui ne va pas dans le formulaire.

0
function ShowOnce(AFormClass:TFormClass;AShowing:Boolean=True):TForm; 
var 
    i : integer; 
begin 
    Result := nil; 

    for i := 0 to Screen.FormCount -1 do 
    if Screen.Forms[i] is AFormClass then Result := Screen.Forms[i] as TForm; 


    if not assigned(Result) then 
    Result := AFormClass.Create(Application.MainForm); // Application or a parameter 
    if Showing then 
     Result.Show; 
end; 

échantillon 1:

ShowOnce(TForm3); 

échantillon 2:

Form3:=ShowOnce(TForm3,False) as TForm3; 
Form3.SomeProperty:=32; 
Form3.Show; 
Questions connexes