Bug timage avec delphi 6 : scintillement

Soyez le premier à donner votre avis sur cette source.

Vue 6 796 fois - Téléchargée 320 fois

Description

Dans delphi 6, il apparait un bug dans la gestion des Timage. Le Timage fait un refresh beaucoup trop souvent, ce qui donne une impression de scintillement (par exemple lorsqu'on fait une sélection dans l'image...)
Précision : ce bug n'existe pas dans delphi 5.

La Solution : Corriger la VCL de delphi 6 : ( Correction donnée par George Pistikos )
--------------
Corriger '\Delphi6\Source\Vcl\ExtCtrls.pas' de cette façon
(Article de Georges Pistikos traduit en français)

Voici le listing de 'TImage.PictureChanged' dans la vcl de delphi 6 (Delphi6\Source\Vcl\ExtCtrls.pas)

procedure TImage.PictureChanged(Sender: TObject);
var
G: TGraphic;
begin
if AutoSize and (Picture.Width > 0) and (Picture.Height > 0) then
SetBounds(Left, Top, Picture.Width, Picture.Height);
G := Picture.Graphic;
if G <> nil then
begin
if not ((G is TMetaFile) or (G is TIcon)) then
G.Transparent := FTransparent;

if (not G.Transparent) and Stretch and not Proportional then // changer cette ligne de code !!!

ControlStyle := ControlStyle + [csOpaque]
else // picture might not cover entire clientrect
ControlStyle := ControlStyle - [csOpaque];
if DoPaletteChange and FDrawing then Update;
end
else ControlStyle := ControlStyle - [csOpaque];
if not FDrawing then Invalidate;
end;

La condition IF doit être changée ainsi :

if (not G.Transparent) and (Stretch or ((G.Width >= Width) and (G.Height >= Height))) and not Proportional then

Cela ajoute à la condition que SI le bitmap couvre la Timage alors le ControlStyle
est mis à csOpaque et donc le background n'est pas redessiné à chaque fois que l'Image change. (comprendu ?)

George Pistikos

Anadelta Software
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Après avoir modifié 'ExtCtrls.pas',
- renommez '\Delphi6\Lib\ExtCtrls.dcu' en 'ExtCtrls.dcu_'
- copier '\Delphi6\Source\Vcl\ExtCtrls.pas' dans le dossier '\Delphi6\Lib\'

Lorsque vous recompilerez un programme, ExtCtrls.dcu sera recréé.

Je l'ai testé : ça fonctionne parfaitement !

Conclusion :


Correction trouvée par George Pistikos. Merci !

----------

MAJ faite le 28/01/2003 : ajout d'une archive contenant : ExtCtrls.pas (modifié) et ExtCtrls.dcu (près à l'emploi).

Retesté : ça fonctionne parfaitement.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
A la limite en me servant de ce que tu explique ici ...
Je pourrais faire comme si mon TImage était le composant que je cherche, càd gérer moi même les raffraichissements...

Et puis au moment de la compilation je vais trafiquer 'ExtCtrls.pas'...
Histoire que la condition qu'il test soit forcément fausse ...
Vive les manip's ! :)
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
Hum ...
Kkun aurait-il un composant équivalent au TImage classique MAIS avec un raffraichissement manuel... Autrement dit avec lequel on serait obligé de se taper tout les Repaint !

P'tête qu'en me les tapant tous je passerais à 10 % d'utilisation du processeur au lieu des 100% actuel.
Je raffraichit à une fréquence assez importante (ca peut aller jusqu'a 1000 fois par seconde dans le pire des cas )

Etant donné que je dessine pixel par pixel et que le composant veut remettre à jour le canvas immédiatement après que ce dernier ait changé ...
En gros si je dessine un trait de 100 pixels il raffraichit 100 fois avec tout ce que ca inclut derriere (Buffer , copie de bitmap...)
D'ou mon interêt pour un composant "personalisé"...
L'utilisateur n'a pas besoin de voir chaque point apparaitre (le PC pense que Si !)
Moi je ne ferai qu'un Repaint par exemple ...

Voili Voilou ...
J'espère que ce message ne contribuera pas qu'a encombrer ce site... (Traduction : J'espère une réponse)
sebastienbro
Messages postés
246
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
5 août 2004
-
arf, c cool ça, mé le probleme, c ke g delphi6 personnel, et ke g po les sources ! tu pourrai po m 'envoyer le fichier DCU créé stp ?
voila mon mail : sebastienbro@aol.com
Merci d'avance !
dindenoel
Messages postés
2
Date d'inscription
vendredi 2 août 2002
Statut
Membre
Dernière intervention
17 septembre 2002
-
Salut leyeti ! dis moi, saurais-tu imprimer un bitmap dans des proportions differentes que celle de l'image ?

Merci, Dindenoel !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.