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 :

Comment fermer une fenêtre dynamique avec onclose


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut Comment fermer une fenêtre dynamique avec onclose
    Bonjour,
    J ai un probleme pour fermer ma fiche dynamique.
    Je cree une form avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            if FindComponent('form'+inttostr(compteuronglet))=nil then
                begin
                Form := TForm.create(nil);
                form.height:=162;
                form.width:=400;
                form.position:=podesktopcenter;
                form.visible:=true;
                form.name:='form'+inttostr(compteuronglet);
                form.show;
                form.onclose:=MaFormClose;
    puis un bouton BNon qui permet de fermer la fiche. Quand l utilisateur clique sur le bouton, ca va bien dans ma fonction BnonOnclick qui contient un
    form.close. Et la, ca bug pendant l'execution.

    Le code de mon onclose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TFDonneesMissions.MaFormClose(Sender: TObject; var Action: TCloseAction);
    VAR
        form:TForm;
    begin
    showmessage('dans maformclose');
    form:=TForm(Findcomponent('form'+inttostr(compteuronglet)));
    FreeAndNil(form);
    form.free;
    end;
    Et quand je clique sur le bouton, il ne va pas dans ma fonction MaFormClose, alors qu il y va quand je ferme ma form avec la croix.
    Apres 3 jours de recherches infrutueuses sur google, je m en remets a vous.
    Merci !
    Julie

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Tout simplement avec

    Action := caFree; dans lévénement onClose de ta fenêtre dynamique.

    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Salut,
    Merci pour la réponse.
    Je dois mal utiliser le cafree, car c'est ce que je fais, mais rien ne se passe.
    Mon code de creation de ma form contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form.onclose:=MaFormClose;
    puis, ma procedure ma formclose, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TFDonneesMissions.MaFormClose(Sender: TObject; var Action: TCloseAction);
    begin
    showmessage('maformclose');
    action := caFree;
    end;
    et pour appeler ma fonction maformclose, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    form:=TForm(Findcomponent('form'+inttostr(compteuronglet)));
    form.close;
    Et ca ne marche pas. J'ai une erreur a l'execution avec un access violation.
    Qu est ce qui cloche?
    Merci
    Julie

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Essaie cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TFDonneesMissions.MaFormClose(Sender: TObject; var Action: TCloseAction);
    begin
       action := caFree;
    end;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Salut,
    Je ne vois pas la difference avec mon code. C'est exctement pareil, a part qu il n y a pas le showmessage, non?
    Peut etre que le showmessage peut bloquer le processus...

    Mais, en mettant ton code, j ai tjrs mon access violation des qu il arrive au form.close. Je pense que le programme ne comprend pas que je souhaite relationner form.close et maformeclose, car il ne rentre pas dans ma procedure maformclose je pense.
    Julie

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Ok, ta fiche est créé quand tu instancies la classe "TFDonneesMissions"

    donc pour la créer il te suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with TFDonneesMissions.create(Serlf) do
    begin
      height := 162,
      width := 400;
      position := podesktocenter;
      name := 'form'+inttoStr(compteurOnglet);
      show; 
    end;
    Tu vas ensuite dans ton unité où est décrite ta classe "TFDonneesMissions"
    Dans l'inspecteur d'objet, tu cliques l'onglet événement et tu recherches l'événement onClose.
    Tu doubles cliques afin de créer l'événement, puis tu complètes avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TFDonneesMissions.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := caFree;
    end;
    Cela fonctionnera.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  7. #7
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form:=TForm(Findcomponent('form'+inttostr(compteuronglet)));
    Ça retourne nil sur mon poste. Il ne trouve pas de fiche form0.

    Est-ce que c'est du MDI que tu cherches à faire ?
    -Slimjoe

  8. #8
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    et pour appeler ma fonction maformclose, je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form:=TForm(Findcomponent('form'+inttostr(compteuronglet))); form.close;
    euh...

    Pourquoi au juste tu voudrais TOI MÊME appeller le FormClose ? Cet événement est soulevé quand la fiche se ferme donc tu n'as pas à l'appeller toi même...

    Est-ce que ce code sert à fermerla fenêtre via le code sans avoir à cliquer sur le X ?

    Quel est ton objectif ?
    -Slimjoe

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Salut,
    Merci pour toutes ses réponses.
    Ma form qui se crée sert a demander a l'utilisateur síl veut sauvegarder les changements.
    S'il clique sur non, je veux fermer ma fenetre en cours (FDonneesMissions) et ma fenetre qui demande s'il veut enregsitrer les donnees (mais dans ce cas, l'utilisateur n'a pas cliqué sur la croix).
    J arrive bien a fermer la fenetre FDonneesMissions, mais pas la Form0 (elle s'appelle comme ca, car j en crée plusieurs, la deuxieme, c est form1, ...).
    Quand je fais form0.close => bug d'execution.

    Que faire?
    Merci bcp!

  10. #10
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Et pourquoi as-tu besoin d'une fiche dynamique ? Est-ce que MessageDlg n'est pas spécifiquement conçu pour ça ?

    Aussi si tu fais Show() l'utilisateur pourra ignorer ta fiche et continuer à travailler. Si tu fais ShowModal(), tu pourras le forcer à répondre.

    J'ai vraiment de la difficulté à comprendre ce dont tu as besoin....
    -Slimjoe

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par slimjoe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form:=TForm(Findcomponent('form'+inttostr(compteuronglet)));
    Ça retourne nil sur mon poste. Il ne trouve pas de fiche form0.

    Est-ce que c'est du MDI que tu cherches à faire ?
    Salut,
    Non, pas vraiment, c'est juste une fenetre qui demande confirmation. Je la crée, j'attends que l utilisateur clique sur "Oui sauvegarder" ou "Non, pas sauvegarder", et en fonction, je sauvegarde ou pas, ferme cette fenetre de demande et ferme la fenetre contenant les modifications (a sauvegarder ou non ;o).
    Mais impossible de fermer cette fenetre de demande.
    Ca dois quand meme être faisable, car ca marche si je clique sur la croix, mais j ai besoin que mon utilisateur me dise s il veut sauvegarder ou pas!
    (Je vaux faire comme la fenetre de word, quand on quitte en n ayant pas sauvegardé).

  12. #12
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Quand je fais form0.close => bug d'execution.
    Si form0 est nil, c'est normal que tu frappes un bug d'exécution. Si form0 = nil, close() n'existe pas dont Access Violation.
    -Slimjoe

  13. #13
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par nopnop
    Je vaux faire comme la fenetre de word, quand on quitte en n ayant pas sauvegardé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if MessageDlg('Sauvegarder les informations?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      SauvegarderLesInfos();
    end;
    -Slimjoe

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Je ne comprends pas tres bien ce que tu veux dire.
    Le bug a l execution est normal si ma form est du type
    Form := TForm.create(nil);

    ou si je trouve nil quand je fais
    FindComponent('form'+inttostr(compteuronglet))
    => Quand je fais ca, je trouve bien ma form, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if form<>nil then form.close
    Et la bug. Moi, je veux juste trouver le moyen de faire disparaitre cette fenetre de l'ecran (mais visible:=false ne marche pas, form.close et form.hide non plus)

  15. #15
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Ce que Slimjoe tente de te dire c'est qu'il ne faut pas réinventer la roue.

    Il existe avec delphi une fonction qui s'appelle messageDLG qui te permettra de gérer cela en trois lignes comme te l'a gentiement spécifié dans son post précédent.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Ah ah !
    Il ne trouve pas la form (ou pas la bonne).
    Surement pour ca qu il n'arrive pas a la fermer ;o)
    Alors, nouvelle question : pourquoi un
    me renvoit nil alors que je crée la form form0 qq lignes avant?
    Merci

  17. #17
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Pascal Jankowski
    Ce que Slimjoe tente de te dire c'est qu'il ne faut pas réinventer la roue.

    Il existe avec delphi une fonction qui s'appelle messageDLG qui te permettra de gérer cela en trois lignes comme te l'a gentiement spécifié dans son post précédent.

    Ce truc la, j ai essayé, mais les boutons sont en anglais (Yes, no), et je dois imperativement le faire en Francais. La solution me convient, mais si quelqu un sait comment changer la langue des boutons ...
    Merci

  18. #18
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Essaie comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    messageDLG('test',mtWarning,[mbYes,mbNo],0)
    Quelle est ta version de Delphi ?
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    salut,
    c est bien cette fenetre, mais les boutons sont en anglais.
    j utilise delphi 7 pro

  20. #20
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    MessageBox alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Application.MessageBox('Enregistrer les changements ?', 'Enregistrement', MB_YESNO 
    + MB_ICONQUESTION + MB_DEFBUTTON3);
    Citation Envoyé par Delphi
    Displays a specified message to the user.

    Delphi syntax:

    function MessageBox(const Text, Caption: PChar; Flags: Longint = MB_OK): Integer;

    C++ syntax:

    int __fastcall MessageBox(const char * Text, const char * Caption, int Flags = MB_OK);

    Description

    Use MessageBox to display a generic dialog box a message and one or more buttons. Caption is the caption of the dialog box and is optional.

    MessageBox is an encapsulation of the Windows API MessageBox function. TApplication’s encapsulation of MessageBox automatically supplies the missing window handle parameter needed for the Windows API function.

    The value of the Text parameter is the message, which can be longer than 255 characters if necessary. Long messages are automatically wrapped in the message box.

    The value of the Caption parameter is the caption that appears in the title bar of the dialog box. Captions can be longer than 255 characters, but don't wrap. A long caption results in a wide message box.

    The Flags parameter specifies what buttons appear on the message box and the behavior (possible return values). The following table lists the possible values. These values can be combined to obtain the desired effect.

    Value Meaning

    MB_ABORTRETRYIGNORE The message box contains three push buttons: Abort, Retry, and Ignore.
    MB_OK The message box contains one push button: OK. This is the default.
    MB_OKCANCEL The message box contains two push buttons: OK and Cancel.
    MB_RETRYCANCEL The message box contains two push buttons: Retry and Cancel.
    MB_YESNO The message box contains two push buttons: Yes and No.
    MB_YESNOCANCEL The message box contains three push buttons: Yes, No, and Cancel.

    MessageBox returns 0 if there isn’t enough memory to create the message box. Otherwise it returns one of the following values:

    Value Numeric value Meaning

    IDOK 1 The user chose the OK button.
    IDCANCEL 2 The user chose the Cancel button.
    IDABORT 3 The user chose the Abort button.
    IDRETRY 4 The user chose the Retry button.
    IDIGNORE 5 The user chose the Ignore button.
    IDYES 6 The user chose the Yes button.
    IDNO 7 The user chose the No button.
    [edit] modifié par p jankowski afin d'éviter la déformation du forum [/edit]
    -Slimjoe

Discussions similaires

  1. comment fermer une fenêtre modale avec le code
    Par Sheriff dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 16/10/2006, 16h36
  2. Comment fermer une fenêtre externe à l'application ?
    Par Matt2094 dans le forum Delphi
    Réponses: 8
    Dernier message: 30/08/2006, 16h52
  3. Comment fermer une fenêtre enfant MDI ?
    Par DeveloMagaly dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2005, 13h10
  4. Comment fermer une Fenetre Modal avec Code ?
    Par Soulama dans le forum Langage
    Réponses: 19
    Dernier message: 13/07/2005, 11h17
  5. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09

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