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

Langage Delphi Discussion :

récupération des infos d'une fenetre modale


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 39
    Points : 20
    Points
    20
    Par défaut récupération des infos d'une fenetre modale
    bonjour

    j'ai une question bizarre à propos de l'utilisation de ShowModal, mais c'est tellement énorme que je vous la pose !

    on a un developpeur delphi chez nous qui prétend que faire ce qui suit "est une grave erreur de programation"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
       ModalWindow : TMyModalForm;
       ValeurRetour : String;
    begin
       ModalWindow := TMyModalForm.Create();
       if ModalWindow.showModal = mrOK then 
          ValeurRetour := ModalWindow.MyTextEdit.Text;
       ModalWindow.Release;
       ShowMessage(ValeurRetour);
    end;
    (avec dans TMyModalForm, un TButton avec ModalResult := mrOK)

    voici ses arguments :
    J’ai remarqué que dans toutes les applications dont j’ai pu consulter les sources, la récupération des informations provenant d’une fenêtre ‘F’ affichée en mode « showmodal » se fait après la sortie de cette fenêtre ‘F’ . Or cette fermeture est provoquée par le changement de la valeur ModalResult de cette fenêtre ‘F’. Le changement de la valeur ModalResult provoque la mise à disposition pour le système d’exploitation de l’espace mémoire utilisée par cette fenêtre ‘F’. Toutes actions sur cette fenêtre et notamment la cachée en plaçant dans le OnClose Action à caHide ne sert à rien, car la libération de la mémoire, par erreur de programmation de Borland, a déjà eu lieu.

    Donc les valeurs récupérées peuvent être erronées et provoquées des soucis dont l’origine sera difficile à établir.

    La méthode qui est utilisée est une grave erreur de programmation, malheureusement pratiquée par de nombreux programmeurs Delphi qui semblent ne pas avoir lus l’aide en ligne de Delphi ni les manuels Borland.
    je suis tres perplexe, puisque l'on n'a jamais procédé autrement que ce qui est décrit, et evidemment l'on n'a jamais eu de probleme.

    => Vous en pensez quoi ?

    anthony

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 730
    Points : 25 637
    Points
    25 637
    Par défaut
    . Le changement de la valeur ModalResult provoque la mise à disposition pour le système d’exploitation de l’espace mémoire utilisée par cette fenêtre ‘F’. ... car la libération de la mémoire, par erreur de programmation de Borland, a déjà eu lieu ...
    La méthode qui est utilisée est une grave erreur de programmation, malheureusement pratiquée par de nombreux programmeurs Delphi qui semblent ne pas avoir lus l’aide en ligne de Delphi ni les manuels Borland
    Ton collègue a écrit ça ? vraiment ?
    Lorsque l'on lit ce texte, on détecte une incohérence entre la 1ere et 2nde citation, Borland aurait écrit qu'il ne fallait pas faire un truc parce qu'ils auraient laissé trainer un bug ? c'est très cohérent ça !
    C'est bien confus !

    Personnellement, j'écris le code comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
       ValeurRetour : String;
    begin
       with TMyModalForm.Create(nil) do
       try
         if ShowModal() = mrOK then 
          ValeurRetour := MyTextEdit.Text;
       finally
         Free; // Le Release n'est pas utile dans ce cas !
       end;
     
       ShowMessage(ValeurRetour);
    end;
    lorsque je suis courageux, j'ai des propriétés avec accesseurs à la place d'un accès direct à MyTextEdit.Text
    Mais quoi qu'il arrive, j'ai toujours besoin de l'instance !

    Ensuite, tu pourras lui dire qu'il aurait dû se taire (voir signature), car il y a oublié un élément important qui est le FormState fsModal qui gère les fenêtres utilisées en ShowModal différemment d'une fenêtre SDI

    Mais que cela soit Close ou CloseModal (si OnCloseQuery renvoie CanClose à True, truc par défaut)
    l'action par défaut du OnClose en SDI c'est caHide et en MDI c'est caMinimize !
    En aucun cas caFree !

    Petite remarque pour la MainForm, les trois valeurs Hide, Minimize ou Free provoqueront un Release mais en général, la MainForm ne peut pas être SDI et Modale en même temps !

    Tu pourras lui dire d'étudier le Code de Forms.pas est nettement plus instructif !
    Dire que le code de Borland est buggé, cela arrive, mais pas sur un truc aussi vieux et massivement utilisé !
    Sinon le hazard ferait que personne depuis tout ce temps n'a jamais eu de mémoire "aléatoire" ou même utilisé une seule une méthode virtuelle d'un objet alloué par une fenêtre modale ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Sinon le hazard ferait que personne depuis tout ce temps n'a jamais eu de mémoire "aléatoire" ou même utilisé une seule une méthode virtuelle d'un objet alloué par une fenêtre modale
    comme tu dis !

    merci pour ta réponse
    je pense qu'il est inutile de poursuivre

    anthony

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    En tout cas merci pour ce petit moment de rigolade

    Le pire c'est qu'il y a des arguments a ses affirmations. Certes, ces arguments devraient a leur tour etre argumentés, mais la, ca va etre plus difficile de justifier "Le changement de la valeur ModalResult provoque la mise à disposition pour le système d’exploitation de l’espace mémoire utilisée".

    J'aurais bien aimé avoir un lien ou une reference a propos de "(...) qui semblent ne pas avoir lus l’aide en ligne de Delphi ni les manuels Borland"
    Tu pourra demander à ton collegue de me retourver la page ou ils disent ca ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    hello
    allez, soyons miséricordieux et oublions ça )
    a+
    anthony

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/03/2014, 15h17
  2. récupérer une info contenue dans une fenetre modale
    Par glouffy6 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/12/2008, 00h51
  3. Récupération des paramètres d'une requête
    Par TomPad dans le forum Access
    Réponses: 10
    Dernier message: 16/06/2005, 16h11
  4. Récupération des paramètres avec une procedure stockée
    Par samlerouge dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/03/2004, 23h00

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