Bonsoir,
Ce matin j'ai crû devenir fou : pas moyen de positionner correctement un bête TButton dans un bête TPanel, les deux objets (et leurs containers) étant créés dynamiquement.
J'arrivais à positionner correctement horizontalement, mais verticalement, bernique et va te rouler !
À tel point que j'ai pondu cette petite maquette toute simple (3 TPanels, 1 TButton et qq lignes de code) et regardez le résultat :
1) le pnl1 bleu ciel est deux fois plus large mais ça ne se voit pas car il héberge le pnl2 vert clair qui est en mode alRight et dont la largeur est définie à la moitié de son parent.
2) on notera le texte au milieu du pnl2 en se souvenant qu'il est alRight et "hébergé" par le pnl1 dont on peut lire sa hauteur juste à gauche.
3) le TButton gris clair a son Left défini à la moitié de la largeur de son parent, le pnl2, et c'est bien ce qu'on voit. Si j'agrandis beaucoup le pnl2 (Width := Parent.Width div 5 * 4;), le TButton se déplace horizontalement en conséquence, r.à.s.
Par contre le Top c'est la catastrophe car je l'ai défini de la même manière, soit la moitié de la hauteur de son parent, et donc le bouton devrait être sur le texte...
Et à force de faire des ShowMessage et autres qui me montraient toujours 25, il m'est revenu en mémoire qu'un TPanel quand on le pose sur une fiche et qu'on ne lui définit rien, il arrive avec des valeurs par défaut et si je me souviens bien, sa hauteur est à... 50 ! Hé ouais !
Regardez le pnl3 en haut à gauche, où seulement le left et le top sont définis, les deux autres valeurs sont par défaut et bingo !, la hauteur est bien à 50.
Donc sur ce coup-là Lazarus prend en compte la largeur mais pas la hauteur, question : comment faire pour contourner ce bug ?
Parce qu'avant de poster ça, j'ai quand même un peu farfouillé dans ExtCtrls.pp et Controls.pp à la recherche de '50' sans rien trouver...
Je suis un peu désemparé, là.
PS : j'ai écrit "dimensions d'un TPanel" dans le titre et là je parle d'un TButton : je pense que le problème est dans le TPanel et le TButton n'est là que comme faire-valoir, si je puis dire.
Ah, le code :
Merci pour vos retours,
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 var pnl1, pnl2, pnl3: TPanel; btn1: TButton; begin pnl1 := TPanel.Create(MainForm); with pnl1 do begin Parent := pnlCentre; // pour ce test je détourne un projet en cours SetBounds(20, 30, 400, 250); Alignment := taLeftJustify; Caption := ' pnl1 (host du pnl2), height = ' + IntToStr(pnl1.Height); Color := clSkyBlue; end; pnl2 := TPanel.Create(MainForm); with pnl2 do begin Parent := pnl1; Align := alRight; Width := Parent.Width div 2; Color := clMoneyGreen; end; btn1:= TButton.Create(MainForm); with btn1 do begin Parent:= pnl2; SetBounds(Parent.ClientWidth div 2, Parent.ClientHeight div 2, 60, 17); Caption := IntToStr(btn1.Top); end; pnl2.Caption := 'Height of pnl2 = ' + IntToStr(pnl2.Height); pnl3 := TPanel.Create(MainForm); with pnl3 do begin Parent := pnlCentre; Left := 10; Top := 20; Wordwrap := True; Caption := 'pnl3, left à 10 et top à 20, et les autres prop. par défaut, ' +'résultats : L'+IntToStr(Left)+' T'+IntToStr(Top)+' W'+IntToStr(Width)+' H'+IntToStr(Height); Color := clCream; end;
Partager