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

Composants VCL Delphi Discussion :

Form.Show -> Fiche Active ou Non ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre averti
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Par défaut Form.Show -> Fiche Active ou Non ?
    Bonjour,

    après avoir parcouru différents message et tuto et ne trouvant pas de solution je me permet de poser ce problème :

    Soit un application avec une fiche principale FormMain : TFormMain.
    Une fiche secondaire Form1 : TForm1 qui sera dynamiquement créée et affichée dans via un clic sur bouton de FormMain

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TFormMain.BitBtnStartOnClick 
     
     Var Form1 : TForm1
      Form1 := TForm1.Create( self );
      Try 
       Form1.ShowModal ;
      Finally 
       Form1.Free
     end;
    end;
    Depuis Form1 qui est donc en show modal, je voudrai ouvrir une troisième fiche Form2 qui serait Visible et Active mais tout en pouvant continuer à interagir sur Form1... je place donc dans mon code quelque par dans Form1 :

    la fiche s'affiche bien, mais celle-ci est inactive (son Bing si l'on clique dessus)... Form1 reste bien active.

    Par contre si je place un bouton dans Form1, et dans l'évènement OnClick de celui-ci de Form2.Show, cela fonctionne ... la fenêtre Form2 est acessible ainsi que Form1 .

    Je ne comprend donc pas la différence de comportement du même code en fonction qu'il soit dans un évènement OnClick ou dans une procédure lié à des exécutions interne (Timer, ...).

    Merci pour vos idées ...

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Pour faire simple, toute fenêtre de l'application créée avant un ShowModal ne sera pas accessible.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Si tu le fais dans le OnClick d'un TButton, et que tu ne fais QUE cela !
    Cela réagit immédiatement, c'est tout à fait normal !

    Les Messages Form2 doivent être géré par la fenêtre Modale (le code est assez monstreux, ça détourne les messages)

    Si tu es un peu plus curieux sur la remarque de Rayek :
    En fait au moment du ShowModal cela inhibe les fenêtre DEJA ouverte via un appel à DisableTaskWindows,
    cela boucle sur les messages, puis lorsque tu ferme la fenêtre,
    cela rend la main aux autres fenêtres avec EnableTaskWindows

    Mais les fenêtres créées APRES ShowModal n'ont pas été "inhibées" et sont donc accessibles !

    Citation Envoyé par steph1969 Voir le message
    .... je place donc dans mon code quelque par dans Form1 ...
    Citation Envoyé par steph1969 Voir le message
    Par contre si je place un bouton dans Form1, et dans l'évènement OnClick de celui-ci de Form2.Show, cela fonctionne ... la fenêtre Form2 est acessible ainsi que Form1 .
    Quelle est la différence, c'est toujours dans Form1 !
    Voulais-tu souligner l'utilisation différent de Form2 ??? ?
    - soit juste dans un Bouton de Form1
    - soit dans un gros code de Form1


    Si tu fais le Show dans une fonction qui fait autre chose ensuite
    , cela ne gère pas les messages :
    - soit tant que ta fonction n'a pas fini de travailler
    - soit jusqu'au prochain appel à Application.ProcessMessages().

    Pour le cas du Timer, celui-là, disons qu'il a un contexte d'éxecution un peu particulier que je n'ai jamais très bien compris, idem, c'est un message qui provoque son execution, si tu as une boucle dans un OnClick ou similaire, le TTimer ne réagira plus au WM_TIMER
    C'est d'ailleurs pour cela qu'il faut attention à l'utilisation de Application.ProcessMessages() qui provoque des ré-entrance !

    Un Test simple :
    un Timer qui affiche l'heure toute les 10 ms

    Deux Boutons

    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
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Label1.Caption := TimeToStr(Now());
      Label1.Refresh(); // Force le Dessin sans attendre le traitement des Messages !
    end;
     
    procedure TForm1.BtnForBlock(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to 10000000000 do;
    end;
     
    procedure TForm1.BtnForNotBlock(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to 100000000 do
        Application.ProcessMessages();
    end;
    Idem, une TForm pourrra s'afficher (et encore) mais restera figé si tu as un long calcul après son affichage !



    Tu peux aussi avoir une différence de ZOrder selon D7 ou D2006
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Par défaut
    Bonjour et merci pour vos réponses ...

    je pense avoir compris d'où venait mon problème ... dans le cas ou cela ne fonctionne pas, le Form2.Show se déclenche dans des appels provenant du Form1.OnCreate ... donc le Form1.ShowModal est réalisé après.

    Dans le cas n° avec un bouton dans Form1, forcément cela se passe après le ShowModal ...

    Finalement c'était simple ... fallait juste savoir que Showmodal "vérouille" les autre fenêtre ... et que l'ordre des opération à de l'importance

    Y-a-t'il une fonction windows capable de "restauré" l'état de mafenêtre Form2 après le ShowModal ... du genre :
    WinReactiveWindow( Form1.Handle, ... )

  5. #5
    Membre averti
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Par défaut
    Finalement j'utilise le OnShow de Form1 pour afficher la Form2 ... cela fonctionne

    Merci encore.

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

Discussions similaires

  1. Détection Javascript activé OUI/NON
    Par Lux interior dans le forum XMLRAD
    Réponses: 3
    Dernier message: 01/10/2009, 13h10
  2. Capture image d'un forme active ou non
    Par pc152 dans le forum C#
    Réponses: 2
    Dernier message: 27/05/2008, 20h30
  3. form.show affichage d'une nouvelle fiche
    Par nadia2222 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2007, 06h44
  4. [VBA-E] copier une fiche active dans un autre classeur.
    Par Little-Freud dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 15/03/2006, 10h51
  5. Réponses: 3
    Dernier message: 03/03/2006, 11h40

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