Déplacer un Label sur un Panel [Résolu]

Aklissj5 - 4 sept. 2012 à 21:07 - Dernière réponse :  Aklissj5
- 5 sept. 2012 à 22:35
Bonsoir les amis

Je n'arrive pas à déplacer un Label sur un Panel Si si c'est bien le cas ... en sachant que la création du label fut antérieur a celle du Panel, comment doit-je procéder ? (Je peux évidement recréer le label en question et le repositionner au dessus du Panel, mais comme y en a beaucoup sur mon projet je préférerais trouver une solution beaucoup moins invasive ...)


Merci :)
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
fbalien 265 Messages postés dimanche 7 décembre 2003Date d'inscription 11 novembre 2016 Dernière intervention - 5 sept. 2012 à 08:21
3
Merci
Bonjour

une petite methode rapide
1 vous selectionnez vos labels
2 Vous coupez (ctrl + X)
3 vous sélectionnez le panel
4 vous collez (ctrl + V)
5 il n'y a plus qu'a réorganiser

A+

Merci fbalien 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de fbalien
0
Merci
J'ai utilisé un shape à la place (tout aussi utile)

La question précédente tiens toujours
Commenter la réponse de Aklissj5
dubois77 692 Messages postés jeudi 17 avril 2008Date d'inscription 14 septembre 2018 Dernière intervention - 5 sept. 2012 à 08:02
0
Merci
Salut
tu peux essayer par programmation dans form1Create :
label1.parent := panel1;

Dubois77
Commenter la réponse de dubois77
beckerich 308 Messages postés jeudi 29 septembre 2005Date d'inscription 17 septembre 2013 Dernière intervention - 5 sept. 2012 à 08:05
0
Merci
bonjour,

si tu travailles avec delphi xe et supérieur, tu peux modifier le parent d'un composant visuellement en le déplaçant dans la fenêtre structure (maj+alt+f11) ; sinon, il faut ouvrir le fichier .dfm de ta form et le modifier manuellement. attention, ça peut être délicat. Mieux vaut modifier composant par composant si tu n'est pas certain de ce que tu fais : clic droit sur ta fiche, voir comme texte, modifier, clic droit, voir comme fiche.

ex : un tbutton ayant comme parent un tpanel

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 281
  ClientWidth = 305
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 120
  TextHeight = 16
  object Panel1: TPanel
    Left = 24
    Top = 32
    Width = 257
    Height = 177
    Caption = 'Panel1'
    TabOrder = 0
    object Button1: TButton
      Left = 88
      Top = 80
      Width = 75
      Height = 25
      Caption = 'Button1'
      TabOrder = 0
    end
  end
end


pour que le parent du button1 soit form1 :
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 281
  ClientWidth = 305
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 120
  TextHeight = 16
  object Panel1: TPanel
    Left = 24
    Top = 32
    Width = 257
    Height = 177
    Caption = 'Panel1'
    TabOrder = 0
  end
  object Button1: TButton
    Left = 88
    Top = 80
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
end
Commenter la réponse de beckerich
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 5 sept. 2012 à 13:17
0
Merci
'jour,

"J'ai utilisé un shape à la place"
A la place du TPanel, tu veux dire ?
Un TPanel ne descend pas de TWinControl et ne peut être Parent d'un autre composant.

Pour en revenir au TPanel...
L'idée de Dubois est intéressante, mais si tu as plus de 200 Label, tu vas un peu galérer.
Sinon, si le Panel occupe exactement l'emplacement du Form et fait la même dimension, j'opterais plutôt pour la solution de fbalien.

Sinon, avec un Panel reprenant les dimensions du Form, tu peux utiliser ce code dans OnCreate du Form :

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  FoundLeftPos, FoundTopPos: Integer;
begin
  with Form1 do
  begin
    for i := 0 to ComponentCount - 1 do
    begin
      if Components[i] is TLabel then
      begin
        with TLabel(Components[i]) do
        begin
          FoundLeftPos := Left;
          FoundTopPos := Top;
          Parent := Shape1;
          Left := FoundLeftPos;
          Top := FoundTopPos;
        end;
      end;
    end;
  end;
end;


Les Labels se retrouvent ainsi dans le Panel au même emplacement qu'ils occupaient originellement dans le Form.
Commenter la réponse de korgis
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 5 sept. 2012 à 21:18
0
Merci
Correction de mon code précédent.

En fait, il vaut mieux lister directement les controls possédés par le Form :

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  FoundLeftPos, FoundTopPos: Integer;
begin
  for i := ControlCount - 1 downto 0 do   // <- attention au sens !
    if Controls[i] is TLabel then
      with Controls[i] do
      begin
        FoundLeftPos := Left;
        FoundTopPos := Top;
        Parent := Panel1;
        Left := FoundLeftPos;
        Top := FoundTopPos;
      end;
end;


C'est plus zouli.
Commenter la réponse de korgis
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 5 sept. 2012 à 21:44
0
Merci
On peut aussi écrire une procedure plus souple d'emploi.
Cette procedure repositionne également les Controls dans le cas où le nouveau Parent n'a pas les mêmes dimensions que le précédent.

type
  TControlClass = class of TControl;

procedure ModifyParentAndAlign(OldParent, NewParent: TWinControl; TypeOfClass: TControlClass);
var
  i: Integer;
  FoundLeftPos, FoundTopPos: Integer;
begin
  with OldParent do
    for i := ControlCount - 1 downto 0 do   // <- ControlCount diminue !
      if Controls[i] is TypeOfClass then
        with Controls[i] do
        begin
          FoundLeftPos := Left;
          FoundTopPos := Top;
          Parent := NewParent;
          Left := Trunc(FoundLeftPos * (NewParent.Width / OldParent.Width));
          Top := Trunc(FoundTopPos *(NewParent.Height / OldParent.Height));
        end;
end;


On peu s'amuser comme un fou (enfin, je parle pour moi) en testant ainsi :
- 1 Panel déposé sur le Form, de dimension inférieure (exprès, pour le test...)
- quelques Labels dispersés de-ci de-là un peu n'importe où sur le Form (qui est donc leur Papa... heu leur 'Parent',
- 1 Button,
- 1 Button (ça en fait 2 au total).

Et on remplit les évènement OnClick avec le code :

procedure TForm1.Button1Click(Sender: TObject);
begin
  ModifyParentAndAlign(Form1, Panel1, TLabel);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ModifyParentAndAlign(Panel1, Form1, TLabel);
end;


Voilà. On clique alternativement sur l'un, puis sur l'autre. Ca distrait un moment...

On peut bien sûr varier les plaisirs en introduisant d'autres Controls sur la Fiche et en filtrant différemment, ou passer plusieurs Controls de type différent dans une procedure modifiée utilisant un array of TControlClass...

Avec Delphi, tout devient possible...
Commenter la réponse de korgis
0
Merci
Merci pour vos réponses

La solution qui conviens le plus au grand feneant que je suis est sans doutes celle de fbalien lol

Mais en grand curieux également j'ai aussi testé les méthodes évoquées par dubois et beckerich.
Kogris ton code est également très intéressant (je me perd un peu avec les "controls" il faut dire que je n'ai pas beaucoup eu l'occasion de m'interesser au propriétés du TPanel lol ça viendras )petit blem par contre quand je l'ai testé le label n'apparaît pas à l’exécution , et oui j'ai bien utilisé un shape à la place du panel, cela devais juste servir de toile de fond pour un certain nombre de labels (un peu comme un écran), je me rend compte que j'aurais du avoir l'idée d'utiliser un chape dès le départ ^^' malgré cela cette petite erreur de choix fut des plus instructive

Un grand merci à vous tous
Commenter la réponse de Aklissj5

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.