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 :

Plusieurs fenêtres en mode modal


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut Plusieurs fenêtres en mode modal
    Bonjour à tous,

    Je sais que le problème des fenêtres au premier plan à déjà été maintes fois abordé, mais je n'arrive pas à obtenir d'exemples ou de pistes pour ce que je souhaite faire, c.a.d lancer une série de fenêtre en mode "pseudo-modal". En gros, j'aimerais pouvoir naviguer entre ces fenêtres à volonter mais sans pouvoir activer une autre fenêtre du projet tant que toutes celles ouvertes ne soient fermées.

    J'espère avoir été assez clair...

    Merci à tous ceux qui se pencheront sur mon problème.

    A+.

  2. #2
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    J'espère avoir été assez clair...
    Bah, pas vraiment.

    Je fais des fenêtres "pseudo-modale" qui
    - autorisent l'accès à d'autres fenêtres excepté à la fenêtre d'appel
    - restent au dessus de toutes. (cela permet les glisser déplacer d'informations).
    - à la fermeture rendent un résultat à la procédure appelante (qui était en attente).

    Le principe est appliquable il me semble.

    J'explique :

  3. #3
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Un petit exemple de code pour illustrer mes propos :

    Créer une fiche en fsStayOnTop et lui ajouter
    - une propriété booléenne de gestion de l'ouverture (ouvert).
    - une propriété booléenne de gestion de la fermetrure (resultat).

    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
    25
    26
    27
     
     
    procedure TMaFenetrePseudoModale.FormShow(Sender: TObject);
    begin
      Ouvert := True;
    end;
     
    procedure TMaFenetrePseudoModale .FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Ouvert := False;
    end;
     
    procedure TMaFenetrePseudoModale .SetOuvert(const Value: Boolean);
    begin
      if (FOuvert<>Value) then
      begin
        FOuvert := Value;
        Case FOuvert of
         true : begin
                      // c'est vous qui voyez !
                 end;
        false : begin
                      // c'est vous qui voyez !
                  end;
        end;
      end;
    end;

    Exemple d'appel à cette fiche "pseudo-modale".

    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
     
        MaFenetrePseudoModale := TMaFenetrePseudoModale.Create(Owner);
        with MaFenetrePseudoModale do
        begin
          try
            Show;
     
            while MaFenetrePseudoModale.Ouvert do  // Simulation du ShowModal
            begin
              Application.ProcessMessages;
            end;
     
            Result := MaFenetrePseudoModale.Resultat; // Le résultat est mis à jour par chacune des fiches en focntion de leur spécificité
          finally
            Free;
            MaFenetrePseudoModale := Nil;
          end;
        end;

  4. #4
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Il me semblait, vu que c'était pas tout à fait clair pour moi déjà.
    En fait, ce que j'aurais aimer faire:

    1) Je clic sur un bouton d'une fenêtre, ça me lance 10 autres fenêtre "pseudo-modales".
    2) Ces dix fenêtre sont utilisables par l'utilisateur (un clic sur l'une d'elle la passe au premier plan), mais il ne doit pas avoir accès à la fenêtre initiale ou à toute autre fenêtre du projet qui n'est pas une de ces dix fenêtres "pseudo-modal". Ce qui implique donc que chacune des 10 fenêtre est modale vis-à-vis de toutes les fiches du projets, mais qu'elle ne le sont pas entre elles.
    3)Lorsque l'utilisateur à fermer Toutes les fenêtres "pseudo-modales", il reprend son appli classique.

    Mais je vais décortiquer votre code et le tester.

    Merci beaucoup pour votre aide,

    A+.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Si je puis me permettre une autre idée.

    Vous créez une fenêtre de fond qui ne sert qu'a cacher le reste de votre application avec
    WindowsState => maximized
    Tous les éléments de BorderIcons =>false
    BorderStyle =>bsNone
    Vous obtenez une fenêtre de cache sur tout l'écran.
    Dans le show de cette fenêtre cache (ex:form2) vous créez vos 10 fenêtres (avec la valeur fsStayOnTop pour quelles soient au dessus). (ex avec 3 fenêtres : form3, 4, 5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm2.FormShow(Sender: TObject);
    begin
    try
      Application.CreateForm(TForm3, Form3);
      Application.CreateForm(Tform4, form4);
      Application.CreateForm(TForm5, Form5);
      try
        form3.Show;
        form4.Show;
        form5.Show;
      except
      end;
    except
    end;
    Vous fermez la fenêtre cache sur la fermeture de la dernière des 10 fenêtres dans le "activate".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm2.FormActivate(Sender: TObject);
    var i : integer;
    begin
      i:=3;
      if not assigned(form3) then dec(i);
      if not assigned(form4) then dec(i);
      if not assigned(form5) then dec(i);
      if i<2 then close; // la mise à nil semble tardive ?
    end;
    Attention de bien utiliser le nil pour libérer vos 10 fenêtres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      free;
      form3:=nil;
    end;
    Il vaut peut être mieux utiliser une autre méthode pour gérer la fermeture de vos 10 fenêtres, mais cela vous permet de faire un test rapide pour voir si ça convient.

    Espérant que cette piste pourra vous être utile.
    A+, Hervé
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Re Bonjour,

    Une autre idée, pourquoi ne pas utiliser des onglets?

    Je m'explique.
    Vous créez une fenêtre modale (maximized pour plus de visibilité) sur laquelle vous placez unTPageControl avec 10 TTabSheet.

    Sur chaque feuille TabSheet un bouton "Fermer", quand l'utilisateur clique vous le rendez invisible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabSheetNbX.TabVisible := false;
    ce qui donne l'impression que l'on ferme.

    Lorsque le dernier est invisible (fermé) fermeture de la fenêtre modale, qui peut s'effectuer :
    - soit avec une propriété de la fenêtre modale (initilisé à 10:mesOngletsVisibles = 10),
    (Dans chaque "Fermer" des TabSheet => Décrémenter mesOngletsVisibles, test: si mesOngletsVisibles=0 alors fermer la fenêtre modale)
    - soit sur une fonction avec parcours des 10 TabSheet pour voir s'il sont tous invisible.

    Cela a l'avantage d'être très simple à mettre en oeuvre.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    une idée voir fichier attaché:
    le truc est de mettre la fenetre(appelante).enable:=false
    pour le postmessage je l'ai fait au premier pour tester avec showmodal, mais seul la dérniére fenétre garde le focus

  8. #8
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Merci beaucoup pour votre aide.

    Tes solutions étaient intéressantes, rv26t, mais elles posaient deux problèmes dont je n'avait pas parlé: toujours avoir le graphique de ma simulation en arrière plan, et le fait que je puisse ouvrir une centaine de fenêtres (problème pour le tabsheet).

    Ton exemple correspond à mes attentes edam, et en conservant 2-3 idées intéressante du code de Yurck, je pense que je vais arriver à mes fins.

    Encore merci à vous trois de vous être penchés sur mon problème,

    A+.

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

Discussions similaires

  1. fenêtre en mode modal
    Par realkilla dans le forum C#
    Réponses: 2
    Dernier message: 02/10/2008, 15h46
  2. [Tkinter] Plusieurs fenêtre avec Tkinter
    Par cyrpaut dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/01/2006, 22h24
  3. VB6 - connaître si un objet Form est chargé en mode MODAL
    Par CBleu dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/01/2006, 21h16
  4. TForm pour plusieurs fenêtre dans une même fonction ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/11/2005, 12h38
  5. Interface graphique avec plusieurs fenêtres
    Par Copps dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 30/03/2005, 18h00

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