Exemple d'application sans form

Description

Pour illustrer ce procédé, j'ai créé une petite horloge analogique avec carillon qui s'incruste dans le coin inférieur droit de l'écran. J'utilise un compo TDataModule.
On peut se demander à quoi peut servir une application sans Form, car elle n'a pas de compo visuel et on peut supposer qu'il est difficile de communiquer avec elle. Mais cet exemple démontre qu'il est quand même possible d'afficher des informations sur l'écran du PC.

Source / Exemple :


unit Unit1;
{Horloge sans Form par Caribensila}
interface

uses
  SysUtils, Classes, Windows, ImgList, Forms, Graphics, Controls;

type
    TDataModule1 = class(TDataModule)
    ImageList1: TImageList;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  DataModule1 : TDataModule1;
  CanvasEcran : TCanvas;
  Horloge          : TIcon;
  HandleEcran : THandle;

implementation
{$R *.dfm}

procedure AfficherHeure;
const
  Pi=3.1415926536;//inutile de mettre math dans les "uses"
var
  Hour,Min,Sec,MSec : Word;
  X, Y              : Int64;
  i, H              : Byte;
begin
  { Effacement des aiguilles de l'horloge à l'écran }
  CanvasEcran.Draw(Screen.Width-40,Screen.Height-70,Horloge);
  DecodeTime(Now,Hour,Min,Sec,MSec);
  { Affichage aiguille des heures }
  X:=Round( sin(2*pi*(((Hour Mod 12)/12)+(Min/720)) )*10);
  Y:=Round( cos(2*pi*(((Hour Mod 12)/12)+(Min/720)) )*10);
  CanvasEcran.MoveTo(Screen.Width-25,Screen.Height-55);//le centre de l'horloge.
  CanvasEcran.LineTo(Screen.Width-25+X,Screen.Height-55-Y);
  { Affichage aiguille des minutes }
  X:=Round(sin(2*pi*Min /60)*14); //14=taille de l'aiguille
  Y:=Round(cos(2*pi*Min /60)*14);
  CanvasEcran.MoveTo(Screen.Width-25,Screen.Height-55);
  CanvasEcran.LineTo(Screen.Width-25+X,Screen.Height-55-Y);
  { Carillon }
  if Min = 0 then begin
    if hour=0 then H:=12 else H:=Hour Mod 12;
    for i := 1 to H do begin
      Windows.Beep(130,100);
      sleep(1500);
    end;
  end;
end;

procedure TDataModule1.DataModuleCreate(Sender: TObject);
label
  Debut;
begin
  HandleEcran := GetWindowDC(0);{obtenir contexte graphique de l'écran}
  CanvasEcran := TCanvas.Create;{Un canvas pour le manipuler}
  CanvasEcran.Handle := HandleEcran;{Lier les deux}
  Horloge:=TIcon.Create;{icone de l'horloge sans aiguille}
  Unit1.DataModule1.ImageList1.GetIcon(0,Horloge);
  Application.Minimize;{pour possibilité stopper l'application}

  Debut : AfficherHeure;{           Une boucle            }
  sleep(60000);             {              sans fin,             }
  goto Debut;                {mais prudence avec goto!}
end;

procedure TDataModule1.DataModuleDestroy(Sender: TObject);
begin
  Horloge.free;
  CanvasEcran.Free;
  ReleaseDC(HandleEcran,0);
end;

end.

Conclusion :


Si vous lancez l'application depuis l'IDE de Delphi, pour l'arrêter il faut faire:
Exécuter | Réinitialiser le programme
En effet, il n'y a pas de Form! lol
Vous verrez que l'horloge est facile à dégommer. Si vous la masquez avec une fenêtre, l'icone disparait. Mais elle se réaffichera moins d'une minute plus tard.

Bonne prog à tous!

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.