IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Souci avec les dimensions d'un TPanel créé dynamiquement


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut Souci avec les dimensions d'un TPanel créé dynamiquement
    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 :
    Nom : pb_top_tbutton_v2.png
Affichages : 246
Taille : 9,0 Ko

    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 :
    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;
    Merci pour vos retours,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Cela change-t-il quelque chose d'intervertir l'affectation de la largeur et l'alignement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pnl2 := TPanel.Create(MainForm);
      with pnl2 do begin
        Parent := pnl1;
        Width := Parent.Width div 2;
        Align := alRight;
        Color := clMoneyGreen;
      end;
    Question a priori idiote, mais c'est pour faire avancer le schmilblick
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour Yves,

    Citation Envoyé par tourlourou Voir le message
    Cela change-t-il quelque chose d'intervertir l'affectation de la largeur et l'alignement ?
    oui, ça change des choses de déplacer l'affectation du parent comme expliqué ici où on peut lire qu'il FAUT mettre le parent à la fin de la création de l'objet sauf que des fois on ne peut pas, mais ça fonctionne mieux quand même :
    Nom : conclusion.png
Affichages : 236
Taille : 7,5 Ko

    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
      pnl2 := TPanel.Create(Self);
      with pnl2 do begin
        Align := alRight;
        Width := 160; //Parent.Width div 5 * 4;
        Color := clMoneyGreen;
        Parent := pnl1;
        Height := Parent.Height;
        Caption := 'Height of pnl2 = ' + IntToStr(Height);
      end;
     
      btn1:= TButton.Create(Self);
      with btn1 do begin
        Parent := pnl2;
        SetBounds(Parent.Width div 2, (Parent.Height div 2)+10, 60, 17);
        Caption := 'top @ '+IntToStr(Top);
      end;
    J'ai mis 10 points de plus au Top du button pour pouvoir lire la valeur qu'il masquait, sinon.

    Voilà, bon dimanche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Salut Jean-Pierre,

    Dans ton code de création de Panel2, ayant fixé l'alignement alRight avant le Parent, tu ne devrais plus avoir besoin de spécifier sa hauteur après le Parent.

    Ça fonctionne sous Code Typhon :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Panel1, Panel2: TPanel;
      Button: TButton;
     
    begin
      Panel1 := TPanel.Create(nil);
      with Panel1 do
      begin
        Align := alClient;
        Color := clBlue;
        Caption := 'Panel 1';
        Parent := self;
      end;
     
      Panel2 := TPanel.Create(nil);
      with Panel2 do
      begin
        Align := alRight;
        Color := clGreen;
        Width := Panel1.Width div 2;
        Caption := 'Panel 2';
        Parent := Panel1;
      end;
     
      Button := TButton.Create(nil);
      with Button do
      begin
        Top := Panel2.Height div 2 + 15;
        Color := clRed;
        Caption := 'My Button';
        Parent := Panel2;
        Left := (Panel2.Width - Button.Width) div 2 ;
      end;
     
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Ça fonctionne sous Code Typhon :
    Et pas sous Lazarus...

    Ma seule modif de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      with Panel2 do
      begin
        Align := alRight;
        Color := clGreen;
        Width := Panel1.Width div 2;
    //    Caption := 'Panel 2';
        Caption := Inttostr(Panel2.Width)+' '+Inttostr(Panel2.Height);
        Parent := Panel1;
      end;
    Et le résultat où l'on voit bien que le vert est faux : pas assez large, loin de là !, et la position du bouton en hauteur, au secours ! :
    EDIT : attention, j'ai changé le code pour la caption (rajouté Width, flemme de refaire une copie d'écran) donc il faut lire 85 50, et 85 c'est bien la moitié de 170, la valeur par défaut de la largeur d'un panel (et 50 la hauteur, ce que je disais hier).
    Nom : hauteur-50_largeur-ridicule.png
Affichages : 227
Taille : 3,7 Ko

    Alors chez toi le bouton est sous la caption du panel2, c'est bien ça ?
    Si "oui", c'est quoi la différence entre mon Lazarus foireux et ton CodeTyphon au top ?
    Je suspecte un bug dans SetBounds, avec un code tordu où il y a des verrouillages, des Autosize activés ou pas et je ne sais plus trop quoi d'autre...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    J'ai voulu essayer avec CodeTyphon sous sous Ubuntu (VM) mais ça a planté, BSOD, toussa... avant même d'ouvrir un nouveau projet : MAJ à prévoir ? VM à refaire ?

    Le code est OK avec CodeTyphon 6.9 sous Windows 10 et avec Lazarus 2.0.12 sous PureOS (VM ; gnome 3.30.2)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Mystères de l'informatique : essai OK aussi avec CodeTyphon 6.4 sous sous Ubuntu 18.04 (VM) sans nouveau plantage.

    NB : tous codes pour 64 Bits.

    Dans le lien que tu donnais au sujet de fixer le Parent en dernier, il est également fait mention du SetBounds : affecter Top, Left, etc. fait appel à cette fonction => autant lui passer d'un coup tous les paramètres à modifier. Je ne vois pas que ça puisse jouer, sauf lutin du silicium !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    J'ai voulu essayer avec CodeTyphon sous sous Ubuntu (VM) mais ça a planté, BSOD, toussa... avant même d'ouvrir un nouveau projet : MAJ à prévoir ? VM à refaire ?
    Bien malin qui saurait le dire !
    Quand on voit comment les utilisateur des procs AMD ont été traités le week-end dernier par Debian et leurs mises à jour foireuses suivies par des patches à la one-again, moi je tremble...

    D'ailleurs, comme je dis souvent, au plus ça va au plus c'est compliqué et au moins il y a de compétences pour gérer les soucis : ça va bien finir par nous exploser à la figure, pour rester poli.

    T'as vu le coup de l'arrondi du double avec Jlmat et son récent post ? Plus qu'à tirer l'échelle et ouvrir un camion à frites, je crois...

    Citation Envoyé par tourlourou Voir le message
    Le code est OK avec CodeTyphon 6.9 sous Windows 10 et avec Lazarus 2.0.12 sous PureOS (VM ; gnome 3.30.2)
    Tiens, ça m'aura permis de survoler leur site, je ne connaissais pas cet OS. Le site est bien fait et lisible, c'est déjà un bon point. Faudrait que je teste, mais je suis en train de continuer mon projet en m'appuyant sur un conseil piqué chez les voisins, j'ai nommé ShaiLeTroll et sa phrase
    Citation Envoyé par ShaiLeTroll
    Ah je n'utilise jamais de TFrame, une TForm dockée fait le job et sans instabilité du RAD
    T'as bien noté les 4 derniers mots ?
    On va voir si je m'en sors mieux avec une TForm, donc, parce qu'avec les frames je m'y arrache tous mes cheveux et avec les panels, on vient de voir...

    Et le SetBounds, oui, il est bien sympathique, je l'utilise souvent, mais quand tu fais F1 dessus, tu te demandes ce qu'ils racontent...

    Bref, à suivre et bonne fin de journée.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Re bonjour,

    J'ai pris le code fourni dans le premier topic du lien fourni précédemment, je l'ai mis dans la procédure d'activation de ma forme, compilé d'abord sous Windows, puis sous Linux (Lazarus 2.2.4), et j'obtiens
    Nom : testpanel.jpg
Affichages : 219
Taille : 10,9 Ko
    ici, l'image linux, mais c'est pareil sous windows le bouton est bien au milieu, alors que sur l'image de ton code test, il n'y est pas.
    C'est à n'y rien comprendre.
    je joins le code:

    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
    70
    71
    72
    73
    74
    75
    unit bb0011;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        pnlcentre: TPanel;
        procedure FormActivate(Sender: TObject);
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
      pnl1, pnl2, pnl3: TPanel;
      btn1: TButton;
    begin
      pnl1 := TPanel.Create(self);
      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(self);
      with pnl2 do begin
        Parent := pnl1;
        Align := alRight;
        Width := Parent.Width div 2;
        Color := clMoneyGreen;
      end;
     
      btn1:= TButton.Create(self);
      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(self);
      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;
    end;
     
    end.
    J'ai juste remplacé mainform par self (!) mais en principe c'est pareil.

    bb84000

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Re,

    Oui, de mon côté je l'ai repris également et j'ai fait minimaliste :

    Nom : hauteur_réparée.png
Affichages : 216
Taille : 4,6 Ko

    le code, où tout fonctionne bien maintenant :
    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
    uses
      ExtCtrls; // pour le TPanel
     
    var
      pnl1: TPanel;
      btn1: TButton;
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      pnl1 := TPanel.Create(Self);
      with pnl1 do begin
        Align := alClient;
        Alignment := taLeftJustify;
        //Caption := ' pnl1.height = ' + IntToStr(pnl1.Height);
        Color := clSkyBlue;
        Parent := Self;
      end;
      // hors du "with" pour avoir une valeur correcte
      pnl1.Caption := ' pnl1.height = ' + IntToStr(pnl1.Height);
     
      btn1:= TButton.Create(Self);
      with btn1 do begin
        Parent:= pnl1;
        Height:= 17;
        SetBounds(Parent.Width div 2, (Parent.Height - Height) div 2, 60, 17);
        Caption := IntToStr(btn1.Top);
      end;
    end;
     
    procedure TForm1.FormResize(Sender: TObject);
    begin
      //showmessage(self.Name); // Form1
      btn1.SetBounds(Self.Width div 2, (Self.Height - btn1.Height) div 2, 60, 17);
      Caption := IntToStr(Height div 2);
      btn1.Caption := IntToStr(btn1.Top);
      pnl1.Caption := ' pnl1.height = ' + IntToStr(pnl1.Height);
    end;

    Ah, pour le mystère des différences, je me suis demandé s'il n'y aurait pas un rapport avec le sous-système graphique ? Moi je suis en gtk2 (ou 3 ou 4, c'est un peu la pagaille de ce côté...)

    (merci au gentil modo pour le déplacement de ce post et de celui qui le précède, )
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    Il faut que tu crées une méthode realigne qui réaffiche les panels avec les nouvelle infos.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par anapurna Voir le message
    Salut

    Il faut que tu crées une méthode realigne qui réaffiche les panels avec les nouvelle infos.
    Elle existe, elle s'appelle OnFormResize !


    Bonjour,

    Mon exemple minimaliste ne me satisfaisant pas, je lui ai rajouté un autre panel, pnl2, qui va être alClient et parent du pnl1 qui devient alRight, j'ai été obligé de changer quelques bricoles, je vous livre tout ça brut de fonderie avec les lignes modifiées en commentaire et les nouvelles dessous.

    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
    var
      pnl1: TPanel;
      pnl2: TPanel;
      btn1: TButton;
      running: boolean = False;
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      pnl2 := TPanel.Create(Self); // nouveau
      with pnl2 do begin
        Align := alClient;
        Alignment := taLeftJustify;
        Color := clSkyBlue;
        // hors du "with" pour avoir une valeur correcte --> Dans FormResize = ok
        //Caption := 'pnl2.height = ' + IntToStr(pnl2.Height); toujours à 50
        Parent := Self;
      end;
     
    //  pnl1 := TPanel.Create(Self);
      pnl1 := TPanel.Create(pnl2);// modif
      with pnl1 do begin
    //    Align := alClient;
        Align := alRight; // modif
        Width := 270; // nouveau
        Alignment := taLeftJustify;
    //    Color := clSkyBlue;
        Color := clMoneyGreen; // modif
        // hors du "with" pour avoir une valeur correcte --> Dans FormResize = ok
        //Caption := 'pnl1.height = ' + IntToStr(pnl1.Height); toujours à 50
    //    Parent := Self;
        Parent := pnl2;// modif
      end;
     
    //  btn1:= TButton.Create(Self);
      btn1:= TButton.Create(pnl1);// modif
      with btn1 do begin
        Height:= 17; // utile pour être à la bonne hauteur
        Caption := IntToStr(btn1.Top);
        //SetBounds dans FormResize
        Parent:= pnl1;
      end;
     
      running := True;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      pnl2.Free;
    //  ShowMessage(quotedstr(Self.Name+' '+inttostr(Self.ComponentCount)+
    //    ' '+inttostr(Self.ControlCount))); // 'Form1 0 0' c'est tout bon, non ?
    end;
     
    procedure TForm1.FormResize(Sender: TObject);
    begin
      //showmessage(self.Name); // Form1
      if not running then exit; // impératif car AV si objets inexistants
      Caption := IntToStr(Height div 2);
      pnl2.Caption := 'pnl2.height = ' + IntToStr(pnl2.Height);
      pnl1.Caption := 'pnl1.height = ' + IntToStr(pnl1.Height);
      btn1.SetBounds(btn1.Parent.Width div 2, (btn1.Parent.Height - btn1.Height) div 2, 60, 17);
      btn1.Caption := IntToStr(btn1.Top);
    end;
    Ça fonctionne tip-top,

    Nom : Capture d’écran du 2022-11-06 17-12-10.png
Affichages : 191
Taille : 6,9 Ko

    Et comme j'ai un peu miséré avec Self (désolé, Andnotor...), j'ai fouillé l'aide et suis tombé sur ça, dont je vous fais profiter, et où vous trouverez une question de votre serviteur :
    Aide / Reference Guide / Rechercher Self -->
    5.3 Fields

    Object Fields are like record fields. They are accessed in the same way as a record field would be accessed: by using a qualified identifier. Given the following declaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type TAnObject = Object  
        AField : Longint;  
        Procedure AMethod;  
      end;  
    Var AnObject : TAnObject;
    then the following would be a valid assignment:
    AnObject.AField := 0;

    Inside methods, fields can be accessed using the short identifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure TAnObject.AMethod;  
    begin  
      ...  
      AField := 0;  
      ...  
    end;
    Or, one can use the self identifier. The self identifier refers to the current instance of the object:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure TAnObject.AMethod;  
    begin  
      ...  
      Self.AField := 0;  
      ...  
    end;
    D'accord mais ça sert à quoi, à part allonger le texte à lire et donc à brouiller la compréhension ?

    One cannot access fields that are in a private or protected sections of an object from outside the objects’ methods. If this is attempted anyway, the compiler will complain about an unknown identifier.

    It is also possible to use the with statement with an object instance, just as with a record:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With AnObject do  
    begin  
      AField := 12;  
      AMethod;  
    end;
    In this example, between the begin and end, it is as if AnObject was prepended to the AField and AMethod identifiers.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Jipété > D'accord mais ça sert à quoi, à part allonger le texte à lire et donc à brouiller la compréhension ?

    Là, je suis d'accord. Cependant il y a des cas où ça peut être utile, par exemple dans une boucle whith..do

    Je reprends un bout de ton exemple. Si tu veux par exemple, aligner le panel sur le haut de la forme à l'intérieur de la boucle with, et avoir une hauteur moitié de celle de la forme, height se réfère à pnl2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.FormActivate(Sender: TObject);
    begin
       pnl2 := TPanel.Create(Self); 
       pnl2.Parent := Self;                          // perso je préfère faire ça tout de suite, avant la boucle
       with pnl2 do
       begin
         Align := alTop;   
         height:= self.height div 2;             // Là je suis certain de ne pas me tromper (ce genre de truc m'arrive régulièrement !)
         Alignment := taLeftJustify;            // Je préfère mettre ça après avoir fixé les dimensions, on ne sait jamais !
         Color := clSkyBlue;
      end;
    ...
    end;
    bb84000

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,

    il est bizarre ton exemple :
    1. ligne 4, le .Parent "tout de suite" alors que je suis sûr d'avoir lu dans des tutos officiels (faudrait juste les retrouver...) qu'il fallait le mettre à la fin ;
    2. ligne 8, cette ligne pnl2.Parent aurait pu être insérée dans la boucle with (au début comme à la fin) sans pnl2. devant ;
    3. ligne 9, quel rapport ? L'Alignment concerne l'alignement gauche-centre-droite de la Caption,

    En fait, je reviens deux secondes sur ce qui m'a interpelé et je reformule leur exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure TAnObject.AMethod;  
    begin  
      ...  
      // Inside methods, fields can be accessed using the short identifier:
      AField := 0;  
      // Or, one can use the self identifier, which refers to the current instance of the object:
      Self.AField := 0;  
      ...  
    end;
    Et donc, si ces deux lignes font la même chose, à quoi bon allonger/alourdir/utiliser la seconde ?

    Faudrait faire des tests plus approfondis mais là, j'ai vraiment autre chose à mijoter sur le gaz, et j'ai la joie l'honneur et le plaisir de vous annoncer qu'avec un peu d'huile de coude et beaucoup de pressage de cerveau, on arrive à des résultats :
    Juste après F9 :
    Nom : avant-resize.png
Affichages : 191
Taille : 37,0 Ko

    Après un Resize :
    Nom : après-resize.png
Affichages : 188
Taille : 32,3 Ko

    Elle est pas belle la vie, malgré les misères qu'on nous fait ?

    Le code (j'ai gardé les commentaires, quand on joue dans cette cour les ShowMessage sont indispensables pour s'y retrouver) n'est peut-être pas beau mais c'est ce que j'ai trouvé de mieux, et ça fonctionne.
    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
    procedure TForm1.FormResize(Sender: TObject);
    var
      h,i,j,k: integer;
      aName: string;
      mainPanel: TPanel;
      unPanel, sousPanel: TPanel;
      unObject: TObject;
      unControl: TControl;
    begin
      mainPanel:= TPanel.Create(Self);
      unPanel  := TPanel.Create(Self);
      unObject := TObject.Create;
      unControl:= TControl.Create(Self);
     
      h := (Height div cCount)-1;// pour avoir 4 panneaux identiques, et -1 sinon scrollbar verticale
      for i := 0 to cCount-1 do begin
        //btnmakebmp.Caption := 'test'; ne fonctionne qu'avec le dernier bouton, donc pas utilisable
     
        mainPanel := ScrollBox1.Controls[i] as TPanel;
        mainPanel.Height := h; // resize des panneaux dans le scrollbox
        //ShowMessage(mainPanel.Name); // pnl4host0 1 2 3
     
        for j := 0 to mainPanel.ControlCount-1 do begin
          unPanel := mainPanel.Controls[j] as TPanel;
          //ShowMessage(unPanel.Name); // les 3 sont listés : pnlinfos [on passe dessous] pnlchoix pnl4img
     
          if unPanel.Name = 'pnlinfos' then begin
            //ShowMessage(inttostr(unPanel.ControlCount)); // 7, ok
     
            for k := 0 to unPanel.ControlCount-1 do begin
              unObject := unPanel.Controls[k] as TControl;
              //ShowMessage((unObject as TControl).Name); // les 7 sont listés cCount fois
              // lblsize lblfreq lblinfo sbClosePanel btnmakebmp0123 ckbxplaythissong ckbxaffichemono
              {if length((unObject as TControl).Name) = 11 then
                showmessage(unPanel.Parent.Parent.Name+' '+unPanel.Parent.Name+' '+unPanel.Name+' '+
                  Copy((unObject as TControl).Name, 1, Length((unObject as TControl).Name)));
                // ScrollBox1 pnl4host0 pnlinfos btnmakebmp0
                // ScrollBox1 pnl4host1 pnlinfos btnmakebmp1
                // ScrollBox1 pnl4host2 pnlinfos btnmakebmp2
                // ScrollBox1 pnl4host3 pnlinfos btnmakebmp3    }
     
              if Copy((unObject as TControl).Name, 1, 10) = 'btnmakebmp' then begin
                //ShowMessage((unObject as TControl).Name); // btnmakebmp0 btnmakebmp1 btnmakebmp2 btnmakebmp3
                aName := 'btnmakebmp' + IntToStr(i);
                //ShowMessage(aName); // ok
                unControl := unObject as TButton;
                with unControl do begin
                  Name:=aName;
                  SetBounds((Parent.ClientWidth div 2)-10, Parent.ClientHeight div 2, 80, 17);
                end;
              end; // if Copy
            end; // for k
          end; // if pnlinfos
        end; // for j
      end; // for i
    end;
    À pluche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans ce cas simple, utiliser dans une méthode d'un objet le préfixe self pour appeler un de ses champs/méthodes n'a effectivement pas d'utilité.
    Sinon pour clarifier la lecture d'un code qui serait plus touffu, en dehors cependant de toute ambigüité. Et qui pourrait être relu/maintenu par quelqu'un d'autre que son concepteur.

    Pour l'affectation du Parent, il était en effet conseillé ici de la faire en fin d'affectation des propriétés de l'objet pour qu'elles soient toutes prises en compte en bloc, ce qui évite dans certains cas que leur ordre n'interfère.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... n'est peut-être pas beau ...
    Je confirme (fuites mémoires, transtypages inutiles, etc.).

    Positionner uniquement ce bouton à la création et fixer btnmakebmp.Anchors := [] ne serait-il pas suffisant ?

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je confirme (fuites mémoires, transtypages inutiles, etc.).
    Pour les fuites mémoire, j'ai mis en place un truc simple au FormClose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      for i := SBox.ControlCount-1 downto 0 do
        SBox.Controls[i].Free;
      ShowMessage(inttostr(SBox.ControlCount)); // affiche "0"
    Ça devrait suffire, non ?

    Pour les transtypages inutiles, merci de nous montrer lesquels.

    Pour le etc., merci de détailler.

    Je ne demande qu'à apprendre et faire des choses propres et efficaces.

    Citation Envoyé par Andnotor Voir le message
    Positionner uniquement ce bouton à la création et fixer btnmakebmp.Anchors := [] ne serait-il pas suffisant ?
    Et tu penses que ne rien mettre entre les crochets serait suffisant pour avoir le bouton positionné à la moitié de la largeur et à la moitié de la hauteur de son parent ?
    J'avoue humblement ne pas avoir testé, tellement ça sent l'improbable...

    EDIT : je viens de tester :
    Juste après F9 :
    Nom : F9_avec_crochets-only.png
Affichages : 183
Taille : 33,1 Ko

    Et après un resize (je ne mets qu'un bout, les autres sont pareils) :
    Nom : apres-resize_petit-bout.png
Affichages : 181
Taille : 18,0 Ko

    Pas terrible/terrible, hein,
    et que ça soit comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          ...
          Visible := True;
          Anchors := []; // Andnotor
          Parent:= pnlinfos;
        end;
    ou comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          ...
          Visible := True;
          //Anchors := []; // Andnotor
          Parent:= pnlinfos;
        end;
        btnMakeBmp.Anchors := []; // Andnotor
    /EDIT
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Salut,

    C'est peut-être conseillé de déclarer le parent à la fin, mais dans l'exemple du wiki, il n'y a que des propriétés qui ne dépendent pas du parent. J'ai constaté que quand on a des propriétés qui dépendent du parent, comme la couleur ou la police, ça mène à des résultats imprévisibles. Donc on est bien obligé de le définir avant de fixer, par exemple, les valeurs de ParentFont et ParentColor à false si on veut ses propres couleurs et ses propres fontes. J'ai pas mal galéré à cause de ça dans des composants où je voulais fixer la couleur de fond et la couleur de police (p. ex le scrollling label), parce que le parent peut mettre le composant dans une situation d'exception qui est très difficile à déboguer.

    En ce qui concerne le fait d'intégrer ou non un truc dans la boucle, je pense que c'est totalement une question de goût. Du temps où je pratiquais delphi, il me semble avoir vu quelque part que de toutes façons, le compilateur reconstruisait les instructions comme s'il n'y avait pas de boucle. Est-ce pareil avec FPC ? je n'en sais rien. Ce que je sais, c'est que je me trompe moins sans boucle with dans ce type de situations. Donc chacun fait comme ça lui va le mieux. Bien entendu, préfixer avec le self ne sert à rien si on n'est pas dans une boucle.

    bb84000

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pour les fuites mémoire
    Je parlais de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      mainPanel:= TPanel.Create(Self);
      unPanel  := TPanel.Create(Self);
      unObject := TObject.Create;
      unControl:= TControl.Create(Self);
    Tous ces objets sont créés inutilement et ne sont pas détruits. Ces 4 lignes sont à supprimer.

    Citation Envoyé par Jipété Voir le message
    Pour les transtypages inutiles, merci de nous montrer lesquels.
    Par exemple unObject := unPanel.Controls[k] as TControl;, le contenu de Controls sont des TControl.
    Même chose ici unControl := unObject as TButton, Name et SetBounds sont des propriétés/méthodes de respectivement TComponent et TControl. unObjet.Name simplement.

    Citation Envoyé par Jipété Voir le message
    Pour le etc., merci de détailler.
    if Copy((unObject as TControl).Name, 1, 10) = 'btnmakebmp' then pourrait être remplacer par if unObject is TCustomButton then.

    Et renommer des composants dans OnResize est parfaitement illogique.

    Citation Envoyé par Jipété Voir le message
    Et tu penses que ne rien mettre entre les crochets serait suffisant
    C'était une question et le comportement est manifestement différent de Delphi. En Delphi et un Anchors vide, la position de l'élément est ajustée proportionnellement à sa position d'origine.

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je parlais de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      mainPanel:= TPanel.Create(Self);
      unPanel  := TPanel.Create(Self);
      unObject := TObject.Create;
      unControl:= TControl.Create(Self);
    Tous ces objets sont créés inutilement et ne sont pas détruits. Ces 4 lignes sont à supprimer.
    Fait.
    Pas de souci, donc ok, j'ai dû m'embrouiller.

    Citation Envoyé par Andnotor Voir le message
    if Copy((unObject as TControl).Name, 1, 10) = 'btnmakebmp' then pourrait être remplacé par if unObject is TCustomButton then.
    Effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //andnotor          if Copy((unObject as TControl).Name, 1, 10) = 'btnmakebmp' then begin
              if unObject is TCustomButton then begin
                unControl := unObject as TButton;
                with unControl do begin
    //andnotor              Name:=aName; // un oubli
                  SetBounds((Parent.ClientWidth div 2)-10, Parent.ClientHeight div 2, 80, 17);
                end;
              end;
    Mais on ne peut pas faire plus simple, si je tente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if unObject is TCustomButton then 
      (unObject as TCustomButton).SetBounds((Parent.ClientWidth div 2)-10, Parent.ClientHeight div 2, 80, 17);
    c'est SIGSEGV,

    Et si je rajoute un autre bouton, c'est mort, faudra trier sur le nom des boutons.

    Citation Envoyé par Andnotor Voir le message
    Et renommer des composants dans OnResize est parfaitement illogique.
    OK d'ac.
    C'était de la facilité pour aller vite (je suis sur une maquette, là).

    Merci pour les tuyaux.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

Discussions similaires

  1. [Dates] souci avec les dates
    Par Ludo75 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2006, 17h15
  2. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51
  3. Soucis avec les Graphiques dans les états
    Par Chococrocq dans le forum IHM
    Réponses: 27
    Dernier message: 04/01/2006, 19h03
  4. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  5. Réponses: 7
    Dernier message: 05/10/2004, 13h44

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