Bonjour,
Voilà un plantage qui ne m'est jamais arrivé. Mon application développée avec XE2 plante tout le système (WIN 7). Tout est figé (souris, clavier, écran) il faut forcer l'extinction du PC par le bouton de mise sous tension pour rebooter.
Aucune information n'est présente dans l'observateur d'évènement de windows.
Cela arrive lorsque je redimensionne une fenêtre dans laquelle se trouve une listbox dont j'utilise l'évènement OnDrawItem pour redessiner chaque ligne avec un dégradé de couleur. Le dégradé fait appel à des calculs flottants et utilisent les fonctions moveto et lineto pour dessiner les lignes.
Si je supprime uniquement les calculs flottants: pas de plante.
Si je supprime uniquement les fonction moveto et lineto : pas de plante.
Comment est-il possible de planter le système à ce point ???
Bug du compilateur ?
Merci de votre aide.
Franck
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 procedure GradHorizontal(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ; var X,deltaX : integer; Re,dr,dg,db:real; C1,C2:TColor; r1,r2,g1,g2,b1,b2:Byte; R,G,B:Byte; cnt:integer; begin C1 := FromColor; R1 := GetRValue(C1) ; G1 := GetGValue(C1) ; B1 := GetBValue(C1) ; C2 := ToColor; R2 := GetRValue(C2) ; G2 := GetGValue(C2) ; B2 := GetBValue(C2) ; deltaX := Rect.Right-Rect.Left; if (deltaX<2) then exit; // ==> EXIT HERE if (Rect.Bottom-Rect.top)<2 then exit; // ==> EXIT HERE dr := (R2-R1) / deltaX; dg := (G2-G1) / deltaX; db := (B2-B1) / deltaX; cnt := 0; // for X := Rect.Left to Rect.Right-1 do for X := 0 to 190 do begin R := R1+Ceil(dr*cnt) ; G := G1+Ceil(dg*cnt) ; B := B1+Ceil(db*cnt) ; Canvas.Pen.Color := RGB(R,G,B) ; Canvas.MoveTo(X,Rect.Top) ; Canvas.LineTo(X,Rect.Bottom) ; inc(cnt) ; end; end;
Partager