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 :

erreur 'impossible de rendre modale une fenêtre visible'


Sujet :

Langage Delphi

  1. #21
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 838
    Points
    25 910
    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 838
    Points : 25 910
    Par défaut
    Normalement, les propriétés sont toutes à 0 donc False lors du InitInstance, lui je ne sais pas qui l'invoque, il me semblait que c'était implicite

    Sans le inherited Create, il n'y a pas de chargement de la DFM, d'abord cela invoque InitializeNewForm, en XE3, cela force explicitement False pour Visible, il y a surement une raison à cela
    Puis cela invoque InitInheritedComponent qui charge la DFM, Visible et les autres propriétés prennent ainsi leur valeur depuis celle défini dans l'Inspecteur d'objets

    On peut voir aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property Visible write SetVisible default False;
    devrait garantir un Visible à False, cette valeur n'est prise en compte que lorsque l'on charge une DFM qui ne mentionne pas la valeur (dans l'inspecteur, le gras indique le stockage, quand ce n'est pas en gras, cela utilise les valeurs de l'ancêtre ou celle par défaut)

    En fait, ce n'est peut-être pas Visible qui pose problème mais Enabled
    Enabled est resté à False suite au InitInstance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     property Enabled: Boolean read GetEnabled write SetEnabled stored IsEnabledStored default True;
    Idem, Enabled est hérité du TControl, sa valeur n'est pas stocké dans la DFM si on n'y touche pas, puisqu'à True par Défaut

    Mais comme on ne charge pas la DFM, on n'utilise pas cette property default True donc Enabled reste à False

    en code simplifié, le début du ShowModal c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if Visible or not Enabled or MDI or déjà Modale then
        erreur 'impossible de rendre modale une fenêtre visible'
    Ce qui est très mal fichu, le problème n'est pas visible mais "clickable" !
    C'est un vilain amalgame par les développeurs de la VCL qui ont eu la flemme de gérer un message d'exception par critère d'exclusion lors d'un ShowModal

    comme ceci en pseudo code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      if Visible then
        erreur 'impossible de rendre modale une fenêtre visible'
      if not Enabled then
        erreur 'impossible de rendre modale une fenêtre désactivée'
      if MDI then
        erreur 'impossible de rendre modale une fenêtre enfant MDI'
      if déjà Modale then
        erreur 'impossible de rendre modale une fenêtre déjà affichée en modale'

    Par habitude, je mets systématiquement le inherited Create même si j'hérite directement d'un TObject, pour ce dernier comme le Create ne fait rien ce n'est pas perturbant, c'est un habitude à prendre pour éviter un jour ce genre de piège
    Par contre le inherited Destroy dans un destructor est OBLIGATOIRE

    effectivement je l'ai mise en commentaire car dans pas d'autre fenêtre dans le programme que je développe elle était en commentaire
    Il ne faut pas confondre Create et OnCreate
    dans le constructor, inherited doit être mentionné
    dans le OnCreate, c'est un gestionnaire d'évènement, inherited n'aurai pas de sens, il ne doit pas être

    Et c'est là qu'il y a peut être confusion, utilisé les deux en même temps, cela peut être trompeur,

  2. #22
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 865
    Points
    13 701
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 865
    Points : 13 701
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    dans le OnCreate, c'est un gestionnaire d'évènement, inherited n'aurai pas de sens, il ne doit pas être
    A part s'il y a héritage de fiche (je sais... tu n'aimes pas les héritages de fiche)

Discussions similaires

  1. Rendre modale une fenêtre QTableView
    Par farabi dans le forum Débuter
    Réponses: 3
    Dernier message: 05/05/2015, 17h15
  2. Réponses: 4
    Dernier message: 07/07/2009, 14h29
  3. Impossible de rendre modale une feuille..
    Par lenrok dans le forum C++Builder
    Réponses: 4
    Dernier message: 01/01/2007, 10h21
  4. Erreur sur l'ouverture d'une fenêtre popup
    Par misa dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/11/2005, 16h21
  5. [MFC] Rendre modale une CFindReplaceDialog
    Par GrimKo dans le forum MFC
    Réponses: 2
    Dernier message: 17/05/2005, 07h41

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