Pb d'affichage d'une fiche

Résolu
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 25 févr. 2009 à 15:21
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre 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

6 réponses

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
25 févr. 2009 à 15:33
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.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
25 févr. 2009 à 17:12
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="" />
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2009 à 17:36
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2009 à 17:42
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 févr. 2009 à 20:58
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;
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2009 à 22:38
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
0
Rejoignez-nous