Pb d'affichage d'une fiche [Résolu]

cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 25 févr. 2009 à 15:21 - Dernière réponse : cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention
- 25 févr. 2009 à 22:38
Salut à tous, je butte sur un petit problème.

J'ai un programme tout simple fait en DELPHI 7, avec un petit écran, 2 boutons, une zone texte, ... un truc tout bête.

Ce programme fait des traitements très long et à 2 modes de fonctionnement, un manuel, ou l'utilisateur lance le traitement en cliquant sur un bouton, l'autre automatique ou le traitement est automatiquement lancé au démarrage de l'appli si le paramètre correspondant est passé en ligne de commande.

Mon problème est que mon traitement (automatique) démarre avant que l'écran soit affiché, ce qui fait que l'écran ne s'affiche qu'à la fin du traitement et se ferme immédiatement puisque le programme est terminé.

Ma question est, comment lancé automatiquement le traitement mais une fois uniquement que la fiche est correctement affichée à l'écran.
Pour l'instant j'utilise ce code mais ça marche pas :

procedure TForm_InfoUser.FormShow(Sender : TObject);
begin
  if FindCmdLineSwitch('autopetitclient',TRUE) then
  begin
    // Traitement Auto
    flagAuto := TRUE;
    btn_oui.Enabled := false;
    btn_non.Enabled := false;
    btn_fermer.Enabled := false;
    application.ProcessMessages;
    Module.MonTraitementLong;
    Form_InfoUser.close;
  end
  else
    //Traitement manuel
    flagAuto := FALSE;
end;

J'imagine que le problème vient du FormShow, mais je sais pas quoi utiliser comme évènements, je maitrise pas Delphi et je ne les connais pas.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 25 févr. 2009 à 15:33
3
Merci
Je dirais FormActivate mais à tester, au pire (mais c'est un peu crade), tu mets ton lancement dans un Timer réglé sur 1 ms (ou 10 ou 100 etc), tu disable (Timer.Enabled:= False;) par la même occasion ce timer pour qu'il ne le lance pas plusieurs fois. Avec cette soluce un peu cracra tu es sur que les composants sont créés et affiché avant que ta procedure ne se lance.

Merci JulioDelphi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de JulioDelphi
Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 25 févr. 2009 à 17:12
3
Merci
Salut,

JulioDelphi a raison ... utilises FormActivate ça fonctionne

procedure TForm1.FormActivate(Sender: TObject);
begin
  Application.ProcessMessages; // Force l'affichage
  Button2.Click;  // début du traitement long
end;

 
@+
Cirec

<hr siz="" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Commenter la réponse de Cirec
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 25 févr. 2009 à 17:36
0
Merci
Ok merci, je vais tester

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Commenter la réponse de cs_casy
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 25 févr. 2009 à 17:42
0
Merci
Effectivement le FormActivate marche très bien.
j'avais pas osez l'essayer car j'avais des mauvais souvenirs avec VB6, le form_activate était enclenché chaque fois que la fenêtre reprenait le focus, même lorsqu'il venait d'une autre application.
Ici ça ne semble pas le cas.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Commenter la réponse de cs_casy
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 25 févr. 2009 à 20:58
0
Merci
il me semble que le formActivate sera effectué si tu affiche une autre form du meme projet et que tu repasse sur la premiere.
En tout cas, tu peux aussi t'en sortir en envoyant un message. un truc du genre :
<hr size="2" width="100%" />procedure Go(var: msg: TMessage); message WM_MONMESSAGE;

procedure TForm_InfoUser.FormShow(Sender : TObject);
begin
  if FindCmdLineSwitch('autopetitclient',TRUE) then
  begin
    // Traitement Auto
    flagAuto := TRUE;
    btn_oui.Enabled := false;
    btn_non.Enabled := false;
    btn_fermer.Enabled := false;
    postMessage(Handle, WM_MONMESSAGE, 0, 0);//on empile le message qui sera traité une fois tous ceux en attente traités
  end
  else
    //Traitement manuel
    flagAuto := FALSE;

end;

procedure TForm1.Go(var: msg: TMessage); message WM_MONMESSAGE;

begin
    Module.MonTraitementLong;
    Form_InfoUser.close;
end;
Commenter la réponse de Guillemouze
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 25 févr. 2009 à 22:38
0
Merci
Merci Guillemouze.

Je n'ai qu'une form dans mon programme donc ça devrait aller.
Par sécurité j'ai quand même mis un flag. Si je suis déjà en traitement, je sort immédiatement du FormActivate.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Commenter la réponse de cs_casy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.