1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 54
    Points : 49
    Points
    49

    Par défaut Problème pour l'ordre d'affichage en z des contrôles sur un formulaire

    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
    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.
    (en espérant que l'affichage soit correct vu que Lazarus ne fait que planter à l'enregistrement et que je ne peux pas tester).

    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é.
    Nom : copie ecran form.png
Affichages : 102
Taille : 8,6 Ko

    Pourquoi la superposition ne s'effectue pas correctement entre les TLabel et les TCustomControl ? Comment palier cela ?

    Merci.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Retraité
    Inscrit en
    juin 2012
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : juin 2012
    Messages : 702
    Points : 1 300
    Points
    1 300

    Par défaut

    Pourquoi la superposition ne s'effectue pas correctement entre les TLabel et les TCustomControl ? Comment palier cela ?
    Ce n'est qu'une supposition mais comme les fiches les panels sont faits pour contenir des composants ( Un peu comme avoir une fiche à l'intérieur d'une fiche ). Comme les labels appartiennent à la fiche le résultat est normal.
    Pour régler le problème tes labels devraient être dans un panel dédié dont la taille devra s'adapter à celle du label.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    septembre 2003
    Messages
    653
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2003
    Messages : 653
    Points : 1 431
    Points
    1 431
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    Les méthodes SendToBack et BringToFront, fonctionnent, ou du moins ont un effet visuel, uniquement avec les composants descendants de la classe TWincontrol.
    Les panels (Panel1, Panel2, et Panel3) de type TPanel sont bien des TWincontrol donc OK. En revanche les labels (label1 et label2) de type TLabel sont des descendants de la classe TGraphicControl, ils ne sont pas des TWincontrol. Voilà ce qui explique pourquoi, cela ne fonctionne pas.

    Une solution à ton problème consiste simplement à remplacer les label (label1 et label2) de type TLabel par des TStaticText. En effet, les composants visuels TStaticText contrairement aux TLabel, sont bien des descendants de la classe TWincontrol. Tu trouveras les composants visuels TStaticText sur la palette des composants "Additionnel" située juste à côté, à droite de la palette "Standard".

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 54
    Points : 49
    Points
    49

    Par défaut

    @mm_71, j'ai pris ici des TPanel juste pour la facilité de création de l'exemple, dans mon code d'origine c'était une classe conçue sur un TCustomControl, qu'un TPanel a en commun.

    @hmira, je viens de tester sur un formulaire (toujours pas à l'exécution, Lazarus plante toujours) et cette fois je parvient à obtenir ce que je veux. C'est donc ça, merci.

    Par contre c'est très surprenant car le TLabel possède bien cette méthode donc a priori, sans aller chercher je ne sais où l'info, ça devrait être actif, ou non disponible si la méthode n'était définie que sur le TWinControl.

    Ça prête vraiment à confusion et peut faire perdre temps, voire pire quand on se retrouve face à une telle erreur.


    Manifestement ces méthodes sont définies sur les TControl : http://lazarus-ccr.sourceforge.net/d.../tcontrol.html On lit sur cette référence qu'il y a une notion de pair, ou hérédité similaire. (sibling)


    Merci à tous les deux. Je clos le sujet.

  5. #5
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    février 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : février 2014
    Messages : 428
    Points : 1 876
    Points
    1 876

    Par défaut

    Bonsoir.

    Citation Envoyé par FlorentA Voir le message
    Par contre c'est très surprenant car le TLabel possède bien cette méthode donc a priori, sans aller chercher je ne sais où l'info, ça devrait être actif, ou non disponible si la méthode n'était définie que sur le TWinControl.
    Si, BringToFront et SendToBack sont efficients pour les TLabel et autres descendants de TGraphicControl (TImage...), mais seulement entre eux et à condition évidemment d'avoir le même parent.
    Tu peux, p.ex, "remonter" un TImage sur un TLabel, ou inversément.
    A la différence des TWinControl (TForm,TPanel, TEdit...) qui sont des composants "fenêtrés", les TGraphicControl n'ont pas de handle de fenêtre, ils se dessinent sur le Canvas de leur parent, d'où impossible p.ex. de mettre au premier plan un TLabel (parent: la fiche) sur un TPanel.

    Cordialement
    Thierry

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour modifier ordre des champs d'une ligne
    Par zram29 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2010, 13h05
  2. Problème pour définir une valeur dans la base des registres
    Par hellspawn_ludo dans le forum Dreamshield
    Réponses: 2
    Dernier message: 30/09/2007, 03h03
  3. Réponses: 1
    Dernier message: 27/08/2007, 09h02
  4. ordre d'affichage des données sur un formulaire
    Par puppusse79 dans le forum Access
    Réponses: 5
    Dernier message: 20/09/2006, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo