Chronomètre pour le thé

Soyez le premier à donner votre avis sur cette source.

Vue 7 582 fois - Téléchargée 686 fois

Description

Dans la lignée des sources pas très innovantes voici un chronomètre avec une sonnerie. Bon je sais il en existe d'autres sur le site, mais celui-ci crée lui-même le son qu'il produit lorsqu'il sonne (en générant une oscillation périodique en créneaux dans le buffer de la carte son). La bonne nouvelle c'est que le composant TWaveOut (voir http://www.delphifr.com/codes/PROGRAMME-MIX-AUDIO-APPRENTI-DJ_33254.aspx) est créé au runtime donc pas besoin d'installer le package.

Je l'utilise pour faire infuser le thé, et éviter de me retrouver avec un liquide tout noir imbuvable parce que je l'ai oublié :-)

Les paramètres (durée du compte à rebours, position de la fenêtre) sont enregistrés dans un fichier ini.

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, WaveBase, WaveOut, IniFiles;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton1: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure WaveOut1Buffer(Buffer: Pointer; Length: Cardinal;
      BufferQueueLength: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
  public
    FFirstTick,FDeltaSound,FSoundIntensity:Integer;
    FFlash:Boolean;
    WaveOut1: TWaveOut;
  end;

var
  Form1: TForm1;
  GTotalTime:Integer;

const
  GMillisecondsPerDay=3600*1000*24;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  f:TIniFile;
  h1,h2:HRGN;
const
  Rounding=15;
begin
  WaveOut1:=TWaveOut.Create(Self);
  WaveOut1.Bits16:=True;
  WaveOut1.BufferSize:=2048;
  WaveOut1.DeviceID:=-1;
  WaveOut1.OnBuffer:=WaveOut1Buffer;
  h1:=CreateRoundRectRgn(0,0,ClientWidth+1,ClientHeight+1,Rounding,Rounding);
  with SpeedButton1.BoundsRect do
    h2:=CreateRectRgn(Left,Top,Right,Bottom);
  CombineRgn(h1,h1,h2,RGN_OR);
  DeleteObject(h2);
  SetWindowRgn(Handle,h1,False);
  DeleteObject(h1);
  f:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
  try
    Left:=f.ReadInteger('Position','X',0);
    Top:=f.ReadInteger('Position','Y',0);
  finally
    f.Destroy;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  t,u:Integer;
begin
  t:=Integer(GetTickCount)-FFirstTick;
  u:=GTotalTime-t;
  if u<6000 then
    WaveOut1.Start;
  if u<0 then begin
    FFlash:=not FFlash;
    if FFlash then
      Label1.Color:=clRed
    else
      Label1.Color:=0;
    u:=0;
  end;
  Label1.Caption:=TimeToStr(u/GMillisecondsPerDay);
  Label2.Caption:='Total time: '+TimeToStr(t/GMillisecondsPerDay);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=27 then
    Close;
end;

procedure TForm1.WaveOut1Buffer(Buffer: Pointer; Length: Cardinal;
  BufferQueueLength: Integer);
type
  TSmallintArray=array[0..$FFFFFF] of Smallint;
  PSmallintArray=^TSmallintArray;
var
  p:PSmallintArray;
  i:Integer;

  function Signal(x:Single):Smallint;
  begin
    if Frac(x/3000)<0.8 then
      Result:=0
    else begin
      if Cos(x)>0 then
        Result:=FSoundIntensity
      else
        Result:=-FSoundIntensity;
    end;
  end;

begin
  p:=Buffer;
  Length:=Length div 2;
  for i:=0 to Length-1 do
    p[i]:=Signal(0.3*(i+FDeltaSound));
  FDeltaSound:=FDeltaSound+Integer(Length);
  Inc(FSoundIntensity,5+FSoundIntensity div 20);
  if FSoundIntensity>32000 then
    FSoundIntensity:=32000;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  f:TIniFile;
begin
  f:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
  try
    f.WriteInteger('Position','X',Left);
    f.WriteInteger('Position','Y',Top);
  finally
    f.Destroy;
  end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(WM_SYSCOMMAND,$f012,0);
end;

end.

Conclusion :


Un peu d'indulgence svp, parce que là, j'ai presque l'impression d'avoir posté mon premier programme de calculette :-)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
23 juil. 2008 à 21:44
indulgence ?
Mais c'est génial.. Un bon thé et en musique..
enfin, j'ai lancé le programme..
j'avais mis le son sur mes enceintes et à fond..
On a frappé à ma porte..
ils ont cru à un attentat !
heureusement, ouf, j'ai trouvé la croix..

Bravo quand même l'originalité..
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
23 juil. 2008 à 22:10
"On a frappé à ma porte.. " ... lol!

Désolé, j'aurais dû prévenir que le son va crescendo :-)
Peut-être que je devrais ajouter la possibilité de limiter le volume, mais je n'avais pas trop envie de surcharger l'interface.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
23 juil. 2008 à 23:46
De ma copine Yang à Forman :
« Dans les 3 premières minutes, c'est la théine qui diffuse dans l'eau ( 80° ! ). Ensuite, ce sont les tanins qui diffusent et donnent le goût amer, mais aussi les parfums.
Cependant les tanins neutralisent l'effet de la théine et rendent donc le thé moins excitant. »

Ma copine suggère donc un TrackBar (excitation-parfum) et un choix de type de thé (noir, vert, blanc, etc.) plutôt que le temps d'infusion en dur. Ce serait appréciée en Chine, paraît-il.
De plus, elle n'aime pas le bip-bip. Quelque chose de plus harmonieux pour cet instant aurait été préférable, dit-elle.

Raffinée la chinetoque! lol

Moi, perso, j'ai rien à redire. Mais je ne mets que 9 à cause du bip-bip agressif (quand t'es un peu paumé dans le codage de tes pointeurs, ça énerve une théière qui menace de faire exploser la baraque).
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
24 juil. 2008 à 00:59
Lol elle est vraiment exigeante!

Si j'ai le temps j'en ferai une autre version. L'agressivité du son était désirée, parce que sinon je suis trop tenté de me dire "non c'est bon je peux attendre un peu et y aller plus tard", au moins là il est difficile de l'ignorer.
Francky23012301 Messages postés 400 Date d'inscription samedi 6 août 2005 Statut Membre Dernière intervention 11 février 2016 1
24 juil. 2008 à 01:39
Lancé le truc à 01:33
10 sec apres : la voisine qui descend en string pas contente.
Bon ben j'en ai profité pour lui offrir un thé : Bilan j'ai pas finit la nuit tout seul.

Smpas ton truc formant, sympa.

Je le conseil à tout les étudiants qui sont en résidence universitaire : Va y avoir du laché de strings.
Je le vous le dit les gars : c'est chaud les trucs à Forman

Mdrrrr

Ps : Pour ceux qui ont pas compris. C'est pas un simple chronometre hein.

Pour le code rien à redire sauf que tu as pas renommé les composants :p.

Pour la voisine ca mérite un 10

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.