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

  1. #1
    Membre averti
    Empêcher les Form secondaires de minimiser lorsque la MainForm est minimisée
    Bonjour

    J'ai un projet avec plusieurs Form en auto-create dont une est la MainForm.
    Comment empêcher les Form secondaires de minimiser lorsque la MainForm est minimisée?
    Ou bien dois-je les créer autrement (dynamiquement avec d'autres parametres) ?
    J'ai déjà essayé de les créer dynamiquement mais c'est toujours la même réaction: quand la MainForm est minimisée, toutes les autres fenêtres sont minimisés.

  2. #2
    Membre du Club
    Hello. Crée-la non-modale

  3. #3
    Membre confirmé
    Bonjour,

    Une solution pourrait être aussi de faire une "vraie fausse" fenêtre principale : après lancement de l'appli et activation de la MainForm vous faites apparaître une nouvelle Form qui sera utilisée comme fenêtre principale dans la logique de votre appli (sans la déclarer comme telle) et vous cachez la MainForm system par un Hide().

    Yves

  4. #4
    Membre averti
    Citation Envoyé par Kianii Voir le message
    Hello. Crée-la non-modale
    La MainForm? Elle n'est pas modale

    Une solution pourrait être aussi de faire une "vraie fausse" fenêtre principale : après lancement de l'appli et activation de la MainForm vous faites apparaître une nouvelle Form qui sera utilisée comme fenêtre principale dans la logique de votre appli (sans la déclarer comme telle) et vous cachez la MainForm system par un Hide().
    Je vais essayer ça si c'est possible

  5. #5
    Membre averti
    Après une petite nuit blanche, j'ai trouvé une manière élégante de le faire:

    • lorsque'on veut minimiser la MainForm, on ne doit ni appeler Hide() , ni Application->Minimize(). On doit plûtot mettre la propriété Visible de la MainForm à false et le Windowstate à wsMinimized. Les autres fenêtres resteront visible et ne seront pas minimisées avec la MainForm.
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      1
      2
      Visible = false;
      WindowState = wsMinimized;


      J'en ai profité pour utiliser un TTrayIcon car une fois la MainForm invisible, il n'y a plus de moyen de la restaurer puisqu'elle est invisible, à part depuis les autres fenetres biensûr. Je contrôle la restauration depuis le TTrayIcon.
    • Lorsqu'on veut réduire la MainForm (un TMainWindow pour mon cas) , on n'execute pas la procédure normale de réduction de fenêtre , on doit changer le comportement de la fenêtre.
      On intercepte le message système WM_SYSCOMMAND , on teste si le WPARAM est à SC_MINIMIZE. On redéfinit le comportement du bouton réduire grace à un BEGIN_MESSAGE_MAP et en mettant le TMessage.result à 0 pour dire qu'on a réçu a commande mais qu'on ne l'execute pas. C'est à ce moment là aussi qu'on met la propriété Visible à false et le Windowstate à wsMinimized

      En gros,
      Ajouter ce code dans l'en-tête de MainForm
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      ...
      private:	// User declarations
          void __fastcall WMSysCommand(TMessage &Msg);
          BEGIN_MESSAGE_MAP
      		MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand)
      	END_MESSAGE_MAP(TForm)
      ...


      Déclarer le fonctionnement du code dans la source de MainForm
      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
      ...
      void __fastcall TMainWindow::WMSysCommand(TMessage &Msg)
      {
          unsigned int const sys_code = Msg.WParam & 0xFFF0;
          switch (sys_code)
          {
              case SC_MINIMIZE:
              {
       
      			Msg.Result = 0;
      			Visible = false;
      			WindowState = wsMinimized;
      			return;
       
                  break;
              }       
          }
          TForm:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />ispatch(&Msg);
      }
      ...

  6. #6
    Membre confirmé
    Merci pour ce retour tlt.
    Je suppose que vous êtes là aussi sous VCL.
    Sous FMX, ayant été déjà confronté au même problème, je préfère le première méthode, plus simple.
    Perso, par principe je n'ai recours à l'interception d’événements qu'en dernier recours.
    Mais c'est une belle astuce à retenir en tout cas.

    Yves

  7. #7
    Membre averti
    Oui, je suis majoritairement sous VCL. Je ne me suis pas encore trop penché sur FMX mais je vais tenter aussi pour voir.

    Une petite curiosité. Pour la "vraie fausse" fenêtre principale, comment gérer vous l'inter-communication entre Form sous FMX?
    D'ailleurs comment gérer vous l'intercommunication entre Form en général, que ce soit sous FMX ou VCL ?

  8. #8
    Membre confirmé
    Sauf recours à des ressources spécifiques Windows tels que le pilotage d'applis Office, je recommande très fortement FMX qui vous donnera une interface vectorielle performante et au gout du jour.
    Vous aurez également accès eu développement mobile à partir des mêmes sources.
    En 2D c'est pratiquement sans équivalent en terme de simplicité de mise en oeuvre et d'efficacité. (On le doit à Delphi)
    Evidemment la partie 3D ne concurrencera par Unity ou Unreal mais cela peut permettre d'enrichir une appli dans des cas relativement simples tout en ayant une très grande souplesse de développement.
    A l'avenir il n'est d'ailleurs pas impossible que l'on ait accès à des moteurs comme tels que Ogre 3D.

    La communication entre fiches peut se faire très simplement en déclarant le fichier d'entête de la fiche avec laquelle vous voulez communiquer (Fichier->Utiliser l'unité ou Alt F11 ou manuellement dans le code).
    Ceci vous donnera accès aux membres publics de la fiche.
    Il est possible aussi d'avoir recours à des variables globales mais c'est nettement moins élégant.

  9. #9
    Membre averti
    très interessant. Je vais me pencher un peu sur FMX. En tout cas merci pour les conseils

###raw>template_hook.ano_emploi###