Je suis sous W11 avec Delphi 6 Personal Edition.
Je travaille sur un contrôle composé contenant un TPicture et un TPanel.
Je veux charger un fichier BMP dans le TPicture, puis afficher l'image dans le canvas du TPanel.
Le chargement du fichier par LoadFromFile ne pose pas de problème.
J'utilise une version dérivée de TPanel afin d'avoir accès à la méthode Paint du panel.
Là, j'utilise CopyRect sur ce canvas pour y déposer la bitmap chargée dans le TPicture.
La difficulté est de savoir QUAND l'opération de chargement du fichier est terminée et la bitmap est disponible pour la méthode Canvas.CopyRect sur le panel.
Si je fais un délai de 500 ms entre le LoadFromFile et le CopyRect, l'image s'affiche sans problème.
Sans ce délai, l'image ne s'affiche pas - manifestement, la bitmap n'est pas encore disponible.
J'ai utilisé l'évènement OnChange du TPicture dans lequel j'appelle la méthode Paint du panel dérivé, dans laquelle je fais le CopyRect sur le canvas.
L'évènement se déclenche bien, mais apparemment, il se déclenche dès que le LoadFromFile commence au lieu de se déclencher lorsque l'opération est terminée.
Et donc, même dans ce cas, la bitmap n'est pas disponible.
Question: comment savoir quand l'opération LoadFromFile est terminée ?
A tout hasard, voici les parties significatives du code:
J'affiche bien l'image si j'active la ligne **1.
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 type TKPicture = class private fOwner: TComponent; fPicture: TPicture; fPanel: TKPanel; fTag: integer; procedure PictureChanged(Sender: TObject); published constructor CreateNew(aOwner: TComponent; aDest: HWND); destructor Destroy; override; property Tag: integer read fTag write fTag; property Owner: TComponent read fOwner write fOwner; procedure Localize(aX, aY, aW, aH: integer); procedure LoadPicture(aFile: string); end; constructor TKPicture.CreateNew(aOwner: TComponent; aDest: HWND); begin inherited; Owner := aOwner; Tag := 0; fOwner := aOwner; fPicture := TPicture.Create; fPicture.OnChange := PictureChanged; fPanel := TKPanel.Create(aOwner); fPanel.Tag := integer(self); fPanel.ParentWindow := aDest; end; destructor TKPicture.Destroy; begin Tag := 0; fPanel.Free; fPicture.Free; inherited; end; procedure TKPicture.Localize(aX, aY, aW, aH: integer); begin fPanel.Left := aX; fPanel.Top := aY; fPanel.Width := aW; fPanel.Height := aH; end; procedure Delay(Milliseconds: Integer); {by Hagen Reddmann} var Tick: DWORD; Event: THandle; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWORD(Milliseconds); while (Milliseconds>0) and (MsgWaitForMultipleObjects(1,Event,False,Milliseconds,QS_ALLINPUT)<>WAIT_TIMEOUT) do begin Application.ProcessMessages; Milliseconds := Tick - GetTickCount; end; finally CloseHandle(Event); end; end; procedure TKPicture.LoadPicture(aFile: string); begin fPicture.LoadFromFile(aFile); // Delay(500); // **1 avec ce délai, l'image s'affiche lors de l'évènement PictureChanged // fPanel.Paint; // **2 et même sans déclarer l'écènement PictureChanged, le Paint ici affiche l'image di le délai a été fait end; procedure TKPicture.PictureChanged(Sender: TObject); begin fPanel.Paint; end;
En l'état, l'image ne s'affiche pas, malgré le déclenchement de PictureChanged.
J'aimerais bien pouvoir me passer de cette procédure Delay et faire mon Paint au moment opportun.
Comment savoir si la bitmap du TPicture est prête ?
En fait, la question se résume à ceci: comment être averti que l'opération LoadFromFile est terminée ?






Répondre avec citation












Partager