Bonjour,
Je me casse les dents sur un problème ardu depuis une semaine sans avoir une bonne solution, et surtout sans comprendre le pourquoi du comment et le fonctionnement de ProcessMessages.
Mon problème :
J'affiche une trajectoire qui évolue constamment et que je calcule en même temps. Cela provoquait un scintillement très désagréable que j'ai résolu en utilisant un TCustomControl pour le doublebuffered (curieusement absent de TCustomGraphic ...) et en découpant mon image en petits bouts (grille d'images).
Le problème maintenant est que seules les images modifiées généralement sont remises à jour.
Précisions :
- le seul cas où cela n'a pas lieu est lorsque je crée les images en même temps que le formulaire, mais pour diverses raisons je souhaite les créer à l'appel de la routine qui affiche la trajectoire
- j'utilise application.ProcessMessages après la modification des images, ce qui semble bien les mettre à jour
- ProcessMessages n'a aucun effet en l'utilisant après la création de la grille d'images dans la routine. En fait, elles apparaissent en flash, disparaissent, et éventuellement réappariassent une fois la routien finie !
- suite à la lecture de http://users.telenet.be/sonal.nv/ics...ocessMessage03 il apparait qu'il ne faut pas utiliser ProcessMessages mais plutôt la méthode Update des contrôles. Après essai, cela fonctionne en effet : toutes les images s'affichent immédiatement. Il reste juste un léger problème ; le bouton permettant d'arrêter la routine n'est plus accessible puisqu'apparemment l'application ne traite plus automatiquement les messages ...
- en rajoutant de temps en temps un seul ProcessMessages, l'accès au bouton revient, ce qui a pour effet immédiat ... d'effacer toutes les images qui ne sont pas modifiées !!!
- puisqu'il semble y avoir un soucis entre le flux normal du programme, les évênements, les messages et leur traitement, j'ai essayé de lancer la longue routine via un chronomètre lui-même activer par le bouton, en espérant pouvoir ainsi libérer le bouton.. Résultat : à nouveau une fois lancée la routine ne peut plus être stoppée, le bouton étant inaccessible, et si on rend la main par un ProcessMessages, les images disaparaissent.
Mes questions :
- lorsqu'on crée un contrôle dans une routine, comment être sûr qu'il sera bien intégré au formulaire, donc mis à jour quand il faut ?
- à quoi sert réellement ProcessMessages vu que dans le lien il semble bien qu'on n'ait pas le droit de l'utiliser
- comment "bien concevoir" un programme dans le sens des interruptions et autres évênements "automatiquement" gérés par l'application ?
- existe-t-il un manuel détaillés des objets en particulier des contrôles, pour freepascal ?
- existe-t-il une alternative à ProcessMessages pour lire et traiter les évênements claviers et souris ?
- comment éviter le problème du scintillement d'images remise à jour fréquemment sans avoir à les découper en morceaux, cela de façon fiable, simple, etc. ?
Ah, j'oubliais. Selon que j'utilise ProcessMessages, TFrom.Update, ou d'autres méthodes pour garder toutes l'image sans que le clic ne soit pris en compte, il m'arrive même de ne pouvoir stopper le programme qu'en le tuant brutalement (Ctrl-F2 étant inopérationnel ...) !
PS : il arrive que tous les boutons du formulaire passent manifestement en état "disabled" (écriture grisée) sans que cela ne soit programmé, auquel cas l'arrêt de la routine est très simple : cliquer sur un autre programme ; pourquoi donc sortiir la souris de dessus le bouton fait comme si j'avais cliqué dessus (sachant que ce bouton active et désactive alternativement un booléen pour arréter la routine) ?
Voilà, j'attends votre aide pour résoudre tous ces mystères de freepascal.
Partager