Exemple d'application sans form

Soyez le premier à donner votre avis sur cette source.

Vue 8 295 fois - Téléchargée 796 fois

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

Ajouter un commentaire

Commentaires

Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
Bravo MAURICIO !

C'est ce que j'avais cherché pendant des heures! :s

Merci.
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Voilà comment on pourrait procéder avec un Timer:
Mettez un TTimer sur votre Datamodule!

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
Timer1.OnTimer(Nil);

While Not Application.Terminated Do
Application.ProcessMessages; // pour eviter que l' application ne se ferme : ]
end;

procedure TDataModule1.Timer1Timer(Sender: TObject);
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}
AfficherHeure;
end;

Le problème c' est que cette fois, même en faisant click droit/Fermer, bem l' application ne se ferme pas ...
jmp77
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
4 -
Hello caribensila,

Merci pour ce code très interessant qui pourra servir à du monde sur le site je pense.

Bonne prog,
JMP77.
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
Merci MAURICIO.
On peut sortir de l'appli en faisant un clic droit sur "Horloge", dans la barre des tâches... puis "Fermer".
En fait, c'est une appli qui devrait plutôt tourner en tâche de fond. Et si tu supprimes la ligne:
Application.Minimize;
elle tournera vraiment en tâche de fond...

Pour le Goto/Sleep , je n'ai aucun mérite. Je n'ai simplement pas su mettre en oeuvre un Timer dans une telle application sans Form :s
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Belle démonstration!
Bien vu le Goto/Sleep pour éviter le timer : )

2 petites remarques qu' en même:
- l' horloge disparait et il faut attendre 1 minute (max.) pour qu' elle s' affiche à nouveau. Ok, y a qu' a diminuer le sleep !!!
- Pas moyen de sortir du programme, si au moins il y avait un trayIcon ...

9/10 pour cette très belle démonstration.

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.