Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 13 janv. 2017 à 17:08
Bonjour à tous,
"(Sender as TPanel)." ou "TPanel(Sender)." me font penser au truc bien pratique qu'est "absolute".
"absolute" permet de créer une variable placée à la même adresse qu'une autre variable déjà existante. Comme c'est une histoire de pointeur, c'est très puissant et très optimisé.
Dans le code de notre ami, ça pourrait s'utiliser comme ceci :
procedure TForm1.MouseBP; var MonPanel : TPanel absolute Sender; begin if MonPanel.BevelOuter=bvRaised then MonPanel.BevelOuter := bvLowered else MonPanel.BevelOuter := bvRaised; end;
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917
>
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019 14 janv. 2017 à 18:50
Oui, Cari, j'ai été un peu pointilleux sur ce coup.
Tu as bien fait de mettre les choses au point.
Bel éloge de la transparence en tout cas, du moins appliquée à Delphi.
N'ayons donc plus peur de bricoler, voire de tripoter les pointeurs, même si Delphi dans sa grande bonté nous en dispense le plus souvent.
Par ailleurs, après réflexion, pourquoi les cochons n'auraient-ils pas droit à un peu de confiture, de temps en temps (et pas trop souvent).
Ça les change un peu de la tarte aux concombres.
Dubois, c'était une petit Panel-Bouton magique :-P
procedure TForm1.MagicalPanelBouton1Click(Sender: TObject);
begin
if WakeUp(MastersOfDelphiFr) then
ShowMessage('yyyeeeeessss!!!')
end;
Y'a pas d'âge pour apprendre, et avec Delphi, on n'a pas fini !
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914
>
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019 14 janv. 2017 à 18:54
apothéose pour conclure !
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917
>
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019 Modifié par korgis le 14/01/2017 à 13:45
Salut Cari,
Tu lui as coupé le sifflet à Dubois : il dit plus rien, lol.
Ça fonctionne, c'est clair.
Mais, à part vouloir utiliser une variable en plus, il est dommage de réserver l'usage de la directive à ce contexte, non ? (c'est de la confiture pour les cochons)
Par contre (de mémoire), f0xi, en son temps, nous avait montré l'intérêt de l'utilisation de "absolute" pour passer d'un "array of" à un "record", par exemple, et ce genre de choses...
Là, ça déchire.
Quoi qu'il en soit, tu m'as fait remémorer l'usage de cette directive finalement peu utilisée et dont le maniement est délicat, mais pas plus dans le fond que "TPanel(Sender)" ou "Sender as TPanel" si l'on n'a pas pris la précaution de tester par "if Sender is TPanel"...
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918
>
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019 Modifié par Caribensila le 14/01/2017 à 17:35
Salut Japee,
C'était juste pour info...
Mais il ne faut pas trop se laisser impressionner par "absolute" dont le résultat n'est qu'un pointeur.
Delphi cache vraiment bien tout ce qui se rapporte aux pointeurs tant il est vrai que
les pointeurs font peur (surtout aux dames :p ).
Perso, j'emploie "absolute" surtout dans le cas décrit ici, pour créer une variable placée à la même adresse qu'une autre.
Et lorsque je bricole vraiment les pointeurs, je préfère le faire de façon transparente.
Voici, par exemple, ce que donnerait la même routine écrite avec des pointeurs et qui démontre la simplicité de "absolute" :
procedure TForm1.MouseBP; type pPanel = ^TPanel; var pMonPanel : pPanel; begin pMonPanel := @Sender; // affecte l'adresse de Sender à pMonPanel if pMonPanel^.BevelOuter=bvRaised then pMonPanel^.BevelOuter := bvLowered else pMonPanel^.BevelOuter := bvRaised; end;
De toute façon, tout bien pesé, je n'utilise les pointeurs qu'avec les Bitmap, pour des raisons d'optimisation...
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914
>
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019 14 janv. 2017 à 17:52
Décidément mon petit Panel Bouton à réveiller les maîtres du site (c'est pas de l'humour !) :
Korgis : With Sender as Tpanel
YanB : Surcharge Tpanel
Caribensila : Tpanel Absolute Sender
Caribensila : pMonPanel := @sender
ça devient un cours magistral !
Perso, j'ai appris des choses, comme quoi à tout age ....
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914
>
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019 13 janv. 2017 à 17:26
Salut Cari
Je ne connaissait que la vodka du même nom !
Je vais tester, si ça marche c'est ouf !
Pourquoi ne pas utiliser une variable de type boolean pour le changement / ou pas de couleur du bouton ?
Le choix pourrait être déterminé au cours de l'exécution en cochant ou non une TCheckBox pour tester les deux possibilités.
Connais-tu l'utilisation de "(Sender as TPanel)" (ou "TPanel(Sender)") ?
Par exemple, dans TForm1.MouseBP, ça pourrait donner :
procedure TForm1.MouseBP;
var
C1, C2: TColor;
begin
with Sender as TPanel do
begin
if BPmode <> 1 then // Echange de couleur Fond/Texte pendant le clic
//if ChangeColor then // <- un boolean serait plus approprié
begin
C1 := Color;
C2 := Font.color;
Color := C2;
Font.Color := C1;
end;
if BevelOuter = bvRaised then
BevelOuter := bvLowered
else
BevelOuter := bvRaised;
end;
end;
Je n'ai pas bien compris l'utilité d'attribuer des Tags à chaque panel, mais peut-être quelque chose m'échappe ?
Cordialement,
korgis
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914
>
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019 11 janv. 2017 à 08:02
Salut Korgis
Dans ma solution le tag me sert à identifier le bouton :
n := TComponent(Sender).Tag; z := KBP + inttostr(n);
( pour le findcomponent(Z) )
Mais avec ta méthode (que je vais tester) il semblerait qu'il n'y en a pas besoin
13 janv. 2017 à 17:08
"(Sender as TPanel)." ou "TPanel(Sender)." me font penser au truc bien pratique qu'est "absolute".
"absolute" permet de créer une variable placée à la même adresse qu'une autre variable déjà existante. Comme c'est une histoire de pointeur, c'est très puissant et très optimisé.
Dans le code de notre ami, ça pourrait s'utiliser comme ceci :
14 janv. 2017 à 18:50
Tu as bien fait de mettre les choses au point.
Bel éloge de la transparence en tout cas, du moins appliquée à Delphi.
N'ayons donc plus peur de bricoler, voire de tripoter les pointeurs, même si Delphi dans sa grande bonté nous en dispense le plus souvent.
Par ailleurs, après réflexion, pourquoi les cochons n'auraient-ils pas droit à un peu de confiture, de temps en temps (et pas trop souvent).
Ça les change un peu de la tarte aux concombres.
Dubois, c'était une petit Panel-Bouton magique :-P
Y'a pas d'âge pour apprendre, et avec Delphi, on n'a pas fini !
14 janv. 2017 à 18:54
Modifié par korgis le 14/01/2017 à 13:45
Tu lui as coupé le sifflet à Dubois : il dit plus rien, lol.
Ça fonctionne, c'est clair.
Mais, à part vouloir utiliser une variable en plus, il est dommage de réserver l'usage de la directive à ce contexte, non ? (c'est de la confiture pour les cochons)
Par contre (de mémoire), f0xi, en son temps, nous avait montré l'intérêt de l'utilisation de "absolute" pour passer d'un "array of" à un "record", par exemple, et ce genre de choses...
Là, ça déchire.
Quoi qu'il en soit, tu m'as fait remémorer l'usage de cette directive finalement peu utilisée et dont le maniement est délicat, mais pas plus dans le fond que "TPanel(Sender)" ou "Sender as TPanel" si l'on n'a pas pris la précaution de tester par "if Sender is TPanel"...
Modifié par Caribensila le 14/01/2017 à 17:35
C'était juste pour info...
Mais il ne faut pas trop se laisser impressionner par "absolute" dont le résultat n'est qu'un pointeur.
Delphi cache vraiment bien tout ce qui se rapporte aux pointeurs tant il est vrai que
les pointeurs font peur (surtout aux dames :p ).
Perso, j'emploie "absolute" surtout dans le cas décrit ici, pour créer une variable placée à la même adresse qu'une autre.
Et lorsque je bricole vraiment les pointeurs, je préfère le faire de façon transparente.
Voici, par exemple, ce que donnerait la même routine écrite avec des pointeurs et qui démontre la simplicité de "absolute" :
De toute façon, tout bien pesé, je n'utilise les pointeurs qu'avec les Bitmap, pour des raisons d'optimisation...
14 janv. 2017 à 17:52
Korgis : With Sender as Tpanel
YanB : Surcharge Tpanel
Caribensila : Tpanel Absolute Sender
Caribensila : pMonPanel := @sender
ça devient un cours magistral !
Perso, j'ai appris des choses, comme quoi à tout age ....
13 janv. 2017 à 17:26
Je ne connaissait que la vodka du même nom !
Je vais tester, si ça marche c'est ouf !
11 janv. 2017 à 14:51
En reprenant ton code on peut aussi faire comme ceci...
@+
11 janv. 2017 à 16:15
Surcharge de la classe TPanel, c'est pas mal aussi !
11 janv. 2017 à 08:21
Merci Korgis
Modifié par korgis le 10/01/2017 à 21:20
Pourquoi ne pas utiliser une variable de type boolean pour le changement / ou pas de couleur du bouton ?
Le choix pourrait être déterminé au cours de l'exécution en cochant ou non une TCheckBox pour tester les deux possibilités.
Connais-tu l'utilisation de "(Sender as TPanel)" (ou "TPanel(Sender)") ?
Par exemple, dans TForm1.MouseBP, ça pourrait donner :
Je n'ai pas bien compris l'utilité d'attribuer des Tags à chaque panel, mais peut-être quelque chose m'échappe ?
Cordialement,
korgis
11 janv. 2017 à 08:02
Dans ma solution le tag me sert à identifier le bouton :
( pour le findcomponent(Z) )
Mais avec ta méthode (que je vais tester) il semblerait qu'il n'y en a pas besoin