Bonjour et meilleurs vœux.
Lors qu'un récent projet j'ai rencontré une difficulté que je n'imaginais pas possible et je n'ai ni trouvé de solution, ni n'en ai compris l'origine.
J'avais besoin de mettre côte à côte des TCustolControl que j'ai conçus et des TLabel qui leur servaient d'étiquette. Or je me suis aperçu que l'ordre de superposition des composants à l'écran dépendait de la nature du composant, les TCustomControl prenant le pas sur les TLabel (car des TGraphicControl ?) faisant que même placés en arrière-plan, les TCustomControl restaient visible par dessus les TLabel en avant-plan !
Très ennuyeux puisque je devais pouvoir placer les étiquette par dessus les contrôles parfois (chaque contrôle étant un élément graphique de forme non rectangulaire, l'étiquette doit pouvoir être placée au plus près du dessin donc sur le rectangle de base du TCustomControl ; ce qui pose d'ailleurs une autre question que je poserai plus tard).
Voici un exemple
(en espérant que l'affichage soit correct vu que Lazarus ne fait que planter à l'enregistrement et que je ne peux pas tester).
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 unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TForm1 } TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; procedure FormShow(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormShow(Sender: TObject); begin Label1.left:=0; Label1.top:=50; Label1.width:=300; Label2.left:=50; Label2.top:=0; Label2.height:=300; Label2.width:=60; Panel1.left:=70; Panel1.top:=30; Panel1.height:=150; Panel1.width:=170; Panel2.left:=90; Panel2.top:=130; Panel2.width:=100; Panel3.left:=150; Panel3.top:=110; Panel3.height:=50; Panel3.width:=70; Label1.Color:=clOlive; Label2.Color:=clLime; Panel1.Color:=clAqua; Panel2.Color:=clCream; { ordre de superposition : P1, P2, P3, L1, L2 } Panel3.SendToBack; Panel2.SendToBack; Panel1.SendToBack; Label1.BringToFront; Label2.BringToFront; end; end.
Je joins une copie d'écran du formulaire que j'obtiens ; on voit bien que les Panel restent devant les Label alors qu'ils devraient être au fond, et que dans chaque catégorie l'ordre de superposition est respecté.
Pourquoi la superposition ne s'effectue pas correctement entre les TLabel et les TCustomControl ? Comment palier cela ?
Merci.
Partager