Tpulsebutton - répétition progressive d'un event pendant onkeydown

Description

Ce qui fait l'intérêt de ce composant est l'évènement OnPulse.
Le rythme de OnPulse est progressif. Lent au départ, il s'accélère progressivement pour atteindre sa valeur maximale.
OnPulse est déclenché par OnMouseDown, et stoppé par OnMouseUp.
Une utilisation évidente de TPulseButton est l'incrémentation/décrémentation d'une valeur par l'utilisateur en phase d'exécution.
TPulseButton hérite de TSpeedButton.

Ce n'est pas tout à fait mon premier composant, bien que je sois assez néophyte en la matière, mais c'est le premier que je publie car il me semble offrir un intérêt ailleurs que dans mes bouts de programmes.
Bien qu'il soit très simple, je me suis efforcé de l'aborder avec rigueur.
Et je lui trouve une certaine utilité : je commence personnellement à en coller partout, lol.

Je peaufinerai peut-être les valeurs concernant le rythme, mais il me semble qu'elles sont plutôt satisfaisantes.

Vous pouvez tester ce composant sans l'installer, avec le programme de démonstration.
Si vous l'installez, vous trouverez un fichier .dcr pour l'icône.
N'hésitez pas à critiquer, je poste un peu pour ça...

Modifications du 30 octobre 2006 :

- déclaré RYTHM_MAX en constante (merci à Delphiprog)
- "FRythm := FRythm + 1" modifié vers => "Inc(FRythm)" (merci à f0xi)
- débloqué l'utilisation de OnMouseDown et OnMouseUp (merci à Loda)
J'ai également modifié la position de inherited dans OnMouseDown et OnMouseUp,
ça me semble finalement plus logique, mais ça se discute.
Merci à Caribensila, Cirec et JulioDelphi pour leurs commentaires et
encouragements.
Merci à l'eau du robinet.

Source / Exemple :


unit PulseBtn;

interface

uses Buttons, ExtCtrls, Classes, Controls;

type
  TPulseButton = class(TSpeedButton)
  private
    FProgress: TTimer;
    FRythm: Integer;
    FOnPulse: TNotifyEvent;
    procedure TimerProgressTimer(Sender: TObject);
  protected
    procedure MouseDown(Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnMouseDown;
    property OnMouseUp;
    property OnPulse: TNotifyEvent read FOnPulse write FOnPulse;
  end;

procedure Register;

implementation

const
  RYTHM_MIN: Integer = 2;   { Valeur initiale de FRythm }
  RYTHM_MAX: Integer = 31;  { FRythm = (PROGRESS_INTERVAL div par 10) + 1 }
  PROGRESS_INTERVAL: Integer = 300;   { Valeur initiale de FProgress.Interval }

constructor TPulseButton.Create;
begin
  inherited;
  FProgress           := TTimer.Create(self);
  FProgress.Interval  := PROGRESS_INTERVAL;   // <- évite un temps mort
  FProgress.Enabled   := False;
  FProgress.OnTimer   := TimerProgressTimer;
end;

destructor TPulseButton.Destroy;
begin
  FProgress.Free;
  inherited Destroy;
end;

procedure TPulseButton.TimerProgressTimer(Sender: TObject);
begin
  FProgress.Interval := PROGRESS_INTERVAL div FRythm;
  if FRythm < RYTHM_MAX then  { jusqu'à Interval = 10 }
    Inc(FRythm);
  FOnPulse(self);
end;

procedure TPulseButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if Assigned(FOnPulse) then
    if ssLeft in Shift then
    begin
      FOnPulse(self);
      FRythm := RYTHM_MIN;
      FProgress.Enabled := True;
    end;
end;

procedure TPulseButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if Assigned(FOnPulse) then
    FProgress.Enabled := False;
end;

procedure Register;
begin
  RegisterComponents('Japee', [TPulseButton]);
end;

end.

Conclusion :


Fait sous D4 pro.
En principe compatible avec toute version ultérieure (tant qu'il y aura des TSpeedButtons, lol).

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.