IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Fermeture d'une fenêtre appelante


Sujet :

Delphi

  1. #1
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 286
    Points : 288
    Points
    288
    Par défaut Fermeture d'une fenêtre appelante
    Bonsoir,

    J'ai créé ce post mais j'ai résolu le problème sur un exemple simple mais pas dans mon application.
    Voici donc le problème et le bout de code qui semble fonctionner en théorie

    1. Est-il possible qu'une FORM_1 apelle une FORM_2 et que cette dernière demande ensuite la fermeture de FORM_1 tandis que FORM_2 est toujours active ?

    FORM_1 est la fiche appelante
    FORM_2 est la fiche appelée.
    Remarque: il ne faut pas que la Form appelante soit la FORM 1 car sinon, c'est toute l'application qui se termine.

    Je voudrais que la fiche Appelée se lance lorsque FORM_1 le demande et se ferme une fois que FORM_2 est lancée.

    2. Si cela est viable, dans qu'elle événement de la Fiche appelée dois-je mettre la demande de fermeture de la FORM_1?
    Dans mon exemple, je l'ai mis dans activate, je ne sais pas si c'est bien ici qu'il, faut la mettre.

    Voici la capture d'écran et le code qui va avec:
    Nom : Capture écran.jpg
Affichages : 571
Taille : 60,2 Ko
    En arrière plan (Fond Bleu nuit de la Fiche principale)

    Et le code qui va avec de la Fiche appelante sur Fond jaune:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
     var H : THandle;
    begin
      H := FindWindow(nil,'FICHE APPELEE 2');
      if H = 0
        then Application.CreateForm(TForm2,Form2)
        else showmessage('La fiche existe déjà!');
    end;
    et de la fiche appelée (fond bleu clair):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TForm2.FormCreate(Sender: TObject);
     var H : THandle;
    begin
      H := FindWindow(nil,'FICHE APPELANTE 1');
      if H = 0 then
      begin
        Left := Screen.Width div 2 - Width div 2;
        Top  := Screen.Height div 2 - Height div 2;
      end else
      begin
        Left   := Form1.Left + Form1.ClientWidth div 2 - Width div 2;
        Top    := Form1.Top  + 130;
      end;
    end;
     
    procedure TForm2.FormActivate(Sender: TObject);
     var H : THandle;
    begin
      H := FindWindow(nil,'FICHE APPELANTE 1');
      if H <> 0 then
      begin
        if Form1.CheckBox1.Checked then Form1.Close;
      end;
    end;
    3. Quand je transpose ce code dans mon Application, J'ai une erreur OverStackFlow dans l'activate de la Fiche appellée! Là, je sèche...

    Je suis preneur de vos remarques!

    Bonne soirée
    jlmat
    Images attachées Images attachées  
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    la fiche principale d'une application Delphi est particulière, si elle se ferme c'est tout l'application qui se ferme.

    tu ne peux donc pas fermer la fiche principale.

    dans un projet qui veux imiter le fonctionnement des fenêtre de Chrome je me suis amusé à créer une fiche principale vide qui contient un TFrame, si une fiche secondaire veux fermer la fiche principale, c'est la fiche secondaire qui est détruite et la fiche principale reprend sa place avec son TFrame

    en gros j'ai Form1 + TFrame1 et Form2 + TFrame2 et quand Form2 veux fermer Form1, je détruis Frame1, je positionne Form1 au même endroit que Form2, je change le parent de TFrame2 pour le mettre dans Form1 et finalement c'est Form2 que je détruit...c'est un peu sioux mais ça marche
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 286
    Points : 288
    Points
    288
    Par défaut
    Merci Paul pour ta réponse qui a été influencée en partie je pense par une erreur dans mon énoncé

    Remarque: il ne faut pas que la Form appelante soit la FORM 1 car sinon, c'est toute l'application qui se termine.
    C'est ce que j'ai fait dans l'exemple que j'ai donné et ça marche. La Fiche principale n'est pas FORM_1, elle s'appelle MainForm et appelle en réalité FORM_1.

    Il faut donc d'après ce que tu dis que ma Form_1 et Form_2 soient des conteneurs de Form_1 et Form_2. Je n'ai jamais utilisé les TFrame. Je trouve que ça complique... Je vais étudier le TFrame pour voir l'avantage...

    mer(ci
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    une autre technique envisageable est le docking de forme qui, en gros, fait la même chose que la technique "frames"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Si la fiche à fermer ne peut être recréée après sa fermeture, autant mettre le code la fermant dans le Create de la fiche appelée, plutôt que dans un événement appelé à chacune de ses activations.

    Ensuite, le code cherche la fiche par son nom, et s'il le trouve, exploite la variable Form1. C'est un peu un mélange des genres !

    On pourrait imaginer une fiche appelée au Create surchargé pour accepter un paramètre supplémentaire qui serait la référence de la fiche appelante, et des fonctions CallBack dans les 2 fiches : l'une qui supprimerait cette référence dans la fiche appelée lors de la libération de la fiche appelante, et l'autre qui interrogerait la fiche appelante pour savoir si elle doit la libérer et connaître ses positions.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    On pourrait imaginer une fiche appelée au Create surchargé pour accepter un paramètre supplémentaire qui serait la référence de la fiche appelante, et des fonctions CallBack dans les 2 fiches
    Peut-être que je me trompe, mais ce genre de techniques peut être difficile à maintenir
    Parce que l'avantage d'une "fiche", c'est d'être réutilisable. Et lorsque le diagramme appelé/ appelant devient un plat de spaghettis rien qu'avec un petit nombre de "fiches" (5 - 6), il faut réfléchir autrement.

    J'avais vu aussi une autre technique : surcharger l'événement OnCloseQuery (<- lien docs.embarcadero en anglais)
    En gros, avant de fermer une fiche, tu décides si tu la fermes ou pas ... et ainsi mettre le code de @Paul TOTH. Mais attention, si l'événement prend trop de temps, l'utilisateur va croire que la "fiche" ne ferme pas/ plante.

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    en fait je ne comprend pas bien ton problème, j'ai donc créé un projet avec 3 fiches dont seule Form1 est crée automatiquement (c'est la fiche principale)

    sur Form1 j'ai mis un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uses
      Unit2;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2 := Tform2.Create(Application);
      Form2.Show;
    end;
    sur Form2 j'ai mis aussi un bouton avec une première solution immédiate, je ferme Form2 après avoir créé Form3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    uses
      Unit3;
     
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      Form3 := TForm3.Create(Application);
      Form3.Show;
      Release; // première solution
    end;
    on notera que j'utilise Release car nous sommes dans une méthode de Form2, et la libérer directement pourrait lui couper l'herbe sous les pieds

    sinon j'ai repris ton code OnActivate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    uses Unit2;
     
    procedure TForm3.FormActivate(Sender: TObject);
    begin
      FreeAndNil(Form2); // deuxième solution
    end;
    attention, il ne faut pas faire le deux en même temps sinon on tente de détruire une fiche déjà libérée, délivrée, qui ne mentira plus jamais...oups je m'égare

    quand une fiche ne possèdent qu'une seule instance (sinon la variable globale Form2 n'est pas utilisable) j'aime bien ajouter ceci comme garde fou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm2.FormDestroy(Sender: TObject);
    begin
      Form2 := nil;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 286
    Points : 288
    Points
    288
    Par défaut
    Merci Paul pour tes explications très claires. ça fonctionne!
    Désolé pour le retard de ma réponse. Avec ce confinement, je prends un peu de temps à nouveau pour continuer la programmation de mon projet...
    Du coup, je développe un petit exemple que je mettrai en post dans cette discussion avec différentes options d'ouvertures et fermetures de fiches
    Je programme en Lazarus 3.2.2 sous windows 10 pro

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/02/2009, 15h03
  2. Exécuter une action à la fermeture d'une fenêtre
    Par wwave dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 28/07/2005, 15h15
  3. Fermeture d'une fenêtre .dos
    Par VirginieGE dans le forum Windows
    Réponses: 2
    Dernier message: 03/06/2005, 13h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo