IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Affichage d'une Form [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut Affichage d'une Form
    Bonjour,

    J'ai un problème mineur que j'ai pour l'instant "réglé" de 2 manières, à mon avis, non satisfaisantes.

    La première et seule fenêtre du programme contient un Tlabel et une TProgessbar. Dans l'évènement OnShow, je crée un tidFTP (indy 10) qui charge immédiatement un fichier. Je rencontre un problème d'affichage lors de l'exécution du programme : le fond de la Form est transparent (je vois le bureau de Windows à travers ). J'ai placé une image (alClient)... pas mieux...

    J'ai 2 solutions : placer le chargement dans un Thread parallèle... Inutile dans ce cas car la fenêtre ne fait que charger le fichier... Le Thread ne servirait qu'à gérer l'affichage...
    ou cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      if bDejaLance = False then begin
        bDejaLance := True;
        Application.ProcessMessages;
        FTPrun();
      end;
    end;
    ... sachant que l'évènement Paint est ouvert de multiples fois lors d'un simple affichage de la fenêtre (d'où le bDejaLance).

    Dans les 2 cas, je trouve les procédures très lourdes pour un simple problème de synchronisation des "évènements"... Y a-t-il plus simple ?

    Cordialement. Gilles
    Dernière modification par Invité ; 12/06/2011 à 12h28.

  2. #2
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Bonjour Gilles

    C'est effectivement curieux comme méthode de travail et ton problème d'affichage d'autant plus logique....

    Si je puis me permettre une autre manière de procéder basée sur mes différentes applications de gestion

    Le traitement gérant la récupération de ton fichier peut très bien se placer dans une unité dédiée: soit dans une classe ou directement dans une méthode avec ou sans l'utilisation d'un Thread (Selon les besoins)

    Ensuite l'ors de l'appel de la procédure de traitement, celle ci peut directement piloter une Tform pour y afficher du texte et une jauge de progression ou mieux encore appeller une procédure de call back (Cas de l'api Windows et de pleins d'autres fonctions).

    Ainsi, n'importe lequel de tes programmes peut faire appel à tes outils de gestion fichiers et rester indépendant

    Cela résoud également les différents problème liés à l'affichage des fenêtres car au risque de passer pour un vieux chi....... on ne lance pas de traitement dans les procédures d'affichage. Cela n'est pas fait pour cela.....

    Très cordialement,
    Chris

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Chris...

    Je ne comprends pas bien la réponse... Hum, j'ai encore dû mal "encoder" ma question initiale. Je reformule.

    Mon problème est de synchroniser les évènements... Il ne s'agit pas de piloter la fenêtre de l'extérieur. Elle est toute seule, lancée ainsi :

    Project1.lpr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    A partir de là, tout le code sera dans la TForm1.
    La séquence de procédure d'affichage d'une Form vide semble être : Resize - Show - Active - Paint.

    Le Active est tentant mais en ce qui me concerne l'affichage n'est pas complet, ni d'ailleurs le traitement du fond de la Form avec le Paint qui m'a amené à placer un TStaticText (alClient)... Ce qui me laisse supposer qu'il n'y a pas d'indicateur que le Show est terminé...

    D'où ma question ?

    Au plaisir de te relire.
    Cordialement. Gilles

    PS :
    • Avec un Thread c'est comme si... mais pas vraiment : le Thread principal du programme de la Form fait sa cuisine d'affichage, ses Paint & Co,... et pendant ce temps-là, le Thread parallèle exécute sa procédure et comme elle s'effectue en parallèle, elle ne "gêne" pas le Thread principal (l'affichage). De ce fait, tout semble "bien" : l'utilisateur ne s'aperçoit de rien... Mais c'est un contournement du problème.
    • Les API Windows ? J'utilise les 2 OS. Je préfère donc les codes portables Win/Nux
    Dernière modification par Invité ; 12/06/2011 à 18h58.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon, finalement, en essayant diverses combinaisons, j'en ai trouvé une en jouant avec Resize : Je change la largeur initiale de la Form dans l'évènement OnPaint de celle-ci. Le "Application.ProcessMessages" devient inutile avant le lancement de la procédure ftpRun.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    type
      TForm1 = class(TForm)
         private
        { private declarations }
        FormDefaultWidth : Integer;  //Contiendra la largeur initiale de la Form
        bDejaLance : Boolean;        //Ne lancer qu'une fois la procedure ftpRun et
        procedure ftpRun();          //non à chaque Repaint 
      public
        { public declarations }
      end; 
     
    var
      Form1: TForm1; 
     
    implementation
     
    [...]
     
    procedure TForm1.ftpRun();
    begin
     [...]  
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FormDefaultWidth := Form1.Width; //Mémorise la largeur initiale de la Form
       bDejaLance  := False;           //Initialisation de la variable "Une seule fois"
     [...]
    end;
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      Form1.Width := FormDefaultWidth +1;    //Il faut changer la valeur par défaut
      if  bDejaLance  = False then begin     //...sinon sans effet
        bDejaLance  := True;
    //  Application.ProcessMessages;         //...inutile 
        ftpRun();
      end;
    end;
     
    end.
    Le problème d'affichage semble résolu sur Win et Nux même en enlevant le StaticText (alClient) qui me servait de fond de Form. Reste la question : comment sait-on que la séquence d'affichage onShow est terminée ? Je n'ai pas le temps de regarder plus avant pour l'instant. Je note dans mon carnet...

    Chris, merci pour ton aide (Même si je n'ai pas bien compris ta réponse, la nécessité de reformer plus clairement la question m'a donné une réponse empirique... à défaut).
    Cordialement. Gilles
    Dernière modification par Invité ; 12/06/2011 à 22h14.

  5. #5
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Pour las apis de Bilou, c'etait juste un exemple, j'aurai pu citer d'autre systmem qui appels des procedures call back !

    Bon je file voir X-men au cine et je reprend le manche dans la soirée

    Mais je reste sur ma position de séparer affichage et traitement !

    Cordialement,
    Chris

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui, oui... Je suis d'accord mais dans ce cas particulier je n'ai pas le temps de trouver mieux.

    Bon ciné.
    A bientôt. Gilles

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    après le OnShow, c'est OnActivate : http://www.phidels.com/php/index.php...ion.htm&id=170
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    pour lancer une évènement après affichage de tout il m'est arrivé d'ajouter un PostMessage(Handle, WM_USER, 0, 0) dans le OnCreate et de placer le traitement sur une procédure sur le message WM_USER.

    En effet, le message étant placé en fin de pile, il est traité après tout le reste.

    Maintenant l'idée du Thread n'est pas mauvaise, la fenêtre a beau ne faire qu'un téléchargement FTP, si tu veux qu'elle réagisse à la souris il ne faut pas qu'elle soit bloquée sur le traitement FTP...sinon elle est visible à l'écran mais ne répond plus au système.

    pour cela j'utilise cette technique.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Merci pour toutes vos réponses :

    Citation Envoyé par tourlourou Voir le message
    après le OnShow, c'est OnActivate : http://www.phidels.com/php/index.php...ion.htm&id=170
    Oui mais...
    Citation Envoyé par selzig Voir le message
    La séquence de procédure d'affichage d'une Form vide semble être : Resize - Show - Active - Paint.

    Le Active est tentant mais en ce qui me concerne l'affichage n'est pas complet, ni d'ailleurs le traitement du fond de la Form avec le Paint qui m'a amené à placer un TStaticText (alClient)... Ce qui me laisse supposer qu'il n'y a pas d'indicateur que le Show est terminé...
    Citation Envoyé par Paul TOTH Voir le message
    pour lancer une évènement après affichage de tout il m'est arrivé d'ajouter un PostMessage(Handle, WM_USER, 0, 0) dans le OnCreate et de placer le traitement sur une procédure sur le message WM_USER.

    En effet, le message étant placé en fin de pile, il est traité après tout le reste.
    Oui, mais pas compatible Nux.

    Citation Envoyé par Paul TOTH Voir le message
    Maintenant l'idée du Thread n'est pas mauvaise, la fenêtre a beau ne faire qu'un téléchargement FTP, si tu veux qu'elle réagisse à la souris il ne faut pas qu'elle soit bloquée sur le traitement FTP...sinon elle est visible à l'écran mais ne répond plus au système.
    Oui je procède comme cela habituellement quand j'ai du temps... mais le problème devenait trop ardu pour le temps dont je disposais aujourd'hui.

    Mon bricolage suffira pour l'instant... mais la question est intéressante et reste posée... J'attends les prochaines vacances pour me repencher sur le problème.

    Cordialement. Gilles
    Dernière modification par Invité ; 13/06/2011 à 09h24. Motif: Orthographe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage dans une forme
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 3
    Dernier message: 22/09/2006, 17h03
  2. Question sur l'affichage d'une form dynamique?
    Par Jayceblaster dans le forum Delphi
    Réponses: 1
    Dernier message: 18/09/2006, 14h36
  3. Réponses: 2
    Dernier message: 28/06/2006, 16h50
  4. Affichage d'une forme transparente
    Par cedekasme dans le forum MFC
    Réponses: 5
    Dernier message: 11/01/2006, 15h44
  5. Evénement après l'affichage d'une Form
    Par nikhil dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/06/2005, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo