8
votes

Forme principale de Delphi Onshow / forme modale

J'ai un projet qui a une forme principale et d'autres formes. Lorsque l'application chargeait, il doit effectuer des tâches et montrer les résultats sous une forme modale sur la forme principale. Le problème que j'ai est que si je mettais l'appel à la fonction pour effectuer les tâches / crée et montrer la forme modale dans l'événement des formulaires principaux, la forme modale apparaît, mais la forme principale ne dépasse pas que la forme modale est fermée, ce qui est Ce que je pouvais m'attendre. Pour contrer cela, j'ai ajouté une minuterie à la forme principale et démarrez-la sur les formulaires principaux Soushow Evénement que la minuterie appelle la fonction pour effectuer les tâches / créer et afficher la forme modale. Donc maintenant, la forme principale apparaît avant la forme modale.

Cependant, je ne peux pas voir cela étant la meilleure solution et je me demandais si quelqu'un pouvait offrir un meilleur.

J'utilise Delphi 7

colin


4 commentaires

utiliser postmessage. Stackoverflow.com/questions/7094873/...


Désolé pour le hors-thème par pourquoi cette question montre "floue" dans la liste des questions principales?


@Kobik: Les questions AFAIK montrent que vous avez une balise que vous ignorez, et quand ils ont un score de vote négatif qui dépasse une certaine limite. Les questions de BTW sur le chemin afin que les œuvres sont mieux posées sur le méta-site (voir le lien dans la navigation principale).


@Marjan, merci pour l'info.


3 Réponses :


10
votes

Une option couramment utilisée consiste à poster vous-même un message dans le inshow du formulaire . Comme ceci: xxx


17 commentaires

Bien que ce soit la bonne idée d'une solution, la mise en œuvre de celle-ci indiquée n'est pas si bonne. :) Utilisez le message personnalisé et implémentez un gestionnaire pour ce message spécifique au lieu de remplacer l'ensemble du WNDProc. Déclarez simplement votre message personnalisé avant la déclaration de type du formulaire et ajoutez Procédure UMSHOWMYOTOTHERFORM (VAR Message: TMessage); Message um_showmyotherform; . Ensuite, la seule chose qui interrompt le flux normal de wndproc est votre message personnalisé.


@Ken vrai ça. Je suis habitué à gérer des identifiants de messages alloués au moment de l'exécution


C'est comme ça que celles-ci me traduisaient, alors je continue de le faire de cette façon parce que cela fonctionne. Certains détails techniques seraient bien, si vous les avez.


@ Dave et Ken - merci pour votre aide. Très utile


@Marcusadams Détails sur quel aspect? PostMessage ou gestionnaires de messages?


@David, quelle est la magie de la façon dont cela fonctionne? Est-ce parce que le message à dessiner Leform est en avance sur le message personnalisé de la file d'attente, qui sont tous deux traités après l'onduleur?


@MARCUSADAMS Le gestionnaire Onshow est appelé avant l'appel sur showwindow est effectué. Donc, il serait peut-être mieux nommé comme onjustbeforeshow . Pour la forme principale montrant pour la première fois, tout cela se produit comme la loi finale avant de démarrer la pompe de message de fil principal (application.run). L'affichage d'un message à la file d'attente nous permet de vous assurer que l'appel à showwindow est effectué avant que le message fileté soit traité. Cependant, la recherche de cela me conduit à une solution encore meilleure ......


@Ken merci, mais c'est mon autre réponse qui claque en fait celui-ci à mon avis !!


Je n'aime pas l'autre parce que d'autres choses peuvent utiliser le cm_showingchange; Je préfère l'enregistrer pour des éléments tels que des composants ou des boîtes de dialogue intégrées (dans les composants) et utilisez des spécifiques personnalisées pour des choses comme celle-ci. (Bien que je do utilise correctement wm_app + anumber pour mes identifiants de message car l'API dit que vous devriez. :))


@Ken Peu importe que quelque chose d'autre utilise cm_shovechange . Tous les autres utilisateurs ne seront pas affectés parce que vous appelez hérité.


Je suis au courant de cela, mais je préfère toujours cette méthode. Probablement juste un biais personnel. ;)


@Ken Ce que je n'aime pas à ce sujet, c'est une préoccupation que le message posté passe au dos de la file d'attente et d'autres messages en file d'attente est traité en premier. Donc, une forme d'interface utilisateur peut arriver à la forme principale avant que la forme modale ne montre. Obtenir les deux formes avant que la boucle principale des messages ne commence à éviter ce piège.


Ce que je n'aime pas à propos de l'autre, c'est que cela peut tirer des temps répétés et que vous avez besoin du booléen supplémentaire pour suivre si votre action connexe est terminée. En publiant un message à la fin du constructeur, il est envoyé une seule fois (à moins que le formulaire ne soit libéré et créé à nouveau) et il n'y a donc pas besoin de la logique / variable de suivi supplémentaire. Comme je l'ai dit, probablement juste une préférence personnelle.


@Ken Le même argument est vrai pour Onshow . Constitué, vous savez probablement que vous montrez la forme principale une fois. Mais ce n'est pas le cas pour certaines applications. Parfois, vous cachez la forme principale et laissez une icône dans la zone de notification. Bien sûr, si nous avions des événements multi-casting, le problème pourrait être résolu de manière beaucoup plus élégante. Oh pour être sur .net!


Je n'ai pas dit Onshow ; J'ai dit constructeur . :) Le constructeur du formulaire n'est appelé qu'une seule fois. :)


@Ken ok, vois ça maintenant. Je suppose que vous feriez mieux d'espérer que rien ne pique la file d'attente avant que la forme principale ne soit montrée alors. Je ne veux pas de processages de voyous. Je pense toujours que cette réponse est médiocre et l'autre est la bonne façon. Prendre des chances lorsque la file d'attente est pompée semble risquée.


Je n'utilise pas ProcessMessages . jamais. Donc, il ne peut y en avoir un. Je n'utilise pas de composants tiers utilisant processages non plus. Et je n'utilise pas de composants tiers sans source, ils ne peuvent donc pas se faufiler. :)



2
votes

Pourquoi n'utilisez-vous pas le MainForm Onactivate Evénement comme? XXX

Réglage de l'événement sur NIL Assurez-vous que ce code est exécuté une seule fois, au démarrage.


0 commentaires

0
votes

Le Onshow est déclenché immédiatement avant l'appel à la fonction API Windows ShowWindow est effectué. C'est cet appel à showwindow qui entraîne réellement la fenêtre apparaissant à l'écran.

Vous avez donc besoin de quelque chose à exécuter immédiatement après l'appel à showwindow . Il s'avère que le code VCL qui conduit tout cela est à l'intérieur d'un TCustomForm Titulaire de messages pour cm_showokchanged . Ce gestionnaire de messages incendie l'événement tanshow showwindow . Donc, une excellente solution consiste à montrer votre forme modale immédiatement après le gestionnaire pour cm_showokchanged exécute. Comme ceci: xxx


0 commentaires