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

Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- - Dernière réponse : cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 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
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
12
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 110 internautes nous ont dit merci ce mois-ci

Commenter la réponse de JulioDelphi
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
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="" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 110 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
38
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
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
38
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
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
6
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
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
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.