cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 2014
-
25 févr. 2009 à 15:21
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 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.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 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.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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;
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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;
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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.