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).
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.