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. #21
    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
    Il y a quand même un truc que je ne capte pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
              if unObject is TCustomButton then begin
                unControl := unObject as TButton;
                with unControl do begin
                  SetBounds((Parent.ClientWidth div 2)-10, Parent.ClientHeight div 2, 80, 17);
                end;
              end;
    fonctionne très bien, alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
              if unObject is TCustomButton then begin
                unControl := unObject as TButton;
                unControl.SetBounds((Parent.ClientWidth div 2)-10, Parent.ClientHeight div 2, 80, 17);
              end;
    se termine en AV !
    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. #22
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
              if unObject is TCustomButton then begin
                unControl := unObject as TButton;
                unControl.SetBounds((Parent.ClientWidth div 2)-10, Parent.ClientHeight div 2, 80, 17);
                // sans le with, le Parent est celui de l'objet dont la méthode est ici partiellement rapportée, 
                // (de type TForm1 si c'est le bon extrait de ton code)
                // et non celui de unControl comme tu l'obtiens avec le with
                // et si cet objet n'a pas de Parent assigné, l'AV est de mise
              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 !

  3. #23
    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
    Bien vu, Yves, et grand merci !

    Un autre truc que je ne comprends pas (attention, j'abandonne le TButton, trop moche, pour utiliser le TBitBtn) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if unObject is TCustomBitBtn then begin
      ShowMessage(unObject.Name); 
      ...
    Citation Envoyé par compilo pas content
    --> Error: identifier idents no member "Name"
    et Name est souligné en rouge dans la ligne de code.
    Par contre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if unObject is TCustomBitBtn then begin
    //ShowMessage(unObject.Name);
      ShowMessage((unObject as TCustomBitBtn).Name); // btnmakebmp0-1-2-3
      ...
    Non seulement ça compile mais en plus ça s'exécute sans erreur.

    D'où le pourquoi vous en avez trouvé partout dans mon code...

    Mais une explication serait la bienvenue, parce que là, je reste sans voix.
    D'autant plus que si j'examine les codes du TCustomBitBtn et celui du TBitBtn dans l'unité Buttons.pp, c'est vrai qu'on ne trouve pas "Name", mais si je pose un TBitBtn sur une fiche, pris dans la palette de l'EDI, j'ai bien une propriété "Name" à disposition.

    Merci pour les lumières,
    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. #24
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Quel est le type de unObject ? Si c'est un simple TObject, il n'a certainement pas de propriété Name.
    Il faudrait le début de la procédure pour voir d'où vient cet objet (et son type).
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #25
    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 M.Dlb Voir le message
    Quel est le type de unObject ? Si c'est un simple TObject, il n'a certainement pas de propriété Name.
    Et effectivement, ceci explique cela. L'ajout de as TCustomBitBtn) précise le statut de unObject et permet d'avancer : bien vu !
    Et merci.

    Citation Envoyé par M.Dlb Voir le message
    Il faudrait le début de la procédure pour voir d'où vient cet objet (et son type).
    Vos désirs sont des ordres, Monseigneur,
    Mais tu as trouvé l'explication,
    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
    procedure TForm1.FormResize(Sender: TObject);
    var
      h,i,j,k: integer;
      aName: string;
      mainPanel: TPanel;
      unPanel : TPanel;
      unObject: TObject;
    begin
      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 bien qu'avec le dernier bouton, donc pas utilisable
     
        mainPanel := ScrollBox1.Controls[i] as TPanel;
        mainPanel.Height := h; // resize des panneaux dans le scrollbox
     
        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;
    //andnotor          if Copy((unObject as TControl).Name, 1, 10) = 'btnmakebmp' then begin
              if unObject is TCustomBitBtn then begin
                //ShowMessage((unObject as TCustomBitBtn).Name); // btnmakebmp0 btnmakebmp1 btnmakebmp2 btnmakebmp3
                //ShowMessage(unObject.Name); // erreur :koi:
                with (unObject as TCustomBitBtn) do
                  if Copy(Name, 1 ,10) = 'btnmakebmp' then // test au cas où plusieurs TBitBtns
                    SetBounds((Parent.ClientWidth div 2)-10, (Parent.ClientHeight-ButtonHeight) div 2, 80, ButtonHeight); // 20 avec les TBitBtn
              end; // if
            end; // for k
          end; // if pnlinfos
        end; // for j
      end; // for i
    end;
    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. #26
    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,

    M.dlb a raison.

    L'utilisation de TObject pour Sender permet de passer n'importe quoi à la procédure. Mais rien ne permet au compilateur de savoir de quel type il s'agit. C'est à toi de lui dire.

    Et comme je n'aime pas les constructions Machin as Chose, j'utilise tout simplement :

    TCustomBitBtn(unObject).Name

    bb84000

  7. #27
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if unObject is TCustomBitBtn then begin
                //ShowMessage((unObject as TCustomBitBtn).Name); // btnmakebmp0 btnmakebmp1 btnmakebmp2 btnmakebmp3
                //ShowMessage(unObject.Name); // erreur :koi:
                with (unObject as TCustomBitBtn) do
    IS et AS font des test dynamiques pour déterminer le type class ou de l'interface de l'instance en question cela veut dire la génération de code pour l'opération, AS déclenche une exception si l'opération échoue , mais quand t on est sur du type on passe par un simple cast TCustomBitBtn(unObject).Name, c'est extrêmement rare d'utiliser AS pour les class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     unObject := unPanel.Controls[k] as TControl;
    la liste unPanel.Controls est déjà typée et ne renvoie que des contrôles, as TControl est inutile, pour plus homogénéité dans le code unObject devrait être déclaré comme TControl

  8. #28
    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 à tous,

    Citation Envoyé par bb84000 Voir le message
    Et comme je n'aime pas les constructions Machin as Chose, j'utilise tout simplement :
    TCustomBitBtn(unObject).Name
    Mais il y a des fois où c'est impossible, voir ci-après :

    Citation Envoyé par wheel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     unObject := unPanel.Controls[k] as TControl;
    la liste unPanel.Controls est déjà typée et ne renvoie que des contrôles, as TControl est inutile, pour plus homogénéité dans le code unObject devrait être déclaré comme TControl
    Ah !
    Donc je modifie mon code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      mainPanel: TPanel;
    //  unControl: TControl;
      unControl: TPanel;
    begin
      for i := 0 to cCount-1 do begin
        mainPanel := SBox.Controls[i]; // as TPanel;
        ...
    et ça ne loupe pas, le compilo me fait une remontrance :
    Citation Envoyé par compilo
    Error: Incompatible types: got "TControl" expected "TPanel"
    avec le curseur qui clignote juste après le x de SBox.

    Si je remets as TPanel ça passe et ça s'exécute bien.
    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. #29
    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,

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      mainPanel: TPanel;
    //  unControl: TControl;
      unControl: TPanel;
    begin
      for i := 0 to cCount-1 do begin
        mainPanel := SBox.Controls[i]; // as TPanel;
        ...
    et ça ne loupe pas, le compilo me fait une remontrance :
    avec le curseur qui clignote juste après le x de SBox.

    Si je remets as TPanel ça passe et ça s'exécute bien.
    Bah oui. Controls[i] renvoie un TControl, alors que le compilo attend un TPanel.

    Soit tu remets as TPanel, soit tu mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
       mainPanel := SBox.TPanel(Controls[i]); 
    ...
    Ceci étant, je ne comprends pas très bien ce que tu veux faire dans cette boucle. Si tu veux simplement intervenir sur le contenu de chaque panel de la liste, tu n'as pas besoin de passer par la variable mainPanel, tu peux utiliser directement [I]SBox.TPanel(Controls) pour accéder à ses propriétés et ses contrôles.
    Par exemple [I]SBox.TPanel(Controls).width te donne la largeur du panel i.

    bb84000

  10. #30
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    et ça ne loupe pas, le compilo me fait une remontrance :
    Il s'agit d'une caractéristique des langues typées pour vérifier en statique la validité d'une affectation ex A := B sera valide si B est de même type que A ou en est un descendant donc ce code est invalide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      unPanel := mainPanel.Controls[j];
    Maintenant puisqu’ile est clair, pour vous, que mainPanel ne contient que des panels alors il est possible de l’écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      unPanel :=TPanel(mainPanel.Controls[j]);

    le conseil que j'ai donné concerne la partie suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     unObject := unPanel.Controls[k];
    Ici unPanel contient différentes types de contrôles donc une ambiguïté un test est nécessaire pour choisir le contrôle sur lequel on veut travailler, le variable unObject devrait être de même type renvoyé par la collection Controls qui est TControl l’ancêtre commun de tous les contrôles qui vous permet d’accéder a toutes les propriétés basiques Name, Width, Height , Parent ...

  11. #31
    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
    Yep !
    Citation Envoyé par bb84000 Voir le message
    Par exemple [I]SBox.TPanel(Controls).width te donne la largeur du panel i.
    J'ai tenté ça, dans la procédure où je crée mes panels (donc le pnl4host est déclaré et bien connu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      pnl4host := SBox.TPanel(Controls[2]).width;
    et j'ai gagné ça,
    Citation Envoyé par compilo pas content
    Error: identifier idents no member "TPanel"
    avec le curseur clignotant devant TPanel...

    On continuera demain matin, là, je n'ai plus le temps.
    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

  12. #32
    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,

    Citation Envoyé par Jipété Voir le message
    Yep !


    J'ai tenté ça, dans la procédure où je crée mes panels (donc le pnl4host est déclaré et bien connu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      pnl4host := SBox.TPanel(Controls[2]).width;
    et j'ai gagné ça,

    avec le curseur clignotant devant TPanel...
    Normal ! pnl4host est un Tpanel, il ne peut pas être égal à une largeur. A la rigueur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pnl4host.width := SBox.TPanel(Controls[2]).width;
    Modification: En fait ce code ne marche pas. Il faut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pnl4host.width := TPanel(SBox.Controls[2]).width;
    bb84000

  13. #33
    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,

    Citation Envoyé par bb84000 Voir le message
    Citation Envoyé par Jipété
    pnl4host := SBox.TPanel(Controls[2]).width;
    Normal ! pnl4host est un Tpanel, il ne peut pas être égal à une largeur.
    Tu as un œil de lynx et moi j'étais à la ramasse, hier.
    Sincèrement désolé d'écrire d'aussi grosses bêtises.

    Maintenant, la bonne question c'est : quelle est la meilleure façon d'écrire ?
    Citation Envoyé par bb84000 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      pnl4host.width := TPanel(SBox.Controls[0]).width; // bb84000
    // ou
      pnl4host.width := (SBox.Controls[0] as TPanel).width; // Jipété
    (j'ai mis [0] car j'ai inséré ces deux lignes juste après la création du premier panneau)

    Merci,
    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

  14. #34
    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

    Citation Envoyé par Jipété Voir le message
    Maintenant, la bonne question c'est : quelle est la meilleure façon d'écrire ?
    Celle que tu préfères, qui te parait la plus intuitive.

    Modification
    Je tempère l'affirmation ci-dessus. J'ai voulu contrôler dans la vraie vie, avec le code suivant qui se contente d'assigner un nom au panel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.PnlRightClick(Sender: TObject);
    var
      i: Integer;
      t: TDateTime;
    begin
      t:= now();
      for i:= 0 to 10000000 do
      begin
        TPanel(Sender).Name:= 'Name';
        //(Sender as TPanel).Name:= 'Name';
      end;
      Application.ProcessMessages;
      ShowMessage(InttoStr(MilliSecondsBetween(now(),  t)));
    end;
    Où l'on voit que la procédure de traitement l’événement Onclick du panel est générée automatiquement sous le nom de Rightclick bien qu'elle ne réagisse qu'à un clic gauche (sous Windows 64).

    Ensuite, l'exécution du code avec la première ligne dure 100 ms et celle avec la seconde ligne 144 ms (compilation sous Windows 64). Je croyais que c'était pareil pour le compilateur, apparemment non.

    Si tu as un moment, peux-tu tester sous Linux ?

    Cordialement,

    bb84000

  15. #35
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    Citation Envoyé par bb84000 Voir le message
    Je croyais que c'était pareil pour le compilateur, apparemment non.
    Pour autant que je sache, le fait un test par avant de trans typer alors que l'autre ligne trans type directement.

    Cordialement

  16. #36
    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 bb84000 Voir le message
    générée automatiquement sous le nom de Rightclick bien qu'elle ne réagisse qu'à un clic gauche
    PnlRight est le nom du panel, aucun rapport avec le clic gauche/droite

    Citation Envoyé par bb84000 Voir le message
    Je croyais que c'était pareil pour le compilateur, apparemment non.
    Non c'est pas pareil puisque as entraîne un contrôle du type à la compilation (autant que possible) et à l'exécution.

    Ceci par exemple ne compilera pas Button := Panel1 as TButton alors que Button := TButton(Panel1) compile sans problème.
    A l'exécution as déclenchera une exception alors qu'un transtypage standard entraînera une VA.

    Alors lequel choisir ?

    as si on veut la sécurité et la possibilité de gérer l'erreur sur exception mais au détriment de la vitesse d'exécution. Mais si le type est clairement défini ou s'il y a un test de validité (is ou InheritsFrom) inutile de faire un contrôle supplémentaire, le transtypage standard suffit.

    Maintenant le choix de la classe de transtypage a également une certaine importance sur l'évolution et la lisibilité du code. Même si on peut bien sûr utiliser la classe réelle il serait préférable d'utiliser la classe ancêtre la plus éloignée.

    Si on reprend le développement actuel de Jipété ; il veut modifier le nom, la taille/position et énumérer des contrôles enfants. Quelle classe ancêtre du panel inclut ces trois notions ?
    Nom : TComponent.
    Nom, taille/position : TControl.
    Nom, taille/position et liste d'enfants : TWinControl.

    Le transtypage logique à appliquer ici serait TWinControl.

  17. #37
    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,

    Citation Envoyé par Andnotor Voir le message
    PnlRight est le nom du panel, aucun rapport avec le clic gauche/droite
    Bon sang ! Suis-je bête, en plus, c'est moi qui l'ai appelé comme ça !

    Pour le reste, ton explication me plait bien.
    Comme tu le dis, dans les cas où les deux fonctionnent, la visibilité du code est à prendre en compte, mais aussi les habitudes prises depuis longtemps (Turbo pascal !).

    bb84000

  18. #38
    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
    Mais

    Bonjour,

    Citation Envoyé par bb84000 Voir le message
    Si tu as un moment, peux-tu tester sous Linux ?
    à que en voilà un résultat époustouflant !

    Pour me simplifier la vie, j'ai mis deux boutons et j'ai inversé le commentaire au niveau des deux lignes utiles et les résultats sont dans 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
    uses // ne pas oublier ça
      ExtCtrls, DateUtils;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
      t: TDateTime;
    begin
      t:= now();
      for i:= 0 to 10000000 do
      begin
        TPanel(Sender).Name:= 'Name';  // 212
        //(Sender as TPanel).Name:= 'Name';
      end;
      Application.ProcessMessages;
      ShowMessage(InttoStr(MilliSecondsBetween(now(),  t)));
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i: Integer;
      t: TDateTime;
    begin
      t:= now();
      for i:= 0 to 10000000 do
      begin
        //TPanel(Sender).Name:= 'Name';
        (Sender as TPanel).Name:= 'Name'; // Erreur : transtypage incorrect
      end;
      Application.ProcessMessages;
      ShowMessage(InttoStr(MilliSecondsBetween(now(),  t)));
    end;
    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

  19. #39
    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
    Ton problème est typiquement ce que je voulais dire par " le choix de la classe de transtypage a également une certaine importance sur l'évolution et la lisibilité du code ".

    Dans le premier cas tu passes par un transtypage standard TPanel(Sender).Name sauf que… Sender n'est pas un TPanel mais un TButton (ajoute ShowMessage(Sender.ClassName) pour t'en assurer).
    Mais ça fonctionne parce que Name est déclaré au niveau de TComponent et que TPanel et TButton dérivent tous deux de cette classe, leur Champ Name est au même offset dans leur déclaration.

    Mais question lisibilité et compréhension, c'est zéro
    Pour avoir quelque chose d'acceptable il faudrait reprendre le code et remplacer tous ces TPanel par des TButton.


    Dans le deuxième cas il y a contrôle du type. TButton n'étant pas un TPanel (ou dérivé) ça râle et tu es bon une nouvelle fois pour tout reprendre !
    Zéro cette fois question évolutivité


    Si tu avais pris la classe ancêtre la plus éloignée, TComponent pour le nom, ces deux méthodes ne demanderaient aucun changement et tu pourrais leur passer indifféremment tout type dérivant de TComponent. Un événement pour tous les composants à la place d'un événement par type de composant.

    Plus simple et efficace non ? simplement par le choix adéquate d'un type

  20. #40
    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é, c'est pour que Sender soit bien un TPanel que j'ai utilisé l'évenement OnClick du TPanel et pas un bouton (ce que j'avais fait au départ) !

    bb84000

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