Panel Bouton

dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 - 9 janv. 2017 à 11:34
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 - 14 janv. 2017 à 18:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/101802-panel-bouton

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
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és 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17 > Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 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és 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019
14 janv. 2017 à 18:54
apothéose pour conclure !
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17 > Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 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és 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Derniè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és 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14 > Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 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és 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14 > Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 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 !
Salut,
En reprenant ton code on peut aussi faire comme ceci...
...
  TPanel = class(ExtCtrls.TPanel)
  private
    FPanelOption : Boolean;
    procedure SetPanelOption(AValue: Boolean);
    constructor Create(AOwner : TComponent); override;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
  public
    property PanelOption : Boolean read FPanelOption write SetPanelOption;
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
    LB1: TLabel;
    LB2: TLabel;
    BP1: TPanel;
    BP2: TPanel;
    BP3: TPanel;
    BP4: TPanel;
    BP5: TPanel;
    procedure BP1Click(Sender: TObject);
    procedure BP2Click(Sender: TObject);
    procedure BP4Click(Sender: TObject);
    procedure BP5Click(Sender: TObject);
    procedure BP3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

///------------------------------------
        implementation
///------------------------------------

{$R *.dfm}

constructor TPanel.Create;
begin
  inherited Create(AOwner);
  FPanelOption := False;
end;

procedure TPanel.WMLButtonDown(var Message: TWMLButtonDown);
begin
  inherited;
  if FPanelOption then
    BevelOuter := bvLowered;
end;

procedure TPanel.WMLButtonUp(var Message: TWMLButtonUp);
begin
  inherited;
  if FPanelOption then
    BevelOuter := bvRaised;
end;

procedure TPanel.SetPanelOption(AValue: Boolean);
begin
  if AValue <> FPanelOption then
    FPanelOption := AValue;
end;

//-------------------------------------------------------------- Initialisation
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to 5 do
    TPanel(FindComponent('BP'+IntToStr(I))).PanelOption := True;
end;

procedure TForm1.BP1Click(Sender: TObject);
begin
LB1.Caption := 'Message 1, Bouton BP1';
end;

procedure TForm1.BP2Click(Sender: TObject);
begin
LB1.Caption := 'Message 2, Bouton BP2';
end;

procedure TForm1.BP4Click(Sender: TObject);
begin
LB2.Caption := 'Message 3, Bouton BP4';
end;

procedure TForm1.BP5Click(Sender: TObject);
begin
LB2.Caption := 'Message 4, Bouton BP5';
end;

procedure TForm1.BP3Click(Sender: TObject);
begin
Close
end;
...
@+
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14 > Yanb
11 janv. 2017 à 16:15
Salut Yan
Surcharge de la classe TPanel, c'est pas mal aussi !
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
11 janv. 2017 à 08:21
La nouvelle version en ligne fonctionne parfaitement
Merci Korgis
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
Modifié par korgis le 10/01/2017 à 21:20
Salut Dubois.

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és 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Derniè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
Rejoignez-nous