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

Delphi Discussion :

[Interface utilisateurs] Effet visuel non immédiat


Sujet :

Delphi

  1. #1
    Membre actif Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Points : 222
    Points
    222
    Par défaut [Interface utilisateurs] Effet visuel non immédiat
    Hello

    J'ai un problème avec mes composants visuels de mon application.

    Je travaille avec des TEdit et TStatusBar entre autres, et lorsque je fais une modification de ceux-ci, je ne vois pas directement le résultat. Je doit attendre une réponse TCP pour que les changements aient lieu.

    Un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      EdCommandRetour.Text := '';
      EdMotorCommandRetour.Text := '';
      EdTurretCommandRetour.Text := '';
      StatusBar.Panels[3].Text := 'Envoie...';
    ...
      try
        TCPClient.WriteBuffer(WriteBuffer, TRAME_LENGTH);
        StatusBar.Panels[3].Text := 'Envoie...OK!';
      except
      ...
      {Ensuite, réception}
    Ce n'est qu'une fois la réception de la réponse via TCP que mes champs textes sont effacés ...

    Une idée du pourquoi cela n'est pas fait instantanément ...

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 682
    Points : 7 121
    Points
    7 121
    Par défaut
    Ajoute un Application.ProcessMessages; après avoir modifié tes Edit et ton StatusBar.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 724
    Points : 25 623
    Points
    25 623
    Par défaut
    C'est simple, le traitement du message WM_PAINT ne doit pas être géré, il suffit de rajouter des Applications.ProcessMessages (à banir si c'est un thread, de toute façon, manipuler une form depuis un Thread sans synchronize, sectioncritique, ... est à bannir en règle général)

    il semble logique que WriteBuffer (TIdTCPClient ?) lance des écoutes des messages ... si l'on étudie le code ... on tombe sur AntiFreeze ...

    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
    {$IFDEF MSWINDOWS}
    procedure TIdAntiFreeze.Process;
    var
      Msg: TMsg;
    begin
      if ApplicationHasPriority then begin
        Application.ProcessMessages;
      end else begin
        // This guarantees it will not ever call Application.Idle
        if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin
          Application.HandleMessage;
        end;
      end;
    end;
    {$ENDIF}
    Je n'ai jamais utilisé les compos indy en Thread mais ceux de D6 (ScktComp) ou D7 (Sockets) ... ça passe bien ? avec ce application.process ?
    Edit : C'est bon, j'ai ma réponse, ce compo n'est utilisé que dans le Thread Main sinon il sort ... dans toujours pas de application.processmessages dans un thread, ça confirme mes observations ...

    par contre, femtosa, en as tu posé un sur ta forme ? car il semble que cela doit être volontaire ... car normalement ça devrait bloqué sur le message, en le rafraichissement des labels serait effectué qu'à la sortie de la fonction d'Ecriture\Lecture ... et non pas la "réception" comme tu le décrivais dans ton post ...

  4. #4
    Membre actif Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Points : 222
    Points
    222
    Par défaut
    Tip top, avec l'ajout de 'Application.ProcessMessages;' ça marche nickel !

    Citation Envoyé par ShaiLeTroll
    par contre, femtosa, en as tu posé un sur ta forme ? car il semble que cela doit être volontaire ... car normalement ça devrait bloqué sur le message, en le rafraichissement des labels serait effectué qu'à la sortie de la fonction d'Ecriture\Lecture ... et non pas la "réception" comme tu le décrivais dans ton post ...
    Un quoi, un composant Indy ... ? J'utilise le TidTCPClient ... (ainsi que le TFtpClient de François Piette ...)

    Oui donc en fait, je ne sais pas exactement quand le rafraichissement avait lieu, mais mon code était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure MonProjet.BtSendCommandClick(Sender: TObject);
    begin
      if(TCPClient.Connected) then
      begin
        SendCommand(CBCommands.ItemIndex + 1, 'C');
        ReceiveCommand()
      end
      else MessageDlg('Mon message d''erreur', mtInformation, [mbOk], 0);
    end;
    L'effacement de mes TEdit était la première instruction de 'SendCommand()' et le rafraichissement n'était réalisé qu'une fois la commande reçue en retour (à quel moment exactement j'en sais trop rien, c'est peut-être à la fin de la méthode Click ... Ca va trop vite )

    Mais c'est ok maintenant !

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 682
    Points : 7 121
    Points
    7 121
    Par défaut
    Si ton problème est résolu, n'oublie pas de cliquer sur

  6. #6
    Membre actif Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par Lung
    Si ton problème est résolu, n'oublie pas de cliquer sur
    Et moi qui fait le commentaire aux autres quand ils ne le font pas ...

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

Discussions similaires

  1. Aspect interface utilisateur
    Par free07 dans le forum Composants VCL
    Réponses: 14
    Dernier message: 13/09/2005, 14h13
  2. Effet visuel de Contenu dynamique
    Par kolib dans le forum ASP
    Réponses: 7
    Dernier message: 12/09/2005, 09h37
  3. Effet secondaire non désiré de "float"
    Par davcha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 21/06/2005, 18h33
  4. Réponses: 2
    Dernier message: 31/10/2003, 17h32
  5. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 13h27

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